一、expect腳本運行順序
expect腳本是一個腳本語言,它可以讓你自動化執行交互式任務,比如執行ssh登錄、ftp上傳下載等。expect腳本的運行順序如下:
#!/bin/bash /usr/bin/expect <<EOF spawn ssh user@host expect "password:" send "password\r" expect "]#" send "command\r" expect "]#" send "exit\r" expect eof EOF
我們可以把expect語句看成是在模擬人類在命令行上的操作,比如輸入用戶名,密碼,然後執行命令,最後退出。expect腳本中最核心的命令是spawn和expect,前者是運行一個新的shell進程,並啟動一個交互會話;後者用來捕獲shell的輸出,判斷命令執行的狀態。
二、expect結束腳本
在很多情況下,我們需要判斷expect腳本是否執行成功。一種方法是通過expect eof判斷交互過程是否結束,如果結束那麼expect命令會返回0,否則會返回一個非零值。我們可以根據這個返回值來判斷是否執行成功。
#!/bin/bash /usr/bin/expect <<EOF spawn ssh user@host expect "password:" send "password\r" expect "]#" send "command\r" expect "]#" { send "exit\r" expect eof exit 0 } "Permission denied" { exit 1 } EOF
上面的例子中如果登錄成功,那麼expect會返回0,腳本退出;否則如果出現”Permission denied”,則expect會返回非零值,腳本也會退出。
三、shell腳本expect安裝
在很多Linux發行版中,expect命令並不會默認安裝。我們需要手動安裝才能使用。安裝方法如下:
sudo apt-get install expect
如果你的系統中沒有apt-get命令,那麼可以嘗試其他發行版的包管理器,比如yum,dnf,或者直接從源代碼編譯安裝。但這裡不再深入討論,可以參考expect官方文檔進行操作。
四、expect的用法
expect命令的基本用法如下:
expect "string" expect -exact "string" expect -glob "pattern" expect -re "regexp" expect { }
其中,-exact選項表示精確匹配,-glob選項表示通配符匹配,-re選項表示正則表達式匹配,而{}用來包含多個expect命令。在使用的時候,我們可以根據需要選擇不同的匹配方式,來準確匹配shell的輸出。
五、linux中expect
Linux系統中expect命令的使用非常廣泛,尤其是在自動化管理中。可以自動化執行ssh登錄、ftp上傳下載、telnet等各種任務。舉一個簡單的ssh登錄的例子:
#!/usr/bin/expect -f set timeout 20 set user [lindex $argv 0] set passwd [lindex $argv 1] set host [lindex $argv 2] set cmd [lindex $argv 3] spawn ssh $user@$host expect { "(yes/no)*" { send "yes\r" expect "*password:*" send "$passwd\r" } "*assword:*" { send "$passwd\r" } } expect "$*" send "$cmd\r" expect "$*" send "exit\r" expect eof
上面的expect腳本使用了spawn命令啟動一個新的ssh會話,並通過expect命令匹配輸出字符串,來輸入用戶名和密碼。其它的命令依然是通過send和expect命令來執行和捕獲。
六、expect命令如何使用
在實際使用中,expect命令有一下幾個基本步驟:
1、使用spawn命令啟動一個新的交互式會話。
2、使用expect命令匹配輸出字符串,並根據輸出字符串來輸入命令或者密碼。
3、使用send命令發送要執行的命令或者字符串。
4、使用expect命令匹配上一條命令的輸出,並進行相應的處理,比如判斷命令執行是否成功。
5、使用exit命令退出交互式會話,或者通過expect eof命令判斷會話是否結束。
七、linux expect用法
在Linux系統中,expect命令的應用非常廣泛,特別是在自動化管理中。我們可以使用expect腳本自動執行一些需要交互操作的命令,免去手動操作的繁瑣。比如,我們可以用expect來自動安裝一些軟件包:
#!/bin/bash #/media/site/update/expect/auto_sudo_gcc5.sh #use expect to automate entering password echo $0 function auto_sudo() { expect << EOF spawn sudo su - expect { "*password*" { send "$1\r" } } expect "*#" send "cd /media/site/program/gcc5\r" send "ls -lh\r" send "pwd\r" send "./install.sh\r" send "exit\r" expect eof EOF } auto_sudo "password"
上面的expect腳本可以自動安裝gcc5,並且自動輸入sudo密碼,免去了手動輸入密碼的繁瑣。
八、expect的用法shell
expect命令的用法非常靈活,我們可以根據不同的需求來選用不同的匹配方法。在實際使用中,我們也需要結合shell的一些特性來編寫expect腳本。比如,我們可以給expect命令設置超時時間,來避免卡頓問題:
#!/usr/bin/expect -f set timeout 20 spawn ssh user@host expect "Password:" send "password\r" expect { ")>" { send "command1\r" expect ")>" send "command2\r" expect ")>" send "exit\r" } timeout { puts "timeout" exit 1 } } expect eof
上面的expect腳本中我們使用了timeout命令來設定expect命令的超時時間。如果超時了,那麼會執行timeout後的腳本。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/183443.html