使用expect工具处理脚本以ssh到服务器列表中。运行时出现以下错误
./脚本
#!/usr/local/bin/expect -f
while /usr/bin/read hostname
do
spawn ssh user@$hostname
expect "user@$hostname's password"
send "resuidt\n"
expect "user@$hostname"
interact
done < srvlist
以下是我的错误:
missing operand at _@_
in expression "_@_/usr/bin/read"
(parsing expression "/usr/bin/read")
invoked from within
"while /usr/bin/read hostname"
(file "./script" line 3)
需要帮助来解决此错误。
答案 0 :(得分:1)
您正在编写一个Expect程序,它基本上是一个Tcl程序。您的while
循环不是Tcl syntax,但看起来像(Posix / Ksh / Bash / Zsh)-shell脚本。
您必须下定决心:在Tcl中编写所有内容,或将应用程序拆分为两个文件:一个(在shell脚本中)作为“主程序”,另一个单独的expect脚本将由shell脚本调用
答案 1 :(得分:0)
用户1934428表示您正在使用bash-while while循环语法。 下面是如何使expect脚本执行所需操作的一个示例。
#!/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 $user@$target
expect {
timeout {send_user "Expect Timeout\n" ; exit}
"password:"
}
send "$passwd\r"
expect {
timeout {send_user "Expect Timeout\n" ; exit}
"$user@$target"
}
interact
}
close $f
我在期望部分中包含了超时,因为我发现如果你不添加这些安全机制,即使没有正确的响应,期望脚本也可以继续。
答案 2 :(得分:0)
如果要将shell变量直接用于expect脚本,则必须将这些变量作为$ env(shell_variable_name)传递到expect脚本中
示例:spawn ssh $ env(myusername)@ $ env(hostname)