自動化運維腳本語言之expect實踐學習(1)

一、expect簡介

expect是一種簡單的基於Tcl的腳本語言工具,一個可實現自動交互功能的軟件套件,其功能就是進行自動化的人機交互;也能夠按照腳本內容裏面設定的方式與交互式程序進行“會話”的程序,根據腳本內容expect可以知道程序會提示或反饋什麼內容以及什麼是正確的應答;它是一種可以提供“分支和嵌套結構”來引導程序流程的解釋型腳本語言。

shell功能雖然強大,但是不能實現有交互功能的多機器之間的操作例如ssh和ftp,而expect可以幫助我們來實現。

主要功能:實現自動登錄遠程機器並自動執行命令和shell腳本,結合定時任務可以實現完全自動化!
注意:使用不帶密碼的密鑰驗證也可以實現該功能;但沒有密鑰就只能用遠程機器上的賬號和密碼!

二、expect的安裝

安裝方式可採用源碼和rpm包等安裝方式進行,在此以rpm包安裝爲例進行說明!
[root@expect-lab src]# cat /etc/issue
Red Hat Enterprise Linux Server release 6.2 (Santiago)
Kernel \r on an \m
[root@expect-lab src]# uname -a
Linux expect-lab 2.6.32-220.el6.i686 #1 SMP Wed Nov 9 08:02:18 EST 2011 i686 i686 i386 GNU/Linux
[root@expect-lab src]#ll
total 260

-rw-r--r-- 1 root root 262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
[root@expect-lab src]# rpm -ivh expect-5.44.1.15-5.el6_4.i686.rpm
warning: expect-5.44.1.15-5.el6_4.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
error: Failed dependencies: libtcl8.5.so is needed by expect-5.44.1.15-5.el6_4.i686

問題:說明缺少tcl庫文件,需要安裝tcl軟件!

[root@expect-lab src]# ll
total 2228
-rw-r--r-- 1 root root  262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
-rw-r--r-- 1 root root 2012712 Mar  7  2017 tcl-8.5.7-6.el6.i686.rpm

[root@expect-lab src]# rpm -ivh tcl-8.5.7-6.el6.i686.rpm
warning: tcl-8.5.7-6.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing...        ########################################### [100%]  
1:tcl                    ########################################### [100%]
[root@expect-lab src]# rpm -ivh expect-5.44.1.15-5.el6_4.i686.rpm
warning: expect-5.44.1.15-5.el6_4.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...            ########################################### [100%]  
1:expect                 ########################################### [100%]
[root@expect-lab src]# expect
expect1.1> exit                 
#說明expect已經安裝成功!

三、expect的使用說明

expect的核心命令是spawn expect send set
注意:只有在安裝expect後,進入expect環境後纔可以執行的expect內部命令!
spawn #調用要執行的命令或腳本
expect #等待命令提示信息的出現,也就是捕捉用戶輸入的提示
send #發送需要交互的值,替代了用戶手動輸入內容
set #設置變量值
interact #執行完成後保持交互狀態把控制權交給控制檯,這個時候就可以手工操作了;如果沒有這一句登錄完成後會退出,而不是留在遠程終端上!
expect eof #這個一定要加,與spawn對應表示捕獲終端輸出信息終止,類似於if....endif
注意:expect腳本必須以interact或expect eof結束,執行自動化任務通常以expect eof來表示腳本任務執行完畢!
常用語法設置:
set timeout -1 #設置expect永不超時
set timeout 300 #設置expect 300秒超時,如果超過300沒有expect內容出現則退出
exp_continue #繼續執行接下來的交互操作
$argv 參數數組 #使用[lindex $argv n]獲得從bash傳遞過來的參數(其中n從0開始...,分別表示第1個,第2個...參數)
cmd arg1 arg2 arg3 #說明:命令由空格分隔,cmd是命令名稱,其餘的是命令參數1,2,3
四、簡單實例應用1:

通過expect實現非交互ssh登錄,登錄後並將ifconfig獲取的信息重定向到文件
[root@expect-lab src]# ll
total 2232
-rw-r--r-- 1  root root  262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
-rwxr-xr-x 1  root root     264 Apr 18 05:06 ssh_exp
-rw-r--r-- 1  root root 2012712 Mar  7  2017 tcl-8.5.7-6.el6.i686.rpm
說明:當前目錄下在執行expect腳本之前沒有ip_information文件!

root@expect-lab src]# cat ssh_exp
#!/usr/bin/expect
set host "192.168.4.176" #設定遠程主機ip
set passwd "passwdstr" #設定ssh登錄遠程主機的密碼
spawn ssh root@$host #執行ssh登錄
expect #expect匹配用戶輸入信息
{
"yes/no" { send "yes\r"; exp_continue } #匹配到""裏的內容,發送yes換行並繼續
"password:"{ send "$passwd\r"; exp_continue } #匹配到""裏的內容,發送密碼換行並繼續
"#" { send "ifconfig \> /usr/local/src/ip_information\r" } #匹配到""裏的內容,發送ifconfig並重定向文件
}
expect eof #結束expect
[root@expect-lab src]# ./ssh_exp    
spawn ssh [email protected] 
[email protected]'s password:  
Last login: Thu Apr 18 05:07:11 2013 from networker.semico 
[root@expect-lab ~]# ifconfig > /usr/local/src/ip_information 
以上部分爲ssh_exp腳本自動執行的部分!

[root@expect-lab src]# ll

total 2236
-rw-r--r-- 1 root root  262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
-rw-r--r-- 1 root root     958 Apr 18 05:18 ip_information
-rwxr-xr-x 1 root root     264 Apr 18 05:06 ssh_exp
-rw-r--r-- 1 root root 2012712 Mar  7  2017 tcl-8.5.7-6.el6.i686.rpm
說明:當前目錄下在執行expect腳本之後自動生成了ip_information文件!

[root@expect-lab src]# cat ip_information  
eth0      Link encap:Ethernet  HWaddr 00:0C:29:04:49:6A             
inet addr:192.168.4.176  Bcast:192.168.4.255  Mask:255.255.255.0     
inet6 addr: fe80::20c:29ff:fe04:496a/64 Scope:Link           
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1           
RX packets:72659 errors:0 dropped:0 overruns:0 frame:0           
TX packets:38035 errors:0 dropped:0 overruns:0 carrier:0  collisions:0 txqueuelen:1000            
RX bytes:18140682 (17.3 MiB)  TX bytes:13117764 (12.5 MiB)           
Interrupt:18 Base address:0x2000
lo Link encap:Local
Loopback   inet addr:127.0.0.1  Mask:255.0.0.0           
inet6 addr: ::1/128 Scope:Host           
UP LOOPBACK RUNNING  MTU:16436  Metric:1           
RX packets:119051 errors:0 dropped:0 overruns:0 frame:0           
TX packets:119051 errors:0 dropped:0 overruns:0 carrier:0  collisions:0 txqueuelen:0            
RX bytes:55243096 (52.6 MiB)  TX bytes:55243096 (52.6 MiB)

說明:本實例通過一個較簡單的expect腳本實現了ssh自動非交互登錄並在登錄成功後將獲取的接口信息重定向到了文件ip_information!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章