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を受信しない限り、入力を処理しないことを主張します。
関連:bash配列を使用してテーブルをiniファイルに変換しますか?