0

RedHatLinuxマシン上のシリアルデバイスへの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 で動作していることを認識していないため、^C/^D/ などの tty 固有の「機能」で問題が発生することです。等 および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 ではできません。

于 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 に答える