netcat 命令介紹及使用示例

曾左發表於2024-03-08

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 5watch 是一個週期性執行命令的程式,-n 5 表示每隔 5 秒執行一次後面的命令。

  • date +%Y-%m-%d:%H:%M:%S.%3N:這是一個用來獲取當前日期和時間的命令,格式為年-月-日:時-分-秒。毫秒。

  • nc -vz 192.168.1.1 8301 2>&1nc 是 Netcat 的簡寫,一個用於檢查網路連線的工具。-vz 參數列示在建立連線時給出詳細資訊並在建立連線後立即關閉。192.168.1.1 是要檢查的 IP 地址,8301 是要檢查的埠號。2>&1 是將標準錯誤(2)重定向到標準輸出(1),也就是說錯誤資訊和正常資訊都會被輸出。

  • echo '':這是一個輸出空行的命令,用於在每次執行結果之間新增空行,使得日誌更易讀。

  • tee -a /tmp/netcat-192.168.1.1-8301.logtee 命令用於將資料重定向到檔案,同時還能輸出到終端。-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)中。下面是詳細的解析:

  1. nc -vz 192.168.1.1 8301:這是使用nc(netcat)命令測試網路連線的部分。其中,-v選項表示詳細模式,命令執行時會顯示詳細資訊;-z選項表示在傳送任何資料之前先掃描開放的埠;192.168.1.18301分別是目標主機的 IP 地址和埠號。

  2. 2>&1:這個是 shell 中的重定向操作,表示將標準錯誤(2)的輸出重定向到標準輸出(1)。這樣做的目的是將nc命令的所有輸出(包括正常的輸出和錯誤的輸出)都能被後面的tee命令接收。

  3. | 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)解決辦法

  1. 移除變數中的、$(),修改後為 watch -n 5 "date +%Y-%m-%d:%H:%M:%S.%3N"
  2. 將 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 &&的區別

它們都可以用於在後臺執行程序,但是它們的工作方式和效果有所不同。

  1. nohup 命令:

nohup 是 "no hang up" 的縮寫,用於在系統掛起或者使用者退出系統後繼續執行指定的命令。

例如,你可以這樣使用 nohup 命令:

nohup command &

這條命令會把 command 執行在後臺,並且即使你退出了系統,command 也會繼續執行。

  1. & 命令:

& 是 Unix 或 Linux 系統中的一個 shell 運算子,用於把命令放到後臺執行。

例如,你可以這樣使用 & 命令:

command &

這條命令會把 command 執行在後臺,但是如果你退出了系統,command 會被停止。

  1. nohup& 的區別:
  • nohup 命令可以保證在使用者退出系統後命令繼續執行。
  • & 命令只能把命令放到後臺執行,如果使用者退出系統,命令會被停止。

所以,如果你想在退出系統後命令能繼續執行,你應該使用 nohup 命令。

相關文章