netcatがマシン間でファイルの転送をいつ完了したかを知る方法はありますか?
現在のコマンド:
マシン#2: nc -lp 5555 > test.txt
マシン#1: nc MachineIP Port < test.txt
転送は行われますが、転送が完了したことを示す視覚的な兆候はありません。
netcatがマシン間でファイルの転送をいつ完了したかを知る方法はありますか?
現在のコマンド:
マシン#2: nc -lp 5555 > test.txt
マシン#1: nc MachineIP Port < test.txt
転送は行われますが、転送が完了したことを示す視覚的な兆候はありません。
回答:
nc(1)-Linux manページまたはnc(1)BSD General Commands Manualでnc
確認できるように、にはさまざまなバージョンがあります。接続は転送直後にシャットダウンする必要があります。両方のリンクされたサイトで与えられた例があります:
まず、ncを使用して特定のポートでリッスンし、出力をファイルにキャプチャします。
$ nc -l 1234 > filename.out
2番目のマシンを使用して、listen ncプロセスに接続し、転送するファイルをフィードします。
$ nc host.example.com 1234 < filename.in
ファイルが転送されると、接続は自動的に閉じます。
あなたはnetcat
それが上記の1(S)と異なっているので、転送後に接続を終了しません。Debian Jessieでは、Netcat 1.10と同じように動作します。この動作は/usr/share/doc/netcat-traditional/README.gz
(私のマシン上で)文書化されており、太字は私のものです:
最も単純な使用法では、「nc host port」は、指定されたターゲットホスト上の指定されたポートへのTCP接続を作成します。その後、標準入力がホストに送信され、接続を介して返されるものはすべて標準出力に送信されます。これは、接続のネットワーク側がシャットダウンするまで、無期限に続きます。 この動作は、すべてをシャットダウンし、標準入力でのファイルの終了後に終了する他のほとんどのアプリケーションとは異なることに注意してください。
この動作の背後にある理由は次のとおりです。
「Telnetを使用して任意のポートに接続するのはなぜですか?」有効な質問、そしてここにいくつかの理由があります。 Telnetには「標準入力EOF」の問題があるため、ネットワーク出力が完了するように、スクリプトの駆動に計算された遅延を導入する必要があります。これが、ネットワーク側が閉じるまでnetcatが稼働し続ける主な理由です。
ウィキペディアには、さまざまな実装の概要があります。私は違いに名前を付けることはできません。多分誰かができますか?
1
nc
ファイルが読み込まれた後で終了するように指示できます。このオプションは便利です:
-q seconds after EOF on stdin, wait the specified number of seconds
and then quit. If seconds is negative, wait forever.
送信側でこのコマンドを使用する場合:
nc -q 0 MachineIP Port < test.txt
nc
EOFを読み取ってから0秒で終了します。つまり、ファイルが終了した直後です。その後、終了し、受信側も終了しnc
ます。
パケットが届かないとどうなるのか疑問に思われる方は、Jurajからのコメントをご覧ください。
すべてのパケットが検出されない場合、システムはこれを検出し、アプリケーションに通知せずに再送信します(または、不可能である場合、アプリケーションはタイムアウトエラーになります)。信頼性の高い配信は、OSカーネルが提供するTCPプロトコルの目的であり、
nc
使用しています。これを行わないUDPプロトコルを要求できますがnc -u
、これは当てはまりません。
2
前述のREADME.gz
には、-w
タイムアウトに基づく独自の例があり-q
、実装にオプションが存在する必要はありません。
Netcatは単純なデータ転送エージェントとして使用でき、どちらがリスナーでどちらがクライアントであるかは重要ではありません。一方の入力はもう一方の出力に到達します。タイムアウトを指定せずにリスナーを受信側で開始し、送信側に小さなタイムアウトを設定すると便利です。そうすることで、リスナーは、ユーザーが接続するまでリスナーを待機し続け、データのフローが停止した後、クライアントはタイムアウトし、シャットダウンして、リスナーを引き継ぎます。介在するネットワークに問題が生じない限り、これは完全に信頼できるはずであり、いつでもタイムアウトを増やすことができます。「rsh」の典型的な例は、次の場合によく使用されます。
nc -l -p 1234 | uncompress -c | tar xvfp -
そして反対側に
tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234
ディレクトリの内容を1つのマシンから別のマシンに転送します。どちらの側でも、.rhostsファイル、ユーザーアカウント、またはinetd構成について心配する必要はありません。