本篇文章給大家分享的是有關(guān)Shell編程中Expect免交互的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了分宜免費(fèi)建站歡迎大家使用!
Expect是建立在tcl基礎(chǔ)上的一個(gè)工具,Expect是用來(lái)進(jìn)行自動(dòng)化控制和測(cè)試的工具。主要解決shell腳本中不可交互的問(wèn)題。對(duì)于大規(guī)模的Linux運(yùn)維很有幫助
在Linux運(yùn)維和開發(fā)中,我們經(jīng)常需要遠(yuǎn)程登錄服務(wù)器進(jìn)行操作,登錄過(guò)程是一個(gè)交互的過(guò)程,可能會(huì)需要輸入yes/no,password等信息。為了模擬這種輸入,可以使用Expect腳本。
該命令不能自動(dòng)回車換行,一般要加\r(回車)
expect的一個(gè)內(nèi)部命令,判斷上次輸出結(jié)果里是否包含指定的字符串,如果有則立即返回,否則就等待超時(shí)時(shí)間后返回
只能捕捉由spawn啟動(dòng)的進(jìn)程的輸出
單位是:秒
timeout -1 為永不超時(shí)
默認(rèn)情況下,timeout是10秒
允許expect繼續(xù)向下執(zhí)行指令
回顯命令,相當(dāng)于echo
Expect腳本可以接受從bash傳遞的參數(shù),可以使用[lindex $argv n]獲得,n從0開始,分別表示第一個(gè),第二個(gè),第三個(gè)...參數(shù)
expect eof是在等待結(jié)束標(biāo)志。由spawn啟動(dòng)的命令在結(jié)束時(shí)會(huì)產(chǎn)生一個(gè)eof標(biāo)記,expect eof即在等待這個(gè)標(biāo)記
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沒(méi)開,或端口號(hào)不對(duì),亦或是防火墻限制
沒(méi)有該連接地址
#!/usr/bin/expect //Expect二進(jìn)制文件的路徑 #超時(shí)時(shí)間 set timeout 20 //20秒等待時(shí)間 log_file test.log //日志文件 log_user 1 //日志用戶 #參數(shù)傳入 set hostname [lindex $argv 0] //追加參數(shù)0,統(tǒng)計(jì)變量并加載第1位置參數(shù) set password [lindex $argv 1] //追加參數(shù)1,統(tǒng)計(jì)變量并加載第2位置參數(shù) #追蹤命令 spawn ssh root@$hostname //追蹤命令 #捕捉信息并匹配免交互執(zhí)行 expect { //捕捉提示信息 "Connection refused" exit //捕捉到拒接連接信息即退出 "service not konwn" exit //捕捉到服務(wù)為開啟信息即退出 "(yes/no)" // 捕捉y(tǒng)es或no參數(shù) {send "yes\r";exp_continue} //輸入yes并繼續(xù)執(zhí)行 "*password" // 捕捉參數(shù) {send "$password\r"} //輸入密碼參數(shù) } #控制權(quán)交予控制臺(tái) interact //控制權(quán)轉(zhuǎn)交控制臺(tái)人為輸入 [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開始標(biāo)志,標(biāo)準(zhǔn)性輸入,等同于stdin spawn passwd $user expect "新的*" send "$password\r" expect "重新*" send "$password\r" expect eof; EOF //Expect結(jié)束語(yǔ)句,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.
創(chuàng)建自定義用戶,密碼自定義
#!/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 的密碼 。 新的 密碼: 無(wú)效的密碼: 密碼少于 8 個(gè)字符 重新輸入新的 密碼: passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。
利用expect完成FTP登錄過(guò)程
#!/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免交互的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:Shell編程中Expect免交互的示例分析
鏈接地址:http://jinyejixie.com/article38/ijddpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、電子商務(wù)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)公司、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)