有些指令卻需要使用者手動去就互動如passwd、scp
對自動部署免去使用者互動很痛苦,expect能很好的解決這類問題。
expect的核心是spawn expect send set
spawn 調用要執行的指令
expect 等待指令提示資訊的出現,也就是捕捉使用者輸入的提示:
send 發送需要互動的值,替代了使用者手動輸入内容
set 設定變量值
interact 執行完成後保持互動狀态,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登入完成後會退出,而不是留在遠端終端上。
expect eof 這個一定要加,與spawn對應表示捕獲終端輸出資訊終止,類似于if....endif
expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就夠了。
設定expect永不逾時
set timeout -1
設定expect 300秒逾時,如果超過300沒有expect内容出現,則退出
set timeout 300
使用執行個體:
批量發送ssh秘鑰
allip=`nmap -v -sP 192.168.238.0/24|grep 192.168|grep -v "down"|grep -v 192.168.238.2 |cut -d " " -f5 2>/dev/null` 通過nmap掃描ip,擷取ip
[ ! -x /usr/bin/expect ] && yum install expect -y 判斷是否安裝了expect因為預設是沒有安裝的
下面就是一個循環了
for i in $allip;do
if [[ $i =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]];then
/usr/bin/expect <<EOF
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
expect {
"password" {send "redhat\n"}
}
expect eof
EOF