二、expect概述
三、基本命令
四、expect語法
五、expect執行方式
前言● shell中通常將eof與 << 結合使用,表示後續的輸入作為子命令或子shell的輸入,直到遇到eof為止,再返回到主調shell。
可以把eof替換成其他東西,意思是把內容當作標準輸入傳給程式。
● 回顧一下< 《的用法。當shell看到< 《的時候,它就會知道下乙個詞是乙個分界符。在該分界符以後的內容都被當作輸入,直到shell又看到該分界符(位於單獨的一行)。這個分界符可以是你所定義的任何字串。
使用cat和eof多行輸入
cat >> /root/test.txt 《以上的指令碼命令是,在test.txt檔案後面加上三行**。
● expect是建立在tc|基礎.上的乙個工具,expect 是用來進行自動化控制和測試的工具。主要解決sheli指令碼中不可互動的問題。對於大規模的linux運維很有幫助
● 在linux運維和開發中,我們經常需要遠端登入伺服器進行操作,登入的過程是乙個互動的過程,可能會需要輸入yes/no,password等資訊。為了模擬這種輸入,可以使用expect指令碼
expect安裝
● 掛載光碟
● 製作本地yum源
● 執行安裝命令 yum -y install expect
send:向程序傳送字串,用於模擬使用者的輸入
● 該民工不能自動回車換行,一般要加\r(回車)
expect
● expect的乙個內部命令,判斷上次輸出結果裡是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回
只能捕捉由spawn啟動的程序的輸出expect
● expect的乙個內部命令,判斷上次輸出結果裡是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回
只能捕捉由spawn啟動的程序的輸出
spawn:啟動程序,並跟蹤後續互動資訊
interact:執行完成後儲存互動狀態,把控制權交給控制台
● 單位是:秒
● timeout -1 為永不超時
● 預設情況下,timeout是10秒
exp_continue
● 允許expect繼續向下執行指令meout:指定超時時間,過期則繼續執行後續指令
send_user
● 回顯命令,相當於echo
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-8sajtpm0-1575620870836)(1575424618483.png)]
流程:spawn 啟動追蹤 —> expect 匹配捕捉關鍵字 ——> 捕捉到將觸發send 代替人為輸入指令—> interact /expect eof
$ar**引數陣列
● expect指令碼可以接受從bash傳遞的引數,可以使用 [lindex $ar** n] 獲得,n從0開始,分別表示第乙個$1,第二個$2,第三個$3……引數
$ar**n沒有空格則表示指令碼名稱 ; $ar** n有空格則代表下標
expect指令碼必須以interact或expect eof 結束,執行自動化任務通常expect eof就夠了
● expect eof 是在等待結束標誌。由spawn啟動的命令在結束時會產生乙個eof標記,expect eof 即在等待這個標記
send命令不具備回車換行功能,一般要加 \r 或 \n
expect 「password:」
方式一:
expect 「aaa」
expect 「bbb」
expect 「ccc」
方式二:只要匹配了aaa或bbb或ccc中的任何乙個,執行了了相應的send語句後將會退出該expect語句
exoect
「bbb」
「ccc」
}方法三:exp_continue表示繼續後面的匹配,如果匹配了aaa,執行完send語句後還要繼續向下匹配bbb
exoect
「bbb」
「ccc」
}
-re引數表示匹配正規表示式
案例:ssh遠端免互動登入
[root@localhost ~]#vim a.sh
#!/usr/bin/expect //expect檔案路徑
set timeout 60
set hostname [lindex $ar** 0]
set password [lindex $ar** 1]
spawn ssh root@$hostname
expect
"*password"
}interact
[root@localhost ~]#chmod +x a.sh
[root@localhost ~]#./a.sh 192.168.100.100 123abc
[root@localhost ~]#vim a.sh
#!/bin/bash
hostname=$1
password=$2
set timeout 60
/usr/bin/expect<<-eof //載入expect檔案路徑
spawn ssh root@$
expect
"*password"
}expect "*]#" //匹配進入後的頁面
send "exit\r" //觸發退出
expect eof //等待結束
eof //expect結束標誌,eof前後不能有空格
[root@localhost ~]#chmod +x a.sh
[root@localhost ~]#./a.sh 192.168.100.100 123abc
[root@localhost ~]#vim b.sh
#!/bin/bash
user=$1
password=$2
useradd $user
expect<<-eof //載入expect檔案路徑
spawn passwd $user //開啟程序跟蹤passwd
expect
//匹配關鍵字並自動輸入密碼
"*password"
//匹配關鍵字並自動輸入密碼
}expect eof //等待結束
eof
[root@localhost ~]#chmod +x b.sh
[root@localhost ~]#./b.sh tom tom123
● 首次登入
● 正常登入
● 連線被拒絕,可能是ssh沒開,或者埠不對,或者防火牆限制
● 沒有連線位址
[root@localhost ~]#vim c.sh
#!/usr/bin/expect //expect檔案路徑
set timeout 20
set hostname [lindex $ar** 0]
set password [lindex $ar** 1]
spawn ssh root@$hostname
expect
"*password:"
}interact
exit
[root@localhost ~]#chmod +x a.sh
[root@localhost ~]#./c.sh 192.168.100.100 123abc
[root@localhost ~]#vim d.sh
#!/bin/bash
hostname=$1
expect<<-eof
spawn ftp $hostname
expect
"password"
}expect eof
eof[root@localhost ~]#chmod +x d.sh
[root@localhost ~]#./d.sh 192.168.100.100 //本機要開啟ftp,對方也要開啟
shell指令碼程式設計 變數初值處理 expect互動
shell指令碼程式設計 變數初值處理 expect互動 變數的初值 字串初值設定 語法結構 如果未定義變數的值,預設輸出word 如果定義了變數的值,輸出定義好的變數值 例項 建立乙個指令碼,實現,互動式的建立使用者和密碼,如果使用者未設定密碼,則預設密碼是123456 bin bash read...
FreeSwitch loglevel說明及設定
log級別是乙個0 7之間的整型,對應的值含義為 數字含義 0console 1alert 2crit 3err 4warning 5notice 6info 7debug 級別越高,列印的資訊越多。最少也得將級別設定為0,但不可能把它關閉掉!esl中的設定語法為 eslsetloglevel lo...
mysql欄位說明 MySQL欄位型別說明
mysql支援大量的列型別,它可以被分為3類 數字型別 日期和時間型別以及字串 字元 型別。本節首先給出可用型別的乙個概述,並且總結每個列型別的儲存需求,然後提供每個類中的型別性質的更詳細的描述。概述有意簡化,更詳細的說明應該考慮到有關特定列型別的附加資訊,例如你能為其指定值的允許格式。由mysql...