Bash TCP リダイレクト転送が終了します。

Bash TCP リダイレクト転送が終了します。

私はtcpソケットから文字列を読み込み、エンコードされたビューを出力するxinetdを使用して単純なWebサービスを作成しました。生のバイナリは標準入力のみを読み込みます。

netcatasで使用するとうまくいきます。echo string | nc <ip> <port>

ただし、bash tcpリダイレクトを介して使用しようとすると応答しません。

exec 7<>/dev/tcp/<ip>/<port>
echo string >&7
cat <&7

永遠に待ちます。私はこのfdに\ 004、cat /dev/nullをエコーし​​ようとしましたが、成功しませんでした。どのように動作させることができますか?

ベストアンサー1

サービスinetdまたはサービスがEOFを待っている可能性があり、その後終了します(次に接続を閉じます)。

これを行うには、クライアントがソケットの送信側を閉じ、受信側を開いたままにする必要があります。これはnc、標準入力でEOFを検出したときに実行される操作です。

/dev/tcp/host/port仮想インターフェイス(bashkshからコピー)はそれを許可しません。zshより柔軟な選択肢であっても、ztcp接続を非対称的に閉じることはできません。

代わりにタイムアウトを使用することもできますが、これは信頼できません。そのため、ncまたは同じ専用ユーティリティを使用するsocatか(同様のインターフェースを持つためにcoprocを使用する)、適切なネットワークAPI(coprocへのインターフェースを含むshutdown())を持つプログラミング言語を使用することをお勧めします。

^Dラインルールがモードicanon(おおよそのラインエディタの実装)にある場合、0x04文字()は単にエンドデバイスの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上記の、、、...処理の一部として無効になっています)。weraseerasekill^C^Zraw

したがって、0x4文字で終了するのではなく、入力プリプロセッサを挿入することもできます。たとえば、次のようになります。

awk -v RS='\4' -v ORS= '{print; exit}' | your-service

(フルバッファまたはeofを受信しない限り、入力を処理することはawkできません。)mawkmawk

おすすめ記事