expect是Unix系統中用來進行自動化控制和測試的軟件工具,由Don Libes製做,做爲Tcl腳本語言的一個擴展,應用在交互式軟件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等
yum install -y expectshell
自動遠程登陸ssh
#! /usr/bin/expect set host "192.168.226..130" set passwd "123456" spawn ssh root@$host expect { "yes/no" { send "yes\r"; exp_continue} "assword:" { send "$passwd\r" } } interact
運行腳本
chmod a+x 1.expect
./1.expect
備註,當初次ssh登錄時,會提示輸入yes或者no,所以須要發送一個yes,再回車。緊接着輸入帳戶的密碼。若是作了祕鑰認證,則不須要輸入密碼。interact 表示保持一個登錄狀態。不加的話,會立刻退出來。ide
自動遠程登陸後,執行命令並退出工具
#!/usr/bin/expect set user "root" set passwd "123456" spawn ssh $user@192.168.226.130 expect { "yes/no" { send "yes\r"; exp_continue} "password:" { send "$passwd\r" } } expect "]*" send "touch /tmp/12.txt\r" expect "]*" send "echo 1212 > /tmp/12.txt\r" expect "]*" send "exit\r"
備註:] 表示系統登錄進來,輸入光標前面的狀態提示符,root用戶爲]# 普通用戶爲]$,爲通配符。上面的腳本表示登錄進系統,在當前用戶目錄下,執行了兩條命令。測試
參數傳遞。至關於shell中的$1,$2,$3spa
#!/usr/bin/expect set user [lindex $argv 0] set host [lindex $argv 1] set passwd "123456" set cm [lindex $argv 2] spawn ssh $user@$host expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } expect "]*" send "$cm\r" expect "]*" send "exit\r"
備註:該腳本咱們定義了三個須要傳遞的參數,第一個爲要登錄機器的用戶名,第二個爲主機ip,第三個爲登錄系統之後須要發送的命令。所以當運行腳本時,須要加上這三個參數。
chmod a+x 3.expect
./expect root 192.168.226.130 ls
若是須要一次性發送多個命令能夠這樣寫「ls;w;ifconfig",或者在腳本中再定義幾個參數。code
同步文件 rsync的應用ip
#!/usr/bin/expect set passwd "123456" spawn rsync -av root@192.168.226.130:/tmp/12.txt /tmp/ expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } expect eof
備註:該腳本至關於直接執行了一個作遠程同步的rsync命令,區別是裏面嵌入了登錄密碼,所以能夠不須要和用戶交互直接完成文件的同步。expect eof 的做用是讓遠程鏈接保持一個狀態,不加的話會在同步未完成時,直接斷開。同步
指定host和要同步的文件it
#!/usr/bin/expect set passwd "123456" set host [lindex $argv 0] set file [lindex $argv 1] spawn rsync -av $file root@$host:$file expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } expect eof
備註:該腳本的功能是將本地文件同步到遠程主機上,定義了兩個參數,第一個是運程主機ip,第二個是要同步的文件名。該文件必須在本地存在,執行腳本時,該文件名參數要使用絕對路徑。chmod a+x 5.expect./5.expect 192.168.226.130 "/tmp/12.txt"