expect 是基於tcl 演變而來的,所以很多語法和tcl 類似,expect 是用來進行自動化控制和測試的工具。主要解決sheli指令碼中不可互動的問題。對於大規模的linux運維很有幫助
在linux運維和開發中,我們經常需要遠端登入伺服器進行操作,登入的過程是乙個互動的過程,可能會需要輸入yes/no,password等資訊。為了模擬這種輸入,可以使用expect指令碼
expect安裝
yum -y install tcl-devel
yum -y install
expect
send
:向程序傳送字串,用於模擬使用者的輸入, 該命令不能自動回車換行,一般要加\r(回車)
expect
:
expect的乙個內部命令,判斷上次輸出結果裡是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回,只能捕捉由spawn啟動的程序的輸出expect
spawn
:啟動程序,並跟蹤後續互動資訊 interact:執行完成後儲存互動狀態,把控制權交給控制台
● 單位是:秒 ● timeout -1 為永不超時 ● 預設情況下,timeout是10秒 set timeout 30:設定超時時間為30秒(預設的超時時間是 10 秒,通過 set 命令可以設定會話超時時間,
若不限制超時時間則應設定為-1)
exp_continue
:允許expect繼續向下執行指令meout:指定超時時間,過期則繼續執行後續指令
send_user
: 回顯命令,相當於echo $ar**引數陣列:expect指令碼可以接受從bash傳遞的引數,可以使用
[lindex $ar** n] 獲得,n從0開始,分別表示第乙個$1,第二個$2,第三個3……
引數
(3……引數 (
3……引數(
ar**n沒有空格則表示指令碼名稱 ; $ar** n有空格則代表下標) 一般流程:spawn 啟動追蹤 —> expect
匹配捕捉關鍵字 ——> 捕捉到將觸發send 代替人為輸入指令—> interact /expect eof
expect指令碼必須以interact或expect eof 結束,執行自動化任務通常expect eof就夠了
expect eof
:是在等待結束標誌。由spawn啟動的命令在結束時會產生乙個eof標記,expect eof 即在等待這個標記
示例一
注:該指令碼是expect指令碼,執行時不可以使用sh,可以直接./檔名.sh或者expect 檔名.sh。
#!/usr/bin/expect -f
puts "本地虛擬機器遠端登入指令碼"
#使用者名稱
set user root
#密碼set
passwd root
#終端伺服器ip
set host 192.168.52.2
#終端伺服器埠
set port 22
spawn ssh -l $user -p $port
$host
#在expect語句中,5s後超時,不再作出選擇(注 -1 永不超時)
settimeout 5
expect
#匹配到password時就傳送passwd\n到程序裡
"*assword"
}expect
"#"
send "df -h\n"
#send "exit\r" #如果使用expect eof結束,程式會自動退出遠端登入無需顯示執行。
#interact 執行完成後保持互動狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登入完成後會退出,而不是留在遠端終端上。
#expect指令碼必須以interact或expect eof 結束,執行自動化任務通常expect eof就夠了
#interact
expect eof
示例二
#!/bin/bash
#使用者名稱
user=root
#密碼passwd=root
#終端伺服器ip
host=192.168.52.2
#終端伺服器埠
port=22
/usr/bin/expect <<-eof
#spawn開啟乙個會話
puts "$passwd\r"
spawn ssh -l $user -p $port
$host
#在expect語句中,5s後超時,不再作出選擇(注 -1 永不超時)
settimeout 5
expect
#匹配到password時就傳送passwd\n到程序裡
"*assword"
}expect
"#"
send "df -h\n"
expect eof
eof
詳解 Windows下apache 實現 SSL
ssl 安全套接層,是netscape公司設計的主要用於web的安全傳輸協議。這種協議在web上獲得了廣泛的應用。通過證書認證來確保客戶端和 伺服器之間的資料是安全,過程大致如下 ssl客戶端在tcp連線建立之後,發出乙個訊息給伺服器,這個訊息裡面包含了自己可實現的演算法列表和其它一些需要的訊息,s...
centos apache下實現多站點SSL部署
最近發布了乙個go語言版的 抽了點時間弄了ssl,中間遇到了點坑,在這裡跟大家分享一下,教教大家如何實現多站點ssl部署。我這裡用的是centos apache實行,如果大家跟我一樣,可以嘗試。1 啟用ssl,首先我們需要為apache安裝mod ssl模組提供tls ssl功能,如果沒有,那就連線...
Python學習之路 socket實現ssh
服務端 sock server ssh import socket,os server socket.socket server.bind localhost 9999 server.listen while true print 接收新指令 conn,addr server.accept prin...