what's the 監聽端口
當程序的端口被占用時,會出現 Address already in use 的報錯信息。在對網絡連接或特定於應用程序的問題進行故障排除時,首先要檢查的事情之一應該是系統上實際使用了哪些端口,以及哪個應用程序正在偵聽特定的端口。
在 Linux 中可以使用 netstat,ss 和 lsof 命令找出哪些服務正在偵聽哪些端口。
網絡端口由其編號,關聯的 IP 地址和通信協議(例如 TCP 或 UDP)的類型標識。 偵聽端口是應用程序或進程在其上偵聽的網絡端口,充當通信端點。 每個監聽端口都可以使用防火牆打開或關閉(過濾)。
一般而言,開放端口是一個網絡端口,它接受來自遠程位置的傳入數據包。 不能讓兩個服務監聽同一 IP 地址上的同一端口。 例如,如果正在運行一個監聽端口 80 和 443 的 Apache Web 服務器,並且嘗試安裝 Nginx ,則后者將無法啟動,因為 HTTP 和 HTTPS 端口已經在使用中。
netstat 命令
netstat 可以提供有關網絡連接的信息。
# 列出所有正在偵聽的TCP或UDP端口,包括使用端口的服務和套接字狀態 sudo netstat -tunlp ''' 參數的含義 -t-顯示TCP端口。 -u -顯示UDP端口。 -n -顯示數字地址而不是解析主機。 -l -僅顯示監聽端口。 -p -顯示偵聽器進程的PID和名稱。僅當你以root用戶或 sudo 用戶身份運行命令時,才會顯示此信息。 '''

# 輸出的形式 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0:22 0:* LISTEN 445/sshd tcp 0 0 0:25 0:* LISTEN 929/master tcp6 0 0 :::3306 ::* LISTEN 534/mysqld tcp6 0 0 :::80 :::* LISTEN 515/apache2 tcp6 0 0 :::22 :::* LISTEN 445/sshd tcp6 0 0 :::25 :::* LISTEN 929/master tcp6 0 0 :::33060 :::* LISTEN 534/mysqld udp 0 0 0:68 0:* 966/dhclient ''' 參數解析 Proto——套接字使用的協議。 Local Address——進程偵聽的IP地址和端口號。 PID/Program name——PID和進程名稱。 '''
# 用grep過濾,指定端口 sudo netstat -tnlp | grep :22
如果輸出為空,則表示端口上沒有監聽。
netstat 目前已過時,被 ss和 ip 取代,但它仍然是檢查網絡連接的最常用命令。
ss 命令
ss 是新的 netstat。它缺少 netstat 的某些功能,但是公開了更多的 TCP 狀態,並且速度稍快。命令選項基本相同,輸出與 netstat 報告的輸出幾乎相同,因此從 netstat 到 ss 的轉換並不困難。
sudo ss -tunlp
lsof 命令
lsof 是功能強大的命令行應用程序,可提供有關進程打開的文件的信息。在 Linux 中,所有內容都是文件。可以將套接字視為寫入網絡的文件。
sudo lsof -nP -iTCP -sTCP:LISTEN ''' 參數解析 -n——不要將端口號轉換為端口名稱。 -p——不解析主機名,顯示數字地址。 -iTCP和sTCP:LISTEN——僅顯示TCP狀態為LISTEN的網絡文件。 '''

# 輸出形式 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 445 root 3u IPv4 16434 0t0 TCP *:22 (LISTEN) sshd 445 root 4u IPv6 16445 0t0 TCP *:22 (LISTEN) apache2 515 root 4u IPv6 16590 0t0 TCP *:80 (LISTEN) mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN) mysqld 534 mysql 33u IPv6 19973 0t0 TCP *:33060 (LISTEN) apache2 764 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN) apache2 765 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN) master 929 root 13u IPv4 19637 0t0 TCP *:25 (LISTEN) master 929 root 14u IPv6 19638 0t0 TCP *:25 (LISTEN) ''' 參數解析 COMMAND,PID,USER——運行與端口關聯的程序的名稱,PID和用戶。 NAME——端口號。 '''
# 查找正在偵聽特定端口3306 sudo lsof -nP -iTCP:3306 -sTCP:LISTEN