Tự động hóa tương tác trong shell bằng công cụ expect

Để 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ệnhMô tả
spawnKhởi chạy tiến trình mới
expectChờ và khớp chuỗi đầu ra từ tiến trình
sendGửi dữ liệu vào tiến trình
interactChuyển quyền điều khiển lại cho người dùng
set timeoutThiết lập thời gian chờ (giây)
exp_continueTiếp tục chờ sau khi khớp
expect eofKế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.
  • spawn mở kết nối SSH.
  • expect đợi prompt nhập mật khẩu.
  • send gửi mật khẩu kèm ký tự xuống dòng \r.
  • interact giữ 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.

Thẻ: expect tcl shell-scripting ssh-automation linux-admin

Đăng vào ngày 27 tháng 6 lúc 02:16