私はtcpソケットから文字列を読み込み、エンコードされたビューを出力するxinetdを使用して単純なWebサービスを作成しました。生のバイナリは標準入力のみを読み込みます。
netcat
asで使用するとうまくいきます。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
仮想インターフェイス(bash
kshからコピー)はそれを許可しません。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
上記の、、、...処理の一部として無効になっています)。werase
erase
kill
^C
^Z
raw
したがって、0x4文字で終了するのではなく、入力プリプロセッサを挿入することもできます。たとえば、次のようになります。
awk -v RS='\4' -v ORS= '{print; exit}' | your-service
(フルバッファまたはeofを受信しない限り、入力を処理することはawk
できません。)mawk
mawk