如您所知,一個端口一次只能由一個進程或服務使用。端口標識系統上運行的特定服務或進程。在故障排除期間,可能需要知道進程正在偵聽的端口號。系統上運行的每個進程都與一個進程標識號 (PID) 和端口號相關聯。為了找出特定進程正在偵聽的端口號,本文介紹了幾種方法。
在繼續本文之前,請確保您具有 root 權限。它有助於獲取有關係統上運行的進程的全面信息。
請注意,我使用 Debian 10 來執行本文中的命令和過程。
方法一:使用netstat命令
Netstat 是最流行的命令行實用程序,可用於顯示有關網絡連接、接口統計信息和路由表的信息。它還可用於查找進程使用的端口號。無需安裝它,因為它已經安裝在所有 Linux 發行版的存儲庫中。但是,如果您的系統上尚未安裝它,請使用以下命令安裝它:
$ sudo apt install net-tools
要找出進程正在偵聽的端口號,請在終端中運行以下命令:
$ sudo netstat -ltnp
以下輸出顯示了某些進程使用的端口號及其進程 ID (PID)。
如果您沒有 sudo 權限並在沒有 sudo 的情況下運行上述命令,您將看不到程序名稱和 PID,如以下輸出所示。
讓我們來看看 脂蛋白 上述命令的意思是:
l – 顯示監聽套接字
t – 顯示 TCP 連接
n – 以數字格式顯示 IP 地址和端口號
p – 打印 PID/程序名稱
查看 $ sudo netstat -ltnp 輸出,第四列正是我們要查找的內容,即進程正在偵聽的端口號。
要獲取單個進程的端口信息,只需使用 grep 命令並通過管道輸出 netstat 的輸出。
例如,要根據“sshd”查找端口號,請使用以下命令:
$ sudo netstat –ltnp | grep ‘sshd’
同樣,如果您想知道偵聽特定端口(如端口 21)的進程的名稱,請使用以下命令:
$ sudo netstat -ltnp | grep -w ':21'
方法二:使用 lsof 命令
您可以使用 lsof 命令查看系統上運行的進程打開的所有文件的列表。 lsof 充當單一信息源,否則需要許多管理工具。 與 netstat 命令一樣,查看詳細信息需要 sudo 權限。
如果您的系統上尚未安裝 lsof,請在終端中使用以下命令安裝它:
$ sudo apt install lsof
安裝後,您可以使用 lsof 實用程序查找在特定端口上運行的進程。運行不帶參數的 lsof 實用程序會返回大量難以理解的信息。但是,使用帶有 lsof 的參數可以幫助過濾和關注所需的輸出。
要查找偵聽特定端口(例如端口 22)的進程,請使用以下命令:
$ sudo lsof -i :22
此命令返回在端口 22 上運行的所有進程。
方法三:使用 fuser 命令
fuser 是一個 Linux 命令,它使用文件、目錄或文件系統查找進程 ID。您可以使用此命令查找在特定端口上運行的進程。
fuser 命令需要 psmisc 實用程序。如果您的系統上尚未安裝它,請運行以下命令來安裝它:
$ sudo apt install psmisc
要查看在任何端口上運行的進程,假設 TCP 端口為 22,請在終端中運行以下命令:
$ sudo fuser 22/tcp
上面的命令將返回監聽端口號 22 的進程。要根據進程 ID 顯示進程名稱,請使用以下命令語法:
$ ps -p [processID] -o comm=
在我們的例子中是
$ ps -p [5859] -o comm=
從上面的輸出中,您可以找到進程名稱 sshd,進程 ID 為 5859。這意味著進程 id 為 5859 的 sshd 正在偵聽端口 22。
本文介紹了一些命令行實用程序,您可以使用它們來查看特定進程正在偵聽哪些端口。