互動式命令 expect

2021-09-07 02:39:01 字數 2303 閱讀 1683

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 ...