1、expect簡介shell
expect是一種簡單的基於Tcl的腳本語言工具,一個可實現自動交互功能的軟件套件,其功能就是進行自動化的人機交互;也可以按照腳本內容裏面設定的方式與交互式程序進行「會話」的程序,根據腳本內容expect能夠知道程序會提示或反饋什麼內容以及什麼是正確的應答;它是一種能夠提供「分支和嵌套結構」來引導程序流程的解釋型腳本語言。數組
shell功能雖然強大,可是不能實現有交互功能的多機器之間的操做例如ssh和ftp,而expect能夠幫助咱們來實現。bash
主要功能:實現自動登陸遠程機器並自動執行命令和shell腳本,結合定時任務能夠實現徹底自動化!
注意:使用不帶密碼的密鑰驗證也能夠實現該功能;但沒有密鑰就只能用遠程機器上的帳號和密碼!ssh
2、expect的安裝ide
安裝方式可採用源碼和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.i686oop
問題:說明缺乏tcl庫文件,須要安裝tcl軟件!spa
[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
orm
[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已經安裝成功!接口
3、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
4、簡單實例應用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 root@192.168.4.176 root@192.168.4.176'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!