本篇文章給大家分享的是有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。