shell腳本之expect語句

在編寫shell腳本時,咱們可能會遇到一些交互式的狀況,如passwd、ssh等等腳本時,經常須要手動進行交互。這樣,本來爲了實現自動部署的腳本顯得有些不大方便,這時你就會用上expect命令了。expect命令能夠幫你把交互式命令變成非交互式。shell


expect 有期待、指望的中文意思。正如它的中文意譯同樣,它的做用就是幫你將期待的「答案」在交互時幫你加上去。固然,這個答案須要你本身去編寫。ssh


shell中expect的相關命令:set(設置) 、spawn(引用)、expect(期待)、send(發送)ide


set後接設置的變量值spa

例:set timeout 180 ;  設置180秒超時,即3分鐘沒有expect內容就退出腳本。blog


spawn後接要執行的命令,即交互式命令(可調用循環語句)部署

例:passwd tom;給tom設置密碼it


expect後接須要捕捉交互時的關鍵字,這裏的關鍵字指的是執行完交互式命令後出現的惟一關鍵字。例如上述passwd tom,在Linux中執行後,會在交互行出現惟一關鍵字「密碼:」,在進行消息的第一次交互後,又會在第二次交互行出現惟一關鍵字「從新」。class

image.png


send後接須要交互的值,即對交互時的問題的回覆答案。例如前面的例子中對passwd tom的回答,即用戶設置的密碼,這裏以123爲例登錄

send 「123\n」  (注:\n爲回車鍵)變量

expect和send一般放到一塊兒使用,交互就是一問一答,expect對交互時「問」的關鍵字捕捉就充當了一個「問」的角色,而send則是扮演了「答」的角色。


interact是expect命令完成後保持交互狀態若是。


expect eof是expect命令的結束語,它和expect的關係就像if和fi,case和esac,while和done的關係,固然也能夠用interact做爲結束語。


注:如下是腳本中的expect的命令格式,由於沒有循環體命令因此沒有用上interact命令。expect命令是存放在/usr/bin/expect中,因此在腳本中,咱們這裏使用重定向的方式使用expect命令。expect  eof命令必定要加在expect語句末尾。

image.png

舉個切合實際的例子,在經過ansible管理多臺同網段的主機前,須要先部署ssh的免密碼登陸,假設它們的密碼都爲0,具體腳本以下:

image.png

固然,也能夠經過expect實現交互生成公鑰私鑰對,不過相對麻煩。


本人Linux萌新一枚,若有錯誤,歡迎指正。

相關文章
相關標籤/搜索