CentOS与Windows中的Telnet控制字符行为

时间:2015-01-08 11:38:37

标签: telnet

我一直在使用旧的GSM网关,文档向我展示了如何通过telnet连接到设备以发送短信。我的计划是在我的CentOS服务器上编写一个expect脚本,可以在需要时发送简单的警报消息。

当我测试这个时,我使用Windows telnet客户端连接到PorTECH设备,我必须输入以下命令:

module1
#The following command tells the device to echo back received commands to the telnet client
ate1

at+cmgf=1

at+cmgs="07XXXXXXXXX"

> Message to be sent

CTRL-Z

在选择module1之后的任何时候你都可以按ctrl-x释放module1,这样可以正常工作。

此处使用

Ctrl-z 发送您输入的邮件。

我编写了一个期望脚本来处理这一系列事件,但是当发送 ctrl-z 消息时(我使用了\ 032,当我运行时,它在终端窗口中显示^ Z没有发生任何事情。

我有点困惑,所以我在CentOS中加载了telnet并自己完成了这些步骤。我注意到,当我按下 ctrl-x 来释放模块时,我必须有一个回车来观察命令,所以我尝试将它添加到我的脚本中(这没有帮助)。我还尝试运行上面提到的所有命令来发送短信,当它到达我按 ctrl-z 的部分输入后发送信息,即使我按照< kbd> ctrl-z 输入带回车符没有被观察到。

我也尝试使用-8标志运行telnet(我无法通过登录提示)和-7标志允许我登录,但没有克服 ctrl-z 输入结束。

我也试过加载telnet,运行&#34;切换本地聊天&#34;然后尝试通过 ctrl-z 给出相同结果的步骤。

我还看过一篇帖子,建议尝试切换选项&#34;和&#34;切换termdata&#34;这可以帮助诊断问题,但我不确定我在看什么,当我设置这些选项时,按下 ctrl-z 后出现以下内容:

^ZSENT IAC SUSP
SENT DO TIMING MARK

我不确定这意味着什么,或者如何检查它与Windows telnet操作的区别。任何人都可以建议为什么这个输入与在Windows telnet会话中按 ctrl-z 有不同的效果?

修改

据我所知,Microsoft telnet程序将相同的八进制值作为CentOS telnet程序发送到telnet服务器,所以我真的不明白为什么要按 ctrl- z 在Windows telnet中工作,但在CentOS telnet中无效...根据Zathrus在#centos irc频道的建议我也试过发送 ctrl-v 之前我的 ctrl-z (在脚本和简单的telnet中),并没有帮助......

进一步编辑

我今天一直在对此进行一些挖掘,我在我的Windows机器上运行了Wireshark,发现Windows发送的数据包为&#34;数据:\ 032&#34;正如预期的那样,但当我在我的CentOS机器上使用tcpdump的telnet会话捕获流量时,它会发送&#34;暂停当前进程&#34;以及&#34;做时间标记&#34;。

运行我编写的脚本而不是手动连接到telnet似乎发送相同的信息,无论我发送文字\ 032表达式它被翻译为&#34;暂停当前进程&#34;,在同样的数据包我也得到了在我期待的结尾发送的\ r \ n字符。

为了清楚起见,这是我用来发送消息的脚本:

#!/usr/bin/expect
# Test script for SMS sends automatically via expect & telnet

#Set a sensible timeout

set timeout 20

#Our target device

set target 10.0.0.114

#set username and password info for SMS sending

set user voip
set pword 1234



#spawn the telnet session

spawn telnet $target

#Set up the expects fo the login process

expect "username:"

send "$user\n"

expect "password:"

send "$pword\n"


#I've only put a SIM in module1 so far

expect "]"

#check state1 for free, make sure it isn't in use already, exit if returns none

send "state1\n"

expect {
  "free" { send "module1\n" }
  "none" { send "logout\n" }
}

expect "got!! press 'ctrl-x' to release module 1." { send "ate1\n" }

expect "0" { send "at+cmgf=1\n" }

expect "0" { send "at+cmgs=\"07XXXXXXXXX\"\ntesting\032\015\012\n" }

#this should be the ctrl-z input as per http://www.unix-manuals.com/refs/misc/ascii-table.html
#send "\032"

interact

我还尝试在打开telnet并在打开与GSM网关的连接之前提交toggle localchars命令后运行捕获,此捕获还显示发送的数据是&#34;暂停当前进程&#34;然后是&#34; Do Timing Mark&#34;

我还能做什么来发送文字\ 032表达式而不解释它?

进一步编辑:

以下是来自Windows和Linux Telnet会话的捕获数据包

这是为Windows telnet会话捕获的十六进制,该数据包在Wireshark中显示为&#34;数据:\ 032&#34;

0000   00 03 7e 00 44 4f 30 85 a9 0e a6 52 08 00 45 00  ..~.DO0....R..E.
0010   00 29 3d 0b 40 00 80 06 b1 32 0a 00 f8 1f 0a 00  .)=.@....2......
0020   00 72 10 02 00 17 cf 41 a8 01 b0 3e 52 22 50 18  .r.....A...>R"P.
0030   f9 1d 06 5f 00 00 1a                             ..._...

这是为Linux telnet会话捕获的十六进制,在Wireshark中显示为&#34;暂停当前进程&#34;然后&#34;做时间标记&#34; :

0000   00 03 7e 00 44 4f 00 16 35 37 74 22 08 00 45 10  ..~.DO..57t"..E.
0010   00 2d 08 43 40 00 40 06 13 c6 0a 00 0a 41 0a 00  .-.C@.@......A..
0020   00 72 b1 46 00 17 b8 b3 01 36 a9 22 f2 7e 50 18  .r.F.....6.".~P.
0030   39 08 1e d2 00 00 ff ed ff fd 06                 9..........

1 个答案:

答案 0 :(得分:1)

没有足够的代表发表评论

你知道吗,(转义是八进制的)行结尾

  • Windows是CR + LF(\ 015 \ 012)
  • Linux只是LF(\ 012)

CTRL-X 之后,你必须在每次执行的命令后输入 RETURN 吗?

如果是这样的话,网关会遇到所有已发送字符串的串联,尝试不恰当地解析它们作为单个命令(来自您的CentOS [因此Linux]机器)