Telnet:如何在发送时使用字符模式(交互模式)删除每个CR(0x0d)后的NULL(0x00)?

时间:2015-11-24 20:27:32

标签: linux console serial-port telnet tty

我正在使用我的开源串行到IP转换器(串行网络接口,SNI)使用ttyS0控制台与无头Slackware服务器进行通信。连接期间的SNI发送回Telnet命令集ff fb 01 ff fb 03。这将Telnet从Line模式转换为Char模式。但我注意到Telnet将我的CR按(0x0d)替换为(加)到两个字符0x0d 0x00。 Slackware的TTY本身不受此限制,但我在其下运行的一些命令,至少catmcedit不是。所以我尝试做以下事情:

  1. 在我的SNI中插入过滤器,这样它就会在方向IP-> Serial处丢弃NULL。它很有用,但它很难看,因为不再允许二进制传输了。
  2. 修改Telnet的源代码,将addind NULL删除到CR:

    inetutils-1.9.4/telnet/telnet.c  from line 2294:
            case '\r':
              if (!crlf)
            {
              NETADD ('\r'); <-- added
    //        NET2ADD ('\r', '\0'); <-- removed
            }
              else
            {
              NET2ADD ('\r', '\n');
            }
              bol = flushline = 1;
              break;
    
  3. 它也有效,所以我确保我能以正确的方式解决问题。 但由于多种原因,它也很丑陋,包括它非常不便携,并且要求我拥有自己的非标准telnet二进制文件。

    所以问题是:可以命令Telnet不要修改我的CR吗? (看看这个源代码片段,根本不可能使用原始代码,但我确信我会错过一些东西,这应该可以在没有修改源代码的情况下实现)。注意:将0x0d替换为0x0d,0x0a(这在代码中存在)将不适用于Linux TTY:它将此解释为两个CR。

    子问题是:在哪里使用0x0d + 0x00?我不知道任何硬件设备,电传打字机等,以及任何TTY,其中CR使用后为NULL。感谢。

2 个答案:

答案 0 :(得分:1)

所以我需要进行一些调查,看看如何正确解决这个问题,不要滥用软件,找到正确的工具,或者清楚地表明目前没有这样的工具。

首先,我展示了为什么我的设置完全如此,以及为什么它使用(或不使用)标准工具。

我的目标对于Linux世界来说非常普遍和必不可少(正如我之前想的那样)。因为Linux是网络操作系统,所以Linux盒子应该可以通过网络完全配置(因此在没有显示器的情况下可以/应该是完全有用的,即没有显示器)。但是当Lilo / Grub开始时,没有网络。此时只能使用串行端口(Lilo / Grub支持它)。为什么此时远程控制很重要?只是因为你可以(远程)为你的Slackware盒子编译新的自定义内核,并且想要测试它,在Lilo列表中添加第二个选项,并且想要在启动时远程机器卡住时返回到原始内核,所以没办法远程编辑/ agjust Lilo选项。

但串行控制台对于Linux机器来说确实是更强大的工具。 它显示启动消息并关闭无法通过ssh看到的消息,因为在这些时刻网络未初始化。 (请记住,我们没有显示)。 它允许您(突然或有意)丢弃所有网络接口,而不用担心丢失机器,距离您很远。

注意:串行控制台不会开箱即用,但可以用众所周知的标准方式进行配置,并在许多地方进行了描述。示例是http://docs.slackware.com/howtos:general_admin:serial_console

注意:串行端口应该被BIOS识别,即完全在板上。当Lilo / Grub启动时,USB和PCIE设备永远不会工作。幸运的是有一个好消息。硬件串口现在(慢慢)返回主板。我为我的服务器测试了新的现代华硕J1900I-C,它有两个rs232端口,一切正常。

要远程使用串行控制台的好处,应该使用某种SNI,串行网络接口(这是唯一的方法,AFAIK)。 SNI通常包含(最简单的)TCP侦听服务器和原始IP到串行双工转换器。当Lantronix X-Port发明时,我开始研究和使用SNI。那是在2006年,并且与Slackware盒子一起工作得很好。 (我不记得XPort是否存在\r\0问题,但让我们继续)。 XPort 昂贵,并且在Wiznet W5100发布时立即被我自己的开源SNI取代。 (真的,还有其他基本问题,为什么我需要更换Lantronix。它不能按主板上的Reset或Power按钮,而我的设备可以,现在即使在内核恐慌之后服务器也完全处于完全远程控制之下;但它在这里是offtopic)。如今在网上商店还有许多便宜的无名SNI;我不测试这些。

所有这些时间我都在使用telnet连接到SNI。主要原因是XPort文档有这样的例子。并且,大部分时间它都在工作;我不能说\r\0问题会阻止我的工作。大多数时候它根本不明显(例如,mc指挥官抵抗NULL&#39; s。但mcedit担心NULL。最近我开始抓住这个问题,所以这个问题就此结束了。 (现在请从线程开头重新阅读。)

现在我试着回答我自己的问题。所有这些时间我都误用了软件。 Telnet是 not 为人类交流而写的;相反,Telnet(突然)使用Telnet协议,而不是Raw协议;和\r\0可能是协议的一部分。 (可能,因为RFC没有说明任何地方对NULL的要求)。 虽然Telnet和Raw协议可能看起来非常接近,但它们并不匹配,因此有时应该可以工作但有时不能。 使用bruteforce并重新编译二进制文件,我表明Telnet可以很容易地转换为Raw模式;但在此之后它是非标准软件,并且它不可能被推向全球回购。

所以我搜索Raw utilites。 netcatncat没有Char模式,只有Line模式,因此只能使用纯控制台,没有ANSI颜色,mc,密码等。Putty太复杂并且使用GUI。并且......我找不到更多的用途!这很奇怪而且很烦人...... 然后我尝试使用最初基于字符的终端minicomgtkterm。它们都不允许Feed ip:port结构而不是ttyS*名称。但是存在数据转换器,我尝试socat。它连接到SNI服务器并创建虚拟串口;然后字符终端软件连接到该端口。

最后,工作。哇。  但是这个链条有很多缺点;复杂,难以记忆的命令,不能写成一行;当SNI丢弃TCP连接时,不可能看到/捕获它;在连接时socat向虚拟端口发出大量垃圾(457 数据包我计算!)。以下是勇敢的人可能会发现我的工作有用的命令。

sudo socat pty,link=/dev/ttyMYPORT,raw tcp:10.1.1.11:10001 &
then
sudo chmod a+rw /dev/ttyMYPORT; gtkterm -p /dev/ttyMYPORT
or 
sudo chmod a+rw /dev/ttyMYPORT; minicom -o --color=on -D /dev/ttyMYPORT

结论,我现在没有找到任何简单的软件,可以直接用于通过网桥在人机原始模式下与串口进行通信。 (请提出建议)。感谢。

答案 1 :(得分:0)

我相信您正在寻找的解决方案要高出几行:

if (!crlf)

如果我们设置crlf = true,那么我们会获得\r\n而不是\r\0。这可能会对猫和朋友起作用。

通过telnet来源,看来crlf是某种&#34;切换&#34;选项。查看man telnet和谷歌搜索,您似乎可以运行something like this

$ telnet
telnet> toggle crlf

...从那时起你就会收到\r\n