每天一個 Linux 命令:nc 命令

  1. 命令簡介

==========

nc(netcat)是一個短小精悍、功能實用、簡單可靠的網絡工具,主要有如下作用:

(1)端口偵聽,nc 可以作爲 server 以 TCP 或 UDP 方式偵聽指定端口;

(2)端口掃描,nc 可以作爲 client 發起 TCP 或 UDP 請求;

(3)機器之間傳輸文件;

(4)機器之間網絡測速。

nc 實際上是 ncat 的軟鏈接。ncat 是爲 Nmap: https://nmap.org/(Network Mapper) 項目編寫的,是 Nmap 套件中的一員,它旨在成爲可靠的後端工具,可立即爲其他應用程序和用戶提供網絡連接。ncat 不僅可以使用 IPv4 和 IPv6,還可以爲用戶提供幾乎無限的潛在用途。

2. 命令格式

nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port] [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname] [port[s]]

3. 選項說明

-4/6
 強制只使用 IPv4/IPv6 地址
-D
 在套接字上啓用調試
-d
 不從 stdin 讀取
-h
 打印出幫助信息
-k
 強制 nc 在當前連接完成後繼續偵聽另一個連接。注意如果不使用 -l 選項,則使用此選項是錯誤的
-l
 指定 nc 應該偵聽傳入的連接,而不是啓動到遠程主機的連接。將此選項與 -p、-s 或 -z 選項結合使用是錯誤的。此外,使用 -w 選項指定的超時將被忽略
-n
 不要在任何指定的地址、主機名或端口上執行任何 DNS 或服務查找
-r
 隨機選擇源端口和目標端口,而不是按照系統分配的順序或範圍內的順序選擇它們
-S
 啓用 RFC 2385 TCP MD5 簽名選項
-t
 使 nc 發送 RFC 854 DON'T 和 WON'T 響應 RFC 854 的 DO 和 WILL 請求。這使得使用 nc 編寫 telnet 會話腳本成爲可能
-U
 指定使用 Unix 域套接字
-u
 使用 UDP 代替默認選項 TCP
-v
 顯示命令執行過程
-z
 表示 zero,只掃描偵聽守護進程,而不向它們發送任何數據。此選項與 -l 選項結合使用是錯誤的
-C
 發送 CRLF 作爲換行符
-i interval
 指定發送和接收的文本之間的延遲時間間隔。還可指定連接到多個端口之間的延遲時間
-p source_port
 指定 nc 應使用的源端口,但須受特權限制和可用性限制。將此選項與 -l 選項結合使用是錯誤的
-s source_ip_address
 設置本地主機送出數據包的 IP 地址。注意將此選項與 -l 選項結合使用是錯誤的
-T ToS
 指定連接的 IP 服務類型 (TOS)。有效值是標記 ''lowdelay''''throughput''''reliability'',或以 0x 開頭的 8 位十六進制值
-w timeout
 如果連接和 stdin 空閒超過指定秒數,則連接將被關閉。-w 標誌對 -l 選項沒有影響。缺省不超時
-X proxy_protocol
 請求 nc 在與代理服務器對話時使用指定的協議。支持的協議是 “4”(SOCKsv.4)、“5”(SOCKV.5) 和 “connect”(HTTPS proxy)。如果未指定協議,則使用 SOCKS v.5
-x proxy_address[:port]
 使用指定代理服務器地址和端口連接到主機。如果未指定端口,則使用代理協議的已知端口(SOCKS 爲 1080,HTTPS 爲 3128)

nc 的控制參數不少,常用的幾個參數如下所列:

-l
 指定 nc 將處於偵聽模式。指定該參數,則意味着 nc 被當作 server,偵聽並接受連接,而非向其它地址發起連接
-p PORT
 指定 nc 使用的源端口
-s 
 指定發送數據的源 IP 地址,適用於多網卡機器
-u
 指定 nc 使用 UDP 協議,默認爲 TCP
-v
 輸出交互或出錯信息,新手調試時尤爲有用
-w
 超時秒數,後面跟數字 
-z
 表示 zero,掃描時不發送任何數據

4. 常用示例

(1)通過 ll 命令查看 nc 命令。

lrwxrwxrwx 1 root root 4 Aug 30 22:33 /usr/bin/nc -> ncat

(2)監聽本地端口。假設在當前命令行終端 A 進行監聽。

nc -vl 8888
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8888
Ncat: Listening on 0.0.0.0:8888

開啓另外一個命令行終端 B,同樣使用 nc 發起連接。

nc -v 127.0.0.1 8888

另一個終端 A 將會收到請求並打印連接信息:

Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:37229.

如果在終端 B 輸入內容,那麼終端 A 將收到終端 B 發送的內容並打印到標準輸出。

(3)利用 nc 之間的連接進行文件傳輸。

使用 nc 傳輸文件還是比較方便的,因爲不用 scp 和 rsync 那種輸入密碼的操作了。把 A 機器上的一個文本文件發送到 B 機器上需注意操作次序,receiver 先偵聽端口,sender 向 receiver 所在機器的該端口發送數據。

receiver:

nc -l 8888 > received.txt

sender:

nc 127.0.0.1 8888 < file.txt

receiver 接收完畢,會自動退出監聽。接收文件與原文件 md5 值相同,表示文件接收成功。

md5sum file.txt
8f6aab448ec32637b84c3484a1a44e0b  file.txt

md5sum received.txt
8f6aab448ec32637b84c3484a1a44e0b  received.txt

(4)利用 nc 傳輸目錄。發送目錄與發送文件類似,只不過是利用 tar 先將目錄打包成一個文件,然後發送。接收方再利用 tar 進行解壓縮還原爲目錄。

receiver:

nc -l 8888 | tar -xzvf -

sender:

tar -czvf - DIR_NAME | nc 127.0.0.1 8888

注意,tar -f 選項後跟橫槓 - 表示從標準輸入讀取或將結果輸出到標準輸出。

(5)測試網速。

測試網速其實利用了傳輸文件的原理,就是把來自一臺機器的 /dev/zero 發送給另一臺機器的 /dev/null,就是把一臺機器的無限個 0,傳輸給另一個機器的空設備上,然後新開一個窗口使用 dstat 命令監測網速,在這之前需要保證機器先安裝 dstat 工具。

yum install -y dstat

第 1 步,在 A 機器先啓動接收數據的命令,監聽自己的 8888 端口,把來自這個端口的數據都輸出給空設備(這樣不寫磁盤,測試網速更準確)。

nc -l 8888 > /dev/null

第 2 步,在 B 機器發送數據,把無限個 0 發送給 A 機器的 8888 端口。

nc 10.0.1.161 8888 < /dev/zero

在 A 機器新的窗口上使用 dstat 命令查看當前網速。dstat 命令比較直觀,它可以查看當前 CPU,磁盤,網絡,內存頁和系統的一些當前狀態指標。我們只需要關注 recv 和 send 兩列,分別表示接收和發送的數據,另外注意數字後面的單位 B,KB,MB。

5.FAQ

使用 nc 測試網速時,如果是在同一臺機器發送數據,即:

nc 127.0.0.1 8888 < /dev/zero

那麼 receiver 將無法收到數據,具體原因還未找到,有知道的網友也麻煩留言告知,萬分感謝。

轉自:戀貓大鯉魚 dablelv.blog.csdn.net/article/details/105104410

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Z_vFn1p-Ds83q_ziYPhweA