2012-01-27 37 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