2012-01-27 33 views
0

我正在为redhat linux机器上的串行设备创建TCP/IP接口。在一个bash脚本中的netcat被用来完成这个,而且不麻烦。如何修改netcat的输入流?

nc -l $PORT < $TTYDEVICE > $TTYDEVICE 

的问题是,在串行设备使用回车对线(“\ R”)在它的响应结束。我想把它翻译成(“\ r \ n”),所以telnetting的windows机器可以毫无困难地查看响应。我试图弄清楚如何用简单的bash解决方案来解决这个问题。我也可以访问stty来配置串口设备,但是在输入端没有“\ r”来翻译“\ r \ n”(从我能说的)。

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

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

任何想法?

+0

'tr'对字符到字符的翻译很有用,但它不会将一个字符转换为多个字符。 (指定较长的目标字符串只会导致多余的字符被忽略,在这种情况下'tr'应该显示警告。)。使用例如代替Perl。 – tripleee 2012-01-27 16:32:36

回答

1

这是标准的工具过于困难,但在Perl很容易(虽然Perl是非常一个标准的工具,这些天):

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

版本以上可能会做任何处理之前读取整个输入到存储器(它将读取,直到它找到“\ n”,这将是在输入整个输入不包含'\ n'),所以你可能更喜欢:

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

对不起,我的perl有点生疏。所以你建议我做这样的事情。猫$ TTYDEVICE | perl -015 -pe'$ \ =“\ n”'| nc -l $ PORT> $ TTYDEVICE – richmb 2012-01-27 15:39:12

+0

@richmb是的...... – 2012-01-27 15:44:37

+0

嗯..它当然可以在普通文件上运行。但它的行为方式与tr命令一样,我没有得到回应。 – richmb 2012-01-27 15:55:04

1

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

-C  Send CRLF as line-ending 
+0

只是试了一下,它只是增加了对netcat输出的换行。我需要将它们添加到输入流端。 – richmb 2012-01-27 15:32:05

2

您的问题是连接到$ PORT客户可能没有一个线索,它正在与另一侧的TTY,所以你会遇到的问题以tty特定的“功能”,例如作为^ C/^ D /等。和CRLF。

这就是为什么

socat tcp-listen:1234 - | hexdump -C 
telnet localhost 1234 
[enter text] 

将显示CRLFs,而

ssh -t localhost "hexdump -C" 
[enter text] 

得到纯的LF。随后,你会例如需要

ssh -t whateverhost "screen $TTYDEVICE" 

tl; dr:netcat不会这样做。

+0

这是真的,但我不认为我的应用程序需要很多控制字符。 – richmb 2012-01-27 19:16:02