如何修改netcat的输入流?

时间:2012-01-27 14:55:04

标签: linux bash serial-port netcat stty

我正在为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

有什么想法吗?

3 个答案:

答案 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"'