NCがファイルの転送をいつ完了したかを知る方法


11

netcatがマシン間でファイルの転送をいつ完了したかを知る方法はありますか?

現在のコマンド:

マシン#2: nc -lp 5555 > test.txt

マシン#1: nc MachineIP Port < test.txt

転送は行われますが、転送が完了したことを示す視覚的な兆候はありません。

回答:


19

最初にいくつかの背景

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

ncEOFを読み取ってから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構成について心配する必要はありません。


これが機能しないようです。-qを実行すると、コマンドが存在しないと表示されます。-wは似ているように見えますが、これで接続が終了するわけではありません
Anthony Russell

あなたのncバージョンは何ですか?確認するには:nc -h最初の行。

ええええ、それはかなり古いです。私はLinuxの古いイメージを使用しています。私はそれを更新
アンソニー・ラッセル

回答を更新しました。

1
すべてのパケットが検出されない場合、オペレーティングシステムはこれを検出し、アプリケーションに通知せずにパケットを再送信します(それでも失敗する場合、アプリケーションはタイムアウトエラーになります)。信頼できる配信は、ncが使用するOSカーネルによって提供されるTCPプロトコルの目的です。nc -uを使用して、これを行わないUDPプロトコルを要求できますが、そうではありません。
ジュラジ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.