帶你見證expect的強大——全程自動化執行命令

痛點:

現在有兩臺Linux主機A和B,如何從A主機ssh到B主機,然後在B主機上執行命令,如何使這個過程實現全程自動化?你可能會使用這種方法:

ssh [email protected] "ls"

但是這種方式比較笨拙,每次都要輸入密碼,同時並不能執行一些複雜的邏輯或命令。那麼如何實現全程自動化呢?這就要用到今天這篇文章總結的expect了。

expect是什麼?

expect是一個免費的編程工具,用來實現自動的交互式任務,而無需人爲干預。說白了,expect就是一套用來實現自動交互功能的軟件。

在實際工作中,我們運行命令、腳本或程序時,這些命令、腳本或程序都需要從終端輸入某些繼續運行的指令,而這些輸入都需要人爲的手工進行。而利用expect,則可以根據程序的提示,模擬標準輸入提供給程序,從而實現自動化交互執行。這就是expect!!!

expect基礎

1.send 命令接收一個字符串參數,並將該參數發送到進程。
2.expect命令和send命令相反,expect通常用來等待一個進程的反饋,我們根據進程的反饋,再發送對應的交互命令。
3.spawn命令用來啓動新的進程,spawn後的send和expect命令都是和使用spawn打開的進程進行交互。
4.interact命令用的其實不是很多,一般情況下使用spawn、send和expect命令就可以很好的完成我們的任務;但在一些特殊場合下還是需要使用interact命令的,interact命令主要用於退出自動化,進入人工交互。比如我們使用spawn、send和expect命令完成了ftp登陸主機,執行下載文件任務,但是我們希望在文件下載結束以後,仍然可以停留在ftp命令行狀態,以便手動的執行後續命令,此時使用interact命令就可以很好的完成這個任務。

案例分析

就以上一篇文章批量添加主機爲例,我們通過zabbix—api接口批量添加了主機,但是還是沒有完成,需要在被監控主機上添加agent,如果一個個添加工作量很大,所以在這裏用上正好合適。

#!/bin/bash
user=linfan #主機用戶名
pass='linfan123' #主機密碼
for ip in `cat iplist.txt` #文件中放着需要執行命令的主機IP
do
  /usr/bin/expect << EOF
  set timeout 3  #鏈接超時3秒
  spawn scp /home/linfan/zabbix_xiufu.sh $user@$ip:/home/linfan/#將要執行的腳本傳到需要執行命令的主機
    expect {
        "(yes/no)" {send "yes\r"; exp_continue}#出現“yes/no”的字樣,就自動輸入“yes”其中exp_continue表示循環式匹配,通常匹配之後都會退出語句,但如果有exp_continue則可以不斷循環匹配,輸入多條命令,簡化寫法。
        "password:" {send "$pass\r"}#出現“password:”字樣,就自動輸入密碼
  }
  spawn ssh $user@$ip #遠程切換到執行命令的主機中
  expect {
        "password:" {send "$pass\r"}#出現“password:”字樣,就自動輸入密碼
  }
  expect "$user@*"  {send "sudo chmod 755 /home/linfan/zabbix_xiufu.sh\r";}#出現“用戶名@任何的”字樣 就給與腳本執行權限
  expect "$user@*"  {send "sudo /home/linfan/zabbix_xiufu.sh\r";}#出現“用戶名@任何的”字樣 就執行腳本
  expect "$user@*"  {send "exit\r"}##出現“用戶名@任何的”字樣 就退出
EOF
done
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章