2017-01-02 59 views
-1

我正在使用expect工具將腳本ssh寫入服務器列表。下面獲取時出錯運行它需要修改一個ssh腳本,寫在期望

./script

#!/usr/local/bin/expect -f 
while /usr/bin/read hostname 
do 
spawn ssh [email protected]$hostname 
expect "[email protected]$hostname's password" 
send "resuidt\n" 
expect "[email protected]$hostname" 
interact 
done < srvlist 

下面是我的錯誤:

missing operand at [email protected]_ 
in expression "[email protected]_/usr/bin/read" 
    (parsing expression "/usr/bin/read") 
    invoked from within 
"while /usr/bin/read hostname" 
    (file "./script" line 3) 

需要幫助解決這個錯誤。

回答

1

您正在編寫一個基本上是Tcl程序的Expect程序。您的while循環不是Tcl syntax,但看起來像(Posix/Ksh/Bash/Zsh)-shell腳本。

您必須下定決心:在Tcl中編寫所有內容,或將您的應用程序分爲兩個文件:一個(在shell腳本中)作爲「主程序」,另一個期望腳本,將由shell調用腳本。

+0

如何寫這樣的。任何參考例子都可能有幫助。 –

+1

「that」是什麼意思:Tcl-only解決方案還是混合外殼/ Tcl解決方案? – user1934428

0

由於user1934428表示您正在使用bash類while循環語法。 以下是如何使期望腳本執行所需操作的一個示例。

#!/usr/local/bin/expect -f 

set file hostname 
set user myusername 
set passwd mypassword 

set f [open $file] 
foreach target [split [read $f] "\n"] { 
    spawn ssh [email protected]$target 
    expect { 
    timeout {send_user "Expect Timeout\n" ; exit} 
    "password:" 
    } 
    send "$passwd\r" 
    expect { 
    timeout {send_user "Expect Timeout\n" ; exit} 
    "[email protected]$target" 
    } 
    interact 
} 
close $f 

我列入預期部分超時,因爲我發現,如果你不添加這些安全機制的expect腳本可以繼續即使沒有正確的應對。

如果您想直接使用shell變量到期望的腳本,那麼你必須通過expect腳本里面的變量$ ENV(shell_variable_name)

例如

0

:重生的ssh $ ENV(名爲myUsername)@ $ ENV(主機名)