expect 是基於 Tcl 的自動化互動工具,能模擬人工輸入、等待特定提示並回應,廣泛用於 SSH 自動登入、SCP 自動傳檔、自動化部署腳本等場景。
| 指令 | 說明 |
|---|---|
spawn | 啟動子進程(如 ssh、ftp、telnet) |
expect | 等待輸出出現指定字串 |
send | 發送字串給子進程(需以 \r 結尾) |
interact | 將控制權交還使用者(保持連線) |
exp_continue | 繼續匹配下一個 expect 模式 |
set timeout | 設定等待超時秒數 |
#!/usr/bin/expect
set timeout 30
spawn ssh -l root 192.168.1.188
expect "password:"
send "abc123456\r"
interact
#!/usr/bin/expect:指定解釋器(必須為第一行)。set timeout 30:設定 30 秒超時。spawn ssh ...:啟動 ssh 進程,spawn 為 expect 內建指令。expect "password:":等待出現密碼提示。send "abc123456\r":發送密碼並送出 Enter(\r 關鍵)。interact:交還控制台,保持登入狀態。#!/usr/bin/expect -f
set timeout 30
spawn ssh -l root 192.168.1.188
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "abc123456\r" }
}
expect -re "](\$|#) "
send "bash /root/test.sh\r"
expect -re "](\$|#) "
send "exit\r"
expect { ... } 多分支匹配,處理首次連線的金鑰確認。exp_continue 讓「yes/no」分支匹配後繼續等待密碼提示。expect -re 使用正則匹配 Shell 提示符($ 或 #)。#!/bin/bash
expect -c "
spawn ssh root@192.168.1.188 \"ifconfig; whoami; pwd; echo hello;\"
expect {
\"*assword\" { set timeout 30; send \"abc123456\r\"; }
\"yes/no\" { send \"yes\r\"; exp_continue; }
}
expect eof
"
| 模式 | 優點 | 缺點 |
|---|---|---|
| 獨立 .expect 檔 | 結構清晰、易維護、支援複雜邏輯 | 需額外檔案、執行權限管理 |
| Bash 嵌入 -c | 單一檔案、方便整合既有腳本 | 跳脫字元複雜、除錯較難 |
ssh-copy-id),expect 僅作為無法部署金鑰環境的備案。700,限制擁有者讀寫執行。sshpass 替代簡單密碼傳遞場景。expect 能將重複性互動操作自動化,配合 cron 定時任務可實現無人值守維運。掌握其模式匹配與分支邏輯,是 Linux 自動化運維的核心技能之一。