如何通过ssh从远程服务器运行Expect脚本?

时间:2019-06-11 13:06:29

标签: bash expect

我已经在远程服务器上部署了一个期望脚本,我希望通过ssh运行该脚本。

ssh user@host 'expect -d ./netopeer_expect.sh' (1)

user@host:~$ cat netopeer_expect.sh
#!/usr/bin/expect

set timeout 5
#spawn netopeer2-cli
spawn ./np2_multi_cli
expect ">"
send "listen --timeout 120\r"
expect "ru_id 0"
send "get-config -D=0 --source running --out /home/user/out.xml\r"
expect ">"
send "exit\r"
expect "$"

此代码运行netopeer2-cli的修改版本,我们将其称为./np2_multi_cli。此netopeer2-cli具有自己的外壳和类似>的提示。分两步操作时效果很好

ssh user@host
expect -d ./netopeer_expect.sh (2)

但是,消息

send "get-config -D=0 --source running --out /home/user/out.xml\r"

被剪切并发送为

send "-D=0 --source running --out /home/user/out.xml\r"

使用-d参数运行(1)后,我看到了这一点,

  

期望:“ \ u001b [6n”(spawn_id exp3)是否匹配全局模式“>”?否

当我尝试匹配第一个>时。相反,当我尝试运行(2)时,它看起来应该应该是

  

期望:“>”(spawn_id exp4)是否匹配全局模式“>”?是的

我运行bash,似乎关于>字符存在一些编码问题。知道如何处理吗?

BR 帕特里克

2 个答案:

答案 0 :(得分:3)

看起来好像我在运行ssh时打错了电话。我强制伪终端分配正常,

ssh -t -t erusim@147.214.83.188 'expect -d ./netopeer_expect.sh'

答案 1 :(得分:3)

进行了一些调查,找出了ssh -tpatrik's answer有所帮助的原因。请参见以下示例:

enter image description here

根据期望manual

  

在内部,spawn使用pty,初始化方式与用户的tty相同

使用-t,ssh将为远程会话分配一个pty(与本地$TERM相同的类型),然后expect分配一个相同类型的pty。

在没有-t的情况下,ssh不会为远程会话分配pty,并且expect使用(功能不全的tty)(默认值)dumb 。作为一种“解决方法”,我们可以在TERM之前显式设置set env(TERM) vt100变量(例如spawn)。


这是我使用的命令。只是为了方便复制和粘贴。

[STEP 101] # cmd=' "spawn -noe bash -c {echo TERM=\$TERM | grep --color TERM}; expect eof" '
[STEP 102] #
[STEP 103] # ssh 127.0.0.1 expect -c "$cmd"
TERM=dumb
[STEP 104] # ssh -t 127.0.0.1 expect -c "$cmd"
TERM=linux
Connection to 127.0.0.1 closed.
[STEP 105] #
[STEP 106] # cmd=' "set env(TERM) vt100; spawn -noe bash -c {echo TERM=\$TERM | grep --color TERM}; expect eof" '
[STEP 107] # ssh 127.0.0.1 expect -c "$cmd"
TERM=vt100
[STEP 108] #