需要在ssh脚本中进行修改

时间:2017-01-02 07:25:55

标签: shell expect

使用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)

需要帮助来解决此错误。

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)