每天一個 Linux 命令:nc 命令
- 命令簡介
==========
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