#!/bin/bashshell
passwd='Abcd1234'windows
/usr/bin/expect <<-EOFbash
set time 30 執行超時時間 任何輸入30S後退出ssh
spawn ssh -p22 root@172.16.1.113ide
expect {spa
"*yes/no" { send "yes\r"; exp_continue }code
"*password:" { send "$passwd\r" }orm
}進程
expect "*#" 定義命令的開始字符串
send "echo test >>/root/d.txt\r" 發送要執行的命令
send "echo test >>/root/e.txt\r"
expect "*#"
send "exit\r"
interact 用exact這個指令是爲了把控制權交給用戶,代替send "logout\r" 終端不會斷開
expect eof
EOF
1. [spawn ssh -p22 root@172.16.1.113]
spawn是進入expect環境後才能夠執行的expect內部命令,若是沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。因此不要用 「which spawn「之類的命令去找spawn命令。比如windows裏的dir就是一個內部命令,這個命令由shell自帶,你沒法找到一個dir.com 或 dir.exe 的可執行文件。
它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。
2. [expect "password:"]
這裏的expect也是expect的一個內部命令,有點暈吧,expect的shell命令和內部命令是同樣的,但不是一個功能,習慣就行了。這個命令的意思是判斷上次輸出結果裏是否包含「password:」的字符串,若是有則當即返回,不然就等待一段時間後返回,這裏等待時長就是前面設置的30秒
3. [send "df\r"]
這裏就是執行交互動做,與手工輸入密碼的動做等效。
舒適提示: 命令字符串結尾別忘記加上「\r」,若是出現異常等待的狀態能夠覈查一下。
4. [interact]
執行完成後保持交互狀態,把控制權交給控制檯,這個時候就能夠手工操做了。若是沒有這一句登陸完成後會退出,而不是留在遠程終端上。若是你只是登陸過去執行
#!/usr/bin/expect #注意安裝的路徑,不肯定 whereis expect 一下
########################################################################################
#! /usr/local/bin/expect
set timeout 10
spawn sudo su - # 在expect 中用"spawn"關鍵字來調用命令「su - 」
expect
":" #//判斷上次輸出結果裏是否包含「:」的字符串,若是有則當即返回,不然就等待一段時間後返回,這裏等待時長就是前面設置的10秒
send
"123456\r"
#root密碼
expect
"#"
send
"cd /home/youruser\r"
#腳本所在的目錄
expect
"#"
send
"./autostart_root.sh\r"
#腳本運行
expect
"#"
send
"echo $?\r"
sleep
10
interact //操做完成。