2

在执行时

$expect filename.exp user pwd ip

我得到了错误

无法执行“ssh -l user ip”:没有这样的文件或目录

的内容filename.exp是这样的:

#!/opt/sfw/bin/expect -D

set OMC_Usr  [lindex $argv 0]
set OMC_Pwd  [lindex $argv 1]
set OMC_IP  [lindex $argv 2]

set cmd "ssh -l $OMC_Usr $OMC_IP"
spawn $cmd
expect "Password:"
send "$OMC_Pwd\r"
interact

帮我继续
谢谢...

4

1 回答 1

3

问题是spawn需要将命令及其参数作为多个 Tcl 参数传递给它,就像标准 Tclexec命令一样。解决方法是直接执行此操作:

spawn ssh -l $OMC_Usr $OMC_IP

或者,如果您愿意(并且您拥有 Tcl 8.5):

set cmd "ssh -l $OMC_Usr $OMC_IP"
spawn {*}$cmd

或者,如果您有 8.4 或更低版本:

eval spawn [lrange $cmd 0 end]

要这样做:

eval spawn $cmd

因为如果您在用户名(或 IP 地址,但这不太可能)中有 Tcl 元字符,这将意外中断。


当然,真正的解决方法是设置一个 RSA 密钥对并使用ssh-agent它来管理它。像这样,您不需要在任何命令行上传递密码;这很重要,因为进程的命令行是有关该进程的公共信息。真的。你可以用一些微不足道的东西ps -efww(或你的操作系统的等价物)找到它。环境变量也同样不安全;也可以选择ps显示它们。

于 2010-09-17T08:11:27.737 回答