接続を閉じずに `netcat` を介して `cat` を EOF するにはどうすればよいですか?

接続を閉じずに `netcat` を介して `cat` を EOF するにはどうすればよいですか?

コマンド を持つ ncat サーバーで問題が発生しましたncat -l [port] -k -c "cat > foo; cat > bar"。netcat を介してこのサーバーに接続すると、ファイル への書き込みが許可されfoo、その後、 が実行さbarれます。問題は、接続しているクライアントが をfoo送信して書き込みを停止しようとすると^D、 への書き込みに進むのではなくクライアントが閉じられbar、に書き込まれないことです。どうすればこれを回避できますか?ではなく コマンドで終了できるようにするbarの代替手段は何ですか?catEOF

答え1

1 つの接続だけで 2 つのファイルを転送したい場合は、何らかの方法でマーカーを使用してデータ ストリーム内のファイルを分離する必要があります。これは、ファイルの終わりは、netcat がソケットを閉じるために使用する長さ 0 の読み取りであるためです。

Control-Dファイルの終わりを示すために端末に入力できるものかもしれませんが、文字は生成されず、長さ 0 で読み取りが終了します。Control-Dデータ ストリームにはありません。

2 つのファイルを簡単に転送するには、 のような既存のパッケージ化コマンドを使用できますtarnc -k -l 4458 -v -c 'tar xf - >&2'を受信者として、 をtar cf - foo bar送信者として使用します。(ファイル名は送信者から取得されるため、送信者を信頼する必要があります)。

あるいは、ファイルが単純なテキストである場合は、2つのファイルを区切る特別な行を導入することもできます。たとえば、送信側cat foo; echo bye; cat barと受信側で次のような行です。

nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'

この GNU awk スクリプトは、最初のファイル名を変数に保持しfile、"bye" 行を検出すると 2 番目のファイル名に変更します。

関連情報