shell儘管很強大。但是貌似無法完成互動式命令的操作,例項 ssh host 如果host而且該機沒有加入信任。手動輸入的時間需要password。
這樣的情況下可以使用expect支援。
下面舉個樣例來說明expect的功能與使用:
功能:對集群各機器執行同樣指令 如 集群ip 為 :192.168.6.1~192.168.6.10。須要在這10臺機器上 同一時候 以tt使用者登入 並執行 mkdir ttji_314命令。
首先 定義乙個hostlist檔案 :
192.168.6.1
192.168.6.2
192.168.6.3
192.168.6.4
192.168.6.5
192.168.6.6
192.168.6.7
192.168.6.8
192.168.6.9
192.168.6.10
然後定義乙個 expect指令碼 完畢在單個機器執行命令:ssh_comm.sh
#!/usr/bin/expect
set host [lindex $argv 0]
set command [lindex $argv 1]
set password 123456
set username tt
set timeout 1
send_user "connect to $host ...\n"
spawn ssh -l $username $host
expect "password:"
send "$password\r"
expect "#$"
send "$command\r"
expect "#$"
send "exit\r"
#interact
expect eof
幾點說明 :
1 首行加上/usr/bin/expect
2 spawn: 後面加上須要執行的shell 命令
3 expect: 僅僅有spawn 執行的命令結果才會被expect 捕捉到,由於spawn 會啟
動乙個程序,僅僅有這個程序的相關資訊才會**捉到。主要包含:標準輸入的提
示資訊,eof 和timeout。
4 send 和send_user:send 會將expect 指令碼中須要的資訊傳送給spawn 啟動
的那個程序,而send_user 僅僅是回顯使用者發出的資訊,類似於shell 中的echo 而
已。
5.set timeout 1之後的指令將都等待1s。
最後完畢批量功能:command_all.sh
#!/bin/bash
function use()
if [ $# != 2 ]
then
useelse
echo "welcome to use:\n"
fifile=$1
command=$2
echo $file
echo $command
while read line
do #echo $line
./ssh_comm.sh $line "$command"
done < $file
使用:
./command_all.sh hostlist "mkdir ttji_314"
有個問題:當在expect指令碼中 使用root使用者登入的時候 似乎沒有timeout這樣的概念 ,執行完命令馬上返回;
而用普通使用者才會有這樣的體現。
自動互動式指令碼 expect簡介
我們經常會遇到一些需要與伺服器程式打交道的場景,比如,從登陸某個伺服器,然後進行某項工作。這很平常,但是如果把這個工作自動化進行,你就需要乙個程式能自動做你要告訴機器的事情,這樣,我們的expect就能大顯身手了。首先,expect是乙個簡單的工具語言,如要工作就是進行自動化的人機互動。它的作者對e...
Expect 非互動式控制工具
1 一般需要安裝才能用 yun install y expect 2 是一種免費的非互動式工具 當執行有些命令還需我們輸入寫東西才能執行成功的就屬於互動式,例如 yum install 不加 y 時,我們還要輸入y才能安裝,就屬於互動式。3 基本引數 1 定義expect指令碼執行的shell us...
Expect自動化互動式程式
expect是乙個用來實現自動互動功能的軟體套件,是基於tcl的指令碼程式設計工具語言 首先 要安裝expect 直接使用yum安裝即可 yum install expect y每次我們進行ssh連線時都需要輸入密碼 而且首次需要輸入yes來確認 root alice ssh p 22 jenny ...