我正在使用我的开源串行到IP转换器(串行网络接口,SNI)使用ttyS0控制台与无头Slackware服务器进行通信。连接期间的SNI发送回Telnet命令集ff fb 01 ff fb 03
。这将Telnet从Line模式转换为Char模式。但我注意到Telnet将我的CR按(0x0d)替换为(加)到两个字符0x0d 0x00
。 Slackware的TTY本身不受此限制,但我在其下运行的一些命令,至少cat
和mcedit
不是。所以我尝试做以下事情:
修改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;
它也有效,所以我确保我能以正确的方式解决问题。 但由于多种原因,它也很丑陋,包括它非常不便携,并且要求我拥有自己的非标准telnet二进制文件。
所以问题是:可以命令Telnet不要修改我的CR吗? (看看这个源代码片段,根本不可能使用原始代码,但我确信我会错过一些东西,这应该可以在没有修改源代码的情况下实现)。注意:将0x0d替换为0x0d,0x0a(这在代码中存在)将不适用于Linux TTY:它将此解释为两个CR。
子问题是:在哪里使用0x0d + 0x00?我不知道任何硬件设备,电传打字机等,以及任何TTY,其中CR使用后为NULL。感谢。
答案 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。
netcat
和ncat
没有Char模式,只有Line模式,因此只能使用纯控制台,没有ANSI颜色,mc,密码等。Putty
太复杂并且使用GUI。并且......我找不到更多的用途!这很奇怪而且很烦人......
然后我尝试使用最初基于字符的终端minicom
和gtkterm
。它们都不允许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
。