0

我正在为 redhat linux 机器上的串行设备创建 TCP/IP 接口。使用 bash 脚本中的 netcat 来完成此操作并不麻烦。

nc -l $PORT < $TTYDEVICE > $TTYDEVICE

问题是串行设备在其响应中使用回车符('\r')作为行尾。我想将其翻译为 ("\r\n") 以便远程登录的 Windows 机器可以毫无问题地查看响应。我试图弄清楚如何用一个简单的 bash 解决方案来解决这个问题。我也可以访问 stty 来配置串行设备,但是在输入端没有“\r”到“\r\n”的转换(据我所知)。

我确实尝试在 netcat 的输入端使用 tr,但它不起作用。

#cat $TTYDEVICE | tr '\r' '\r\n' | nc -l $PORT > $TTYDEVICE

有任何想法吗?

4

3 回答 3

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;博士:netcat 不会这样做。

于 2012-01-27T16:25:15.383 回答
1

有许多版本的 netcat(GNU 和 BSD),但您可能想尝试一下:

 -C      Send CRLF as line-ending
于 2012-01-27T14:59:26.480 回答
1

这对于标准工具来说太难了,但在 perl 中却很容易(尽管 perl 现在几乎是一个标准工具):

perl -pe 's/\r/\r\n/g'

上面的版本可能会在进行任何处理之前将整个输入读入内存(它将一直读取直到找到'\n',如果输入不包含'\n',这将是整个输入),所以你可能更喜欢:

perl -015 -pe '$\="\n"'
于 2012-01-27T14:59:33.770 回答