Expect是創建在tcl基礎上的一個工具,Expect是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對於大規模的Linux運維頗有幫助
在Linux運維和開發中,咱們常常須要遠程登陸服務器進行操做,登陸過程是一個交互的過程,可能會須要輸入yes/no,password等信息。爲了模擬這種輸入,可使用Expect腳本。正則表達式
expect "password:" {send "mypassword\r";}shell
expect "aaa" {send "AAA\r"}
expect "aaa" {send "AAA\r"}
expect "aaa" {send "AAA\r"}數組
expect {
"aaa" {send "AAA\r"}
"bbb" {send "BBB\r"}
"ccc" {send "CCC\r"}
}bash
expect {
"aaa" {send "AAA\r";exp_continue}
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}服務器
SSH登陸
首次登錄
正常登陸
鏈接被拒絕,可能ssh沒開,或端口號不對,亦或是防火牆限制
沒有該鏈接地址運維
#!/usr/bin/expect //Expect二進制文件的路徑 #超時時間 set timeout 20 //20秒等待時間 log_file test.log //日誌文件 log_user 1 //日誌用戶 #參數傳入 set hostname [lindex $argv 0] //追加參數0,統計變量並加載第1位置參數 set password [lindex $argv 1] //追加參數1,統計變量並加載第2位置參數 #追蹤命令 spawn ssh root@$hostname //追蹤命令 #捕捉信息並匹配免交互執行 expect { //捕捉提示信息 "Connection refused" exit //捕捉到拒接鏈接信息即退出 "service not konwn" exit //捕捉到服務爲開啓信息即退出 "(yes/no)" // 捕捉yes或no參數 {send "yes\r";exp_continue} //輸入yes並繼續執行 "*password" // 捕捉參數 {send "$password\r"} //輸入密碼參數 } #控制權交予控制檯 interact //控制權轉交控制檯人爲輸入 [root@localhost ~]# ./expect.sh 192.168.109.132 baby520./ spawn ssh root@192.168.109.132 root@192.168.109.132's password: Last login: Thu Oct 10 16:52:48 2019 from 192.168.109.10 [root@localhost ~]#
#!/bin/bash user=$1 password=$2 #非交互命令放expect外面 useradd $user #開始交互 expect <<-EOF //Expect開始標誌,標準性輸入,等同於stdin spawn passwd $user expect "新的*" send "$password\r" expect "從新*" send "$password\r" expect eof; EOF //Expect結束語句,EOF先後不能有空格 [root@localhost ~]# ./expect.sh 192.168.109.132 baby520./ spawn ssh root@192.168.109.132 root@192.168.109.132's password: Last login: Thu Oct 10 17:38:16 2019 from 192.168.109.133 [root@localhost ~]# exit 登出 Connection to 192.168.109.132 closed.
建立自定義用戶,密碼自定義ssh
#!/bin/bash username=$1 password=$2 useradd $username /usr/bin/expect <<-EOF spawn passwd $username expect { "新的*" {send "$password\r";exp_continue} "從新*" {send "$password\r"} } EOF [root@localhost ~]# ./tom.sh test2 123123 spawn passwd test2 更改用戶 test2 的密碼 。 新的 密碼: 無效的密碼: 密碼少於 8 個字符 從新輸入新的 密碼: passwd:全部的身份驗證令牌已經成功更新。
利用expect完成FTP登陸過程ide
#!/usr/bin/expect -f set timeout 20 spawn ftp 192.168.109.133 expect "Name*" send "ftp\r" expect "Password:*" send "\r" expect "ftp>*" interact expect eof