bash telnet从expect获取标准输出

bash telnet从expect获取标准输出,bash,expect,at-command,Bash,Expect,At Command,我需要从telnet外壳获取数据集,为此,我查看了expect 这是我的预期脚本: /usr/bin/expect -d << EOD spawn telnet myhost log_user 1 set timeout 10 expect "Login:" send "user\n\r" expect "Password:" send "password\n\r" expect "*$*&q

我需要从telnet外壳获取数据集,为此,我查看了expect

这是我的预期脚本:

/usr/bin/expect -d <<  EOD
spawn telnet myhost
log_user 1
set timeout 10
expect "Login:"
send "user\n\r"
expect "Password:"
send "password\n\r"
expect "*$*"
send "AT\n\r"
expect "OK"
send "AT&CSR\n"
expect "OK"
send "AT!G=A6\n"
expect "OK"
send "AT^MI=0\n"
expect "OK"
send "AT^SX=0\n"
expect "OK"
send "AT^SR=0,1"
expect "*$*"
send "exit\r"
如果命令的结果与预期结果不匹配,它将转到下一个命令,是否有方法捕获响应结果

编辑:
我试图简化事情并添加交互,但没有运气:

 /usr/bin/expect -d <<  EOD
> spawn telnet myhost
> log_user 1
> interact"
> EOD
expect version 5.45.4
argv[0] = /usr/bin/expect  argv[1] = -d  
set argc 0
set argv0 "/usr/bin/expect"
set argv ""
executing commands from command file
spawn telnet myhost
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {11306}
invalid command name "interact""
    while executing
"interact""
/usr/bin/expect-d spawn telnet myhost
>日志用户1
>互动”
>排爆药
预期版本为5.45.4
argv[0]=/usr/bin/expect argv[1]=-d
设置argc 0
设置argv0“/usr/bin/expect”
设置argv“”
从命令文件执行命令
繁殖telnet myhost
父级:正在等待同步字节
家长:告诉孩子继续
父级:现在从子级取消同步
繁殖:返回{11306}
无效的命令名“交互”
执行时
“交互”

您发送AT命令的方式是错误的

根据,默认情况下,AT命令以
\r
(IRA 13-ASCII回车)字符[1]终止。有关详细信息,请参阅第4.1段-命令行

为了解决您的问题,只需发送
AT\r
而不是
AT\n\r
AT&CSR\r
而不是
AT&CSR\n
,以此类推(后者是您对下面的每个AT命令重复的错误)。否则AT解析器将无法正确识别您的命令


[1] 命令行终止字符可以通过
ATS3
命令自定义,语法如下:

ATS3=<value>
ATS3=

其中,
是新命令行终止字符的十进制ASCII值(默认值为13)。

这看起来很奇怪。当expect在发送AT后看到OK后,它会在\n\rOK再次看到。在交互方式下,是否会看到这样的双重结果?您的代码看起来很好(尽管惯用的expect将
\r
用作“按enter键”)“对于发送命令),我不确定它是否回答了您的问题(因此我现在不写完整的答案),但您发送AT命令的方式是错误的。它们以
\r
字符结尾,因此发送
AT\r
而不是
AT\n\r
AT&CSR\r
而不是
AT&CSR\n
等等(后者是您对每个AT命令重复的错误)。@RobertoCaboni我想把这个问题留给以后参考。
ATS3=<value>