如何知道 NC 何時完成文件傳輸
有沒有辦法知道 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 配置。