tcpソケットから文字列を読み取り、エンコードされたビューを出力するxinetdを使用して単純なネットワークサービスを作成しました。 stdinを読み取るだけの元のbinary(qrencode)。
netcatで使用すると正常に動作します エコー文字列として| nc
しかし、bash tcpリダイレクトを介して使用しようとすると、応答しません。
exec 7<>/dev/tcp/<ip>/<port>
echo string >&7
cat <&7
それは永遠に待ちます。 \ 004、cat / dev / nullをこのfdにエコーしてみましたが、運が悪かったです。
どうすれば機能させることができますか?
承認された回答:
そのinetd サービスまたはあなたのサービスは、おそらくEOFを待ってから終了します(そして接続を閉じます)。
そのためには、受信側を開いたまま、クライアントがソケットの送信側をシャットダウンする必要があります。それがnc stdinでEOFを検出したときに実行します。
/ dev / tcp / host / port bashの仮想インターフェース (kshからコピー)それは許可されていません。 zshでさえ のztcp より柔軟な代替手段には、接続を非対称的にシャットダウンする機能がありません。
代わりにタイムアウトに頼ることもできますが、それは信頼できません。したがって、 ncなどの専用ユーティリティに依存し続けるのが最善です。 またはsocat (おそらく、同様のインターフェースを持つcoprocを使用)、または適切なネットワークAPIを備えたプログラミング言語を使用します( shutdown()へのインターフェースを使用します 。
0x04文字( ^ D )は、回線規律が icanonにある場合の端末デバイスのEOFのみを意味します モード(大まかなラインエディタを実装します)。したがって、これを機能させるには、 xinetdによって作成されたソケットの間に疑似端末を挿入する必要があります。 とあなたのサービス。たとえば、次のように開始します:
socat - exec:'your-service',pty,raw,icanon,echo=0,discard=,lnext=,werase=,kill=,start=,stop=,rprnt=,erase=,fdout=3
代わりに
your-service
次に、送信する必要があります:
printf 'text\n\4' >&7
または:
printf 'text\4\4' >&7
あなたのサービスが入力の終わりを確認するために。
そのラインエディタのため、 your-service 改行または^Dを送信したときにのみ入力が表示されます 文字( weraseなどの他のすべての編集文字を無効にしました 、消去コード> 、 kill 上記と^C 、 ^ Z …rawの一部として処理も無効になります 。
したがって、次のように0x4文字で終了する代わりに入力プリプロセッサを挿入することをお勧めします。
awk -v RS='\4' -v ORS= '{print; exit}' | your-service
( awkに注意してください mawkになることはできません mawkとして 完全なバッファまたはeofを受信しない限り、入力を処理しないことを主張します。