2012-01-27 6 views
0

私は、Redhat Linuxマシン上のシリアルデバイスへのTCP/IPインターフェイスを作成しています。 bashスクリプトのnetcatを使用してこれを達成しました。netcatの入力ストリームを変更するには?

nc -l $PORT < $TTYDEVICE > $TTYDEVICE 

問題は、シリアルデバイスがラインは、その応答で終了するキャリッジリターン(「\ rを」)を使用することです。私はこれを( "\ r \ n")に翻訳して、telnet接続しているWindowsマシンが何の問題もなく応答を見ることができるようにします。私は単純なbashソリューションでこれについてどうやって行くのかを考えようとしています。私もsttyにアクセスしてシリアルデバイスを設定していますが、 "\ r"から "\ r \ n"への変換は入力側にありません。

netcatの入力側でtrを使用しようとしましたが、動作しませんでした。

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

+0

'tr'は文字から文字への変換には便利ですが、1文字を複数の文字に変換することはありません。 (より長いターゲット文字列を指定すると、余分な文字は無視されます。この場合、 'tr'は警告を表示するでしょう)。例えば代わりにPerl。 – tripleee

答えて

1

これは、標準のツールを使用して過度に難しいが、Perlでとても簡単です標準的なツールこれらの日):

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

上記のバージョンでは、おそらくそれが入力ならば全体入力される「\ n」を、見つかるまで(それが読まれるすべての処理を実行する前にメモリに入力全体を読み込みます'\ n'が含まれていないため)、好むかもしれません:

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

私のperlは少し錆びています。私はこのようなことをしていることを示唆しています。 cat $ TTYDEVICE | perl -015 -pe '$ \ = "\ n"' | nc -l $ PORT> $ TTYDEVICE – richmb

+0

@richmbはい.... –

+0

よく、普通のファイルで動作します。 trコマンドが行ったのと同じように動作し、私は応答を返さない。 – richmb

1

はnetcatをのバージョン(GNUおよびBSD)がいくつかありますが、あなたはしようとする場合があります:perlがほとんどですが(

-C  Send CRLF as line-ending 
+0

ちょうどそれを試して、ちょうどnetcatの出力に改行を追加します。入力ストリーム側に追加する必要があります。 – richmb

2

あなたの問題は、あなたがtty固有の「機能」で問題が発生しますので、$ PORTに接続するクライアントは、おそらく、それは他の側にいるttyで動作していることを手掛かりを持っていないようなものです^ C/^ D/etcとして。およびCRLF。

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

は純粋のLFを得ながら

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

は、のCRLFが表示されます理由です

。その後、必要があります

ssh -t whateverhost "screen $TTYDEVICE" 

tl; dr:netcatはそれをしません。

+0

これは当てはまりますが、私のアプリケーションでは多くの文字を制御する必要はないと思います。 – richmb

関連する問題