在expect上生成ssh时出现的问题({$ var} vs.“$ var”)

时间:2017-06-15 13:33:10

标签: linux ssh tcl expect

我有一个期望脚本,到目前为止工作正常...它在现有的ssh隧道上产生一个ssh会话,如下所示:

spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o {ProxyCommand=nc -X 5 -x localhost:8888 %h %p} "$user_ip"

$user_ip具有用户名和目标IP,正如ssh所期望的那样,如username@IP

问题是有时候,另一个ssh隧道正在使用端口8888,每次发生这种情况时我都要调整代码并更改隧道端口。

所以,我试图在变量中发送端口,以避免一直触摸代码。 我从命令行获取隧道端口,如下:

set proxy_port [lindex $argv 2]

然后

spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o {ProxyCommand=nc -X 5 -x localhost:"$proxy_port" %h %p} "$conn"

我看到proxy_port变量已正确设置,但当脚本尝试生成ssh时,我得到:

 spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o {ProxyCommand=nc -X 5 -x localhost:8888 %h %p}  USERID@10.0.0.1
command-line line 0: garbage at end of line; "-o".
send: spawn id exp5 not open
    while executing
"send "$pwd\r""
    (file "./amm-qev.new.exp" line 36)

在上面的错误中,我看到端口已正确替换,但它抱怨ssh语法。

我的弱眼没有抓到是什么问题?

1 个答案:

答案 0 :(得分:2)

Tcl的{...}语法与shell中的单引号字符串('...')类似,$var不会展开。你应该使用双引号。

spawn ssh -o UserKnownHostsFile=/dev/null \
          -o StrictHostKeyChecking=no \
          -o "ProxyCommand=nc -X 5 -x localhost:$proxy_port %h %p" \
          "$conn"