netcat 命令介紹及使用示例
nc
(netcat)是一個強大的網路工具,它可以用於讀取和寫入資料流,支援 TCP 和 UDP 協議。它常被用於網路除錯和網路服務的建立。
一、安裝方法
centos 中,執行 yum install nc procps-ng -y
二、功能介紹
1. IP 埠監控
使用nc
進行埠掃描可以檢查指定主機的指定埠是否開放。例如,下面的命令可以檢查 192.168.1.1 的 80 埠是否開放:
nc -zv 192.168.1.1 80
這裡,-z
選項使nc
在連線建立後立即關閉,-v
選項使nc
在連線建立或關閉後報告其狀態。
2. 檔案傳輸
nc
也可以用於檔案傳輸。例如,你可以在一臺機器上使用nc
建立一個監聽埠,然後在另一臺機器上透過該埠傳送檔案。例如,下面的命令在 192.168.1.1 的 1234 埠上建立一個監聽,等待接收檔案:
nc -l 1234 > received_file
然後,在另一臺機器上,你可以使用下面的命令傳送檔案:
nc 192.168.1.1 1234 < file_to_send
3. 聊天
nc
還可以用於建立一個簡單的聊天服務。例如,你可以在一臺機器上使用下面的命令建立一個聊天服務:
nc -l 1234
然後,在另一臺機器上,你可以使用下面的命令連線到該聊天服務:
nc 192.168.1.1 1234
三、使用示例
1. 持續監控 IP 和埠是否正常
# 前臺執行
watch -n 5 "(date +%Y-%m-%d:%H:%M:%S.%3N ; nc -vz 192.168.1.1 8301 2>&1; echo '') | tee -a /tmp/netcat-192.168.1.1-8301.log"
# 後臺執行
nohup watch -n 5 "(date +%Y-%m-%d:%H:%M:%S.%3N ; nc -vz 192.168.1.1 8301 2>&1; echo '') | tee -a /tmp/netcat-192.168.1.1-8301.log" &
前臺執行命令解析:每隔 5 秒檢查一次與 192.168.1.1:8301
的連線是否通暢,並將結果連同當前時間追加到檔案 /tmp/netcat-192.168.1.1-8301.log
中,同時也在螢幕上顯示。
下面是對這個命令的逐一解析:
-
watch -n 5
:watch
是一個週期性執行命令的程式,-n 5
表示每隔 5 秒執行一次後面的命令。 -
date +%Y-%m-%d:%H:%M:%S.%3N
:這是一個用來獲取當前日期和時間的命令,格式為年-月-日:時-分-秒。毫秒。 -
nc -vz 192.168.1.1 8301 2>&1
:nc
是 Netcat 的簡寫,一個用於檢查網路連線的工具。-vz
參數列示在建立連線時給出詳細資訊並在建立連線後立即關閉。192.168.1.1
是要檢查的 IP 地址,8301
是要檢查的埠號。2>&1
是將標準錯誤(2)重定向到標準輸出(1),也就是說錯誤資訊和正常資訊都會被輸出。 -
echo ''
:這是一個輸出空行的命令,用於在每次執行結果之間新增空行,使得日誌更易讀。 -
tee -a /tmp/netcat-192.168.1.1-8301.log
:tee
命令用於將資料重定向到檔案,同時還能輸出到終端。-a
參數列示將資料追加到已有檔案中,而不是覆蓋。/tmp/netcat-192.168.1.1-8301.log
是存放日誌的檔案路徑。
所以,這條命令的整體功能就是每隔 5 秒檢查一次 IP 地址為 192.168.1.1,埠號為 8301 的網路連線狀態,並將日期、時間、連線狀態以及錯誤資訊等記錄到 /tmp/netcat-192.168.1.1-8301.log
檔案中。
為什麼選用 netcat,而不是 ping 或 telnet ?
(1)Ping 命令實際上並不使用 TCP 或 UDP 埠。它基於 ICMP 協議工作,只能表示主機之間是否能通,即無法指定使用 TCP 或 UDP 協議,也無法指定埠。
(2)相比於 netcat,telnet 在 IP 埠監控
方面功能單一,僅能表示互通與否。netcat 除了能輸出驗證耗時外,還支援多種配置項,可以滿足各類需求。
2. 傳送多個資料包
執行如下命令:
echo -e "packet 1\npacket 2\npacket 3" | nc 192.168.1.1 1234
注意的是,這些資料包並不是獨立的。它們都是在一個 TCP 連線中傳送的,所以如果你想要傳送獨立的資料包,你可能需要開啟多個 nc 程序
四、遇到問題
1. nc(netcat) 執行結果無法用 tee 或輸出重定向符號儲存到指定檔案
(1)問題描述
centos 中 tee 無法將 nc 執行結果儲存到/tmp/nc。過程及結果:
[root@host-name server]# nc -vz 192.168.1.1 8301 | tee -a /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# cat /tmp/nc
使用重定向符 > 或 >> 效果一樣
(2)解決方案
nc 命令新增重定向操作,將標準錯誤輸出
重定向到標準輸出
,如下:
[root@host-name server]# nc -vz 192.168.1.1 8301 2>&1 | tee -a /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# cat /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
(3)命令解析
這個 shell 命令的功能是測試從當前主機到指定主機(192.168.1.1)的指定埠(8301)的網路連線,並將測試結果輸出到檔案(/tmp/nc)中。下面是詳細的解析:
-
nc -vz 192.168.1.1 8301
:這是使用nc
(netcat)命令測試網路連線的部分。其中,-v
選項表示詳細模式,命令執行時會顯示詳細資訊;-z
選項表示在傳送任何資料之前先掃描開放的埠;192.168.1.1
和8301
分別是目標主機的 IP 地址和埠號。 -
2>&1
:這個是 shell 中的重定向操作,表示將標準錯誤(2)的輸出重定向到標準輸出(1)。這樣做的目的是將nc
命令的所有輸出(包括正常的輸出和錯誤的輸出)都能被後面的tee
命令接收。 -
| tee -a /tmp/nc
:這是使用tee
命令將nc
命令的輸出寫入檔案的部分。其中,|
是管道符,用來將一個命令的輸出作為另一個命令的輸入;-a
選項表示追加模式,即將輸出追加到指定的檔案中,而不是覆蓋檔案;/tmp/nc
是指定的檔案路徑。
(4)原因分析
猜測:nc 執行結果屬於標準錯誤輸出
,透過測試發現確認如此,驗證過程如下:
[root@host-name server]# > /tmp/nc
[root@hostname server]# nc -vz 192.168.1.1 8301 2>> /tmp/nc
[root@hostname server]# cat /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# nc -vz 192.168.1.1 8301 1>> /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# cat /tmp/nc
補充說明: ubuntu 下可能要安裝 netcat-traditional 版本,具體參考:How to switch to netcat-traditional in Ubuntu?
2. watch 執行命令不支援變數
(1)問題描述
執行以下命令,每次輸出的時間都為固定值
watch -n 5 "echo $(date +%Y-%m-%d:%H:%M:%S.%3N)"
(2)原因分析
執行 watch 命令後解析變數值,top 中看到的實際執行的命令如下
530264 root 20 0 57620 4904 3824 S 0.0 0.0 0:00.00 watch -n 5 echo 2024-03-08:20:45:39.771
(3)解決辦法
- 移除變數中的、$(),修改後為
watch -n 5 "date +%Y-%m-%d:%H:%M:%S.%3N"
- 將 watch 執行命令都遷移到 sh 指令碼中,watch 執行 sh 指令碼
五、相關補充
1. telnet 遠端登入使用簡介
安裝:yum install telnet-server telnet
服務端啟動服務:systemctl enable telnet.socket
客戶端登入:telnet 192.168.1.1 23
注意: telnet 網路上傳送未加密的資料,包括密碼。因此,你應該儘量避免在生產環境中使用 Telnet,而是使用更安全的協議,如 SSH。
2. 多行命令之間使用;和&的區別
; 會無論前一個命令是否成功都執行下一個命令,而 && 則只有當前一個命令成功時才會執行下一個命令。
3. nohup &
和 &
的區別
它們都可以用於在後臺執行程序,但是它們的工作方式和效果有所不同。
nohup
命令:
nohup
是 "no hang up" 的縮寫,用於在系統掛起或者使用者退出系統後繼續執行指定的命令。
例如,你可以這樣使用 nohup
命令:
nohup command &
這條命令會把 command
執行在後臺,並且即使你退出了系統,command
也會繼續執行。
&
命令:
&
是 Unix 或 Linux 系統中的一個 shell 運算子,用於把命令放到後臺執行。
例如,你可以這樣使用 &
命令:
command &
這條命令會把 command
執行在後臺,但是如果你退出了系統,command
會被停止。
nohup
和&
的區別:
nohup
命令可以保證在使用者退出系統後命令繼續執行。&
命令只能把命令放到後臺執行,如果使用者退出系統,命令會被停止。
所以,如果你想在退出系統後命令能繼續執行,你應該使用 nohup
命令。