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

3

我已经在远程服务器上部署了一个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具有自己的shell和类似于>的提示符。当我分为两步进行时,它能正常工作。

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时,似乎存在一些关于 > 字符的编码问题。有任何想法如何处理这个问题吗?

敬礼 Patrik


@KamilCuk 看起来是ASCII编码,user@host:~$ file -bi netopeer_expect.sh text/plain; charset=us-ascii - patrik
2个回答

3

看起来当我运行ssh时,我做了一个错误的调用。我强制伪终端分配,它很好地完成了。

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

我正要建议这个。看起来那个命令行工具依赖于tty。 - glenn jackman
@pynexj 我不是很确定,我在没有使用-t选项时遇到了一些奇怪的提示错误。假设您在运行ssh时没有分配tty,这难道不会让您通过stdout和stdin运行所有内容吗?因此expect无法定位pty吗?还是我错了?感谢评论和反对意见,因为我很乐意学习更多关于这个问题的知识。 - patrik

3

经过一些调查,我发现为什么 ssh -tpatrik的回答 有影响。请参考以下示例:

enter image description here

根据 Expect 的手册

内部,spawn 使用一个 pty,与用户终端相同的方式进行初始化。

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

不使用 -t,ssh 将不会为远程会话分配 pty,而 expect 使用(默认的?)dumb tty,它是不完整的。作为“解决方法”,我们可以在 spawn 前显式设置 TERM 变量(例如 set env(TERM) vt100)。


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

[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] #

谢谢!我会将这个答案设为被采纳的答案,因为它比我的回答更完整。 - patrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接