您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Shell編程中Expect免交互的示例分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Expect是建立在tcl基礎上的一個工具,Expect是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對于大規模的Linux運維很有幫助
在Linux運維和開發中,我們經常需要遠程登錄服務器進行操作,登錄過程是一個交互的過程,可能會需要輸入yes/no,password等信息。為了模擬這種輸入,可以使用Expect腳本。
該命令不能自動回車換行,一般要加\r(回車)
expect的一個內部命令,判斷上次輸出結果里是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回
只能捕捉由spawn啟動的進程的輸出
單位是:秒
timeout -1 為永不超時
默認情況下,timeout是10秒
允許expect繼續向下執行指令
回顯命令,相當于echo
Expect腳本可以接受從bash傳遞的參數,可以使用[lindex $argv n]獲得,n從0開始,分別表示第一個,第二個,第三個...參數
expect eof是在等待結束標志。由spawn啟動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記
expect "password:" {send "mypassword\r";}
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"}
}
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.
創建自定義用戶,密碼自定義
#!/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登錄過程
#!/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
以上就是Shell編程中Expect免交互的示例分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。