Netcat

如何知道 NC 何時完成文件傳輸

  • September 5, 2018

有沒有辦法知道 netcat 何時在機器之間傳輸文件?

目前命令:

機器#2:nc -lp 5555 > test.txt

機器#1:nc MachineIP Port < test.txt

轉移發生,但沒有視覺指示它已完成。

首先一些背景

有不同的版本nc,您可以在nc(1) - Linux 手冊頁nc(1) BSD 通用命令手冊中找到連接應該在傳輸後立即關閉。兩個連結網站上都有一個範例:

首先使用 nc 偵聽特定埠,並將輸出擷取到文件中:

$ nc -l 1234 > filename.out

使用第二台機器,連接到正在監聽的 nc 程序,將要傳輸的文件提供給它:

$ nc host.example.com 1234 < filename.in

傳輸文件後,連接將自動關閉。

傳輸後您netcat不會關閉連接,因此它與上述連接不同。它的行為就像我的,Debian Jessie 上的 Netcat 1.10。這種行為記錄在/usr/share/doc/netcat-traditional/README.gz(在我的機器上),加粗是我的:

在最簡單的用法中,“nc 主機埠”創建到給定目標主機上給定埠的 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

將目錄的內容從一台機器傳輸到另一台機器,而無需擔心任何一端的 .rhosts 文件、使用者帳戶或 inetd 配置。

引用自:https://unix.stackexchange.com/questions/305743