我必须使用 expect 和 ssh 来自动执行远程shell(在我的特定情况下,本地和远程 bash shell)。也就是说,我需要将ssh someuser@example.com "echo This is \$(hostname)"
包装在expect
脚本中。
运行上面的“手动”脚本,我得到了预期的输出:This is example.com
,因此在远程机器上评估$(hostname)
表达式(命令替换)。 / p>
现在我将ssh-remote-shell命令包含在expect
此处文档中:
#/bin/bash
expect <<- DONE
spawn ssh someuser@example.com "echo This is \\$(hostname)"
DONE
包装的脚本返回[...] This is localhost
。因此,$(hostname)
表达式在我的本地计算机上进行评估,而不是在远程计算机上进行评估。
我尝试过不同级别的反斜杠转义,单引号和双引号<<- DONE
和<< DONE
,并将$(hostname)
移动到自己的 expect 变量(即set someCommand "\\$hostname"
,然后引用$someCommand
)。但没有任何帮助。
如何让远程shell在SSH expect 脚本中评估shell表达式?
答案 0 :(得分:2)
你快到了。
SO
输出
#!/bin/bash
expect <<- DONE
set timeout 120
spawn ssh dinesh@remote-lab "echo This is \\\$(hostname)"
expect {
"password: $" {send "welcome\r";exp_continue}
eof
}
DONE
注意: dinesh@myPC:~/stackoverflow$ ./abdull
spawn ssh dinesh@remote-lab echo This is $(hostname)
dinesh@remote-lab's password:
This is remote-lab
语句也可以写为
spawn