【问题标题】:How to modify input stream of netcat?如何修改netcat的输入流?
【发布时间】:2012-01-27 14:55:04
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • tr 对于字符到字符的翻译很有用,但它不会将一个字符翻译成多个字符。 (指定更长的目标字符串只会导致多余的字符被忽略。也许tr 在这种情况下应该显示警告。)。使用例如而是 Perl。

标签: linux bash serial-port netcat stty


【解决方案1】:

您的问题是连接到 $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 不会这样做。

【讨论】:

  • 这是真的,但我认为我的应用程序不需要很多控制字符。
【解决方案2】:

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

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

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

perl -015 -pe '$\="\n"'

【讨论】:

  • 对不起,我的 perl 有点生锈了。所以你建议我做这样的事情。猫$TTYDEVICE | perl -015 -pe '$\="\n"' | nc -l $PORT > $TTYDEVICE
  • 好吧..它当然适用于常规文件。但它的行为方式与 tr 命令相同,我没有得到回复。
  • 可能是缓冲问题。尝试添加 $| = 1 启用自动刷新。
  • 为了澄清,做: perl -015 -pe 'BEGIN{ $\="\n"; $|=1 }'
【解决方案3】:

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

 -C      Send CRLF as line-ending

【讨论】:

  • 刚刚尝试过,它只是在netcat的输出中添加换行符。我需要在输入流端添加它们。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2023-04-01
相关资源
最近更新 更多