コマンド を持つ ncat サーバーで問題が発生しましたncat -l [port] -k -c "cat > foo; cat > bar"
。netcat を介してこのサーバーに接続すると、ファイル への書き込みが許可されfoo
、その後、 が実行さbar
れます。問題は、接続しているクライアントが をfoo
送信して書き込みを停止しようとすると^D
、 への書き込みに進むのではなくクライアントが閉じられbar
、に書き込まれないことです。どうすればこれを回避できますか?ではなく コマンドで終了できるようにするbar
の代替手段は何ですか?cat
EOF
答え1
1 つの接続だけで 2 つのファイルを転送したい場合は、何らかの方法でマーカーを使用してデータ ストリーム内のファイルを分離する必要があります。これは、ファイルの終わりは、netcat がソケットを閉じるために使用する長さ 0 の読み取りであるためです。
Control-D
ファイルの終わりを示すために端末に入力できるものかもしれませんが、文字は生成されず、長さ 0 で読み取りが終了します。Control-D
データ ストリームにはありません。
2 つのファイルを簡単に転送するには、 のような既存のパッケージ化コマンドを使用できますtar
。nc -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 番目のファイル名に変更します。