Để thực hiện các tác vụ cần nhập liệu tương tác như đăng nhập SSH hay chuyển quyền người dùng, ta có thể sử dụng expect — một công cụ tự động hóa dựa trên ngôn ngữ Tcl.
Cài đặt expect
Kiểm tra xem hệ thống đã cài Tcl chưa:
whereis tcl
Nếu chưa có, cài cả Tcl và expect qua trình quản lý gói:
yum install -y tcl expect
Xác nhận đường dẫn cài đặt của expect:
command -v expect
# Kết quả thường là: /usr/bin/expect
Các lệnh cơ bản trong expect
| Lệnh | Mô tả |
|---|---|
spawn | Khởi chạy tiến trình mới |
expect | Chờ và khớp chuỗi đầu ra từ tiến trình |
send | Gửi dữ liệu vào tiến trình |
interact | Chuyển quyền điều khiển lại cho người dùng |
set timeout | Thiết lập thời gian chờ (giây) |
exp_continue | Tiếp tục chờ sau khi khớp |
expect eof | Kết thúc khi tiến trình con đóng |
Nguyên lý hoạt động
Một kịch bản mẫu để đăng nhập SSH tự động:
#!/usr/bin/expect
set timeout 25
spawn ssh -l admin 192.168.1.100
expect "password:"
send "myp@ssw0rd\r"
interact
- Dòng đầu tiên chỉ định trình thông dịch.
spawnmở kết nối SSH.expectđợi prompt nhập mật khẩu.sendgửi mật khẩu kèm ký tự xuống dòng\r.interactgiữ phiên làm việc để người dùng tiếp tục thao tác.
Ví dụ nâng cao
Thực thi nhiều lệnh liên tiếp
#!/usr/bin/expect -f
set timeout 15
spawn su - operator
expect "Password:"
send "secret123\r"
expect "$ "
send "whoami\r"
send "uptime\r"
send "exit\r"
expect eof
Gọi expect từ trong bash script
#!/bin/bash
HOST="192.168.1.100"
USER="deploy"
PASS="securePass"
/usr/bin/expect <<SCRIPT
set timeout 20
spawn ssh $USER@$HOST "free -h && hostname"
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$PASS\r" }
}
expect eof
SCRIPT
Xử lý lỗi "spawn not found"
Lỗi này xảy ra khi chạy script bằng sh script.exp thay vì cấp quyền thực thi và gọi trực tiếp:
chmod +x script.exp
./script.exp
Vì dòng shebang #!/usr/bin/expect sẽ bị bỏ qua nếu gọi qua sh, dẫn đến không nhận diện được các lệnh nội bộ của expect.