我已经在远程服务器上部署了一个期望脚本,我希望通过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 帕特里克
答案 0 :(得分:3)
看起来好像我在运行ssh时打错了电话。我强制伪终端分配正常,
ssh -t -t erusim@147.214.83.188 'expect -d ./netopeer_expect.sh'
答案 1 :(得分:3)
进行了一些调查,找出了ssh -t
对patrik's answer有所帮助的原因。请参见以下示例:
根据期望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] #