我正在为redhat linux机器上的串行设备创建TCP / IP接口。使用bash脚本中的netcat来解决这个问题。
nc -l $PORT < $TTYDEVICE > $TTYDEVICE
问题是串行设备在其响应中对行结束使用回车符('\ r')。我想将其转换为(“\ r \ n”),因此windows机器telneting可以毫无困难地查看响应。我试图用一个简单的bash解决方案来弄清楚如何解决这个问题。我也可以访问stty来配置串行设备,但输入端没有“\ r”到“\ r \ n”翻译(据我所知)。
我确实尝试在netcat的输入端使用tr,但它没有用。
#cat $TTYDEVICE | tr '\r' '\r\n' | nc -l $PORT > $TTYDEVICE
有什么想法吗?
答案 0 :(得分:2)
你的问题是,连接到$ PORT的客户端可能没有关于它在另一端使用tty的线索,因此您将遇到特定于tty的“功能”的问题,例如^ C / ^ d /等。和CRLF。
这就是为什么
socat tcp-listen:1234 - | hexdump -C
telnet localhost 1234
[enter text]
将显示CRLF,而
ssh -t localhost "hexdump -C"
[enter text]
产生纯LF。随后,你会例如需要
ssh -t whateverhost "screen $TTYDEVICE"
tl; dr:netcat不会这样做。
答案 1 :(得分:1)
有很多版本的netcat(GNU和BSD),但您可能想尝试:
-C Send CRLF as line-ending
答案 2 :(得分:1)
使用标准工具这非常困难,但在perl中非常简单(尽管perl现在几乎是标准工具):
perl -pe 's/\r/\r\n/g'
上面的版本可能会在进行任何处理之前读取整个输入到内存中(它将读取直到找到'\ n',如果输入不包含'\ n',它将是整个输入),所以你可能更喜欢:
perl -015 -pe '$\="\n"'