我如何知道打開 tcp 埠的程序名稱?
我有兩個 linux 伺服器。假設它們是
C
和S
。
C
是客戶S
在我的
S
機器上,我打字。$ netstat -an | grep 已建立
tcp 0 0 192.168.1.220:3306 C:57010 已 建立
然後我可以知道
C
現在正在連接。在
C
機器中,我還想知道打開埠57010並連接伺服器的*程序名稱。*我怎樣才能做到這一點?當然我有root權限。S``C
一種方法是說
lsof -i:57010 -sTCP:ESTABLISHED
。這會遍歷核心的打開文件句柄表,以使用該埠查找已建立 TCP 連接的程序。(網路套接字是 *ix 類型系統上的文件句柄。)您將-sTCP:LISTEN
在伺服器端使用來僅過濾掉偵聽器套接字。由於這種
lsof
工作方式,它只能看到您的使用者擁有的程序,除非您以 root 身份執行它。它也相當低效,因為典型的 ix 系統在任何給定時間都打開了很多*文件句柄。另一個答案中給出的netstat
方法更快,並且通常具有較低的訪問要求。然而,該
lsof
方法有一個很大的優勢:並非所有 *ix 類型的作業系統都有一個netstat
用於在輸出中包含程序名稱的標誌,而lsof
已經移植到您可能使用的每個 *ix 類型的作業系統。例如, OS Xnetstat
就是這種方式。它有一個-p
選項,但它的作用與netstat -p
Linux 不同。對於像您問題中的埠號這樣的不常見埠號,您通常可以在不添加
lsof
’-s
標誌的情況下逃脫,因為給定的機器不太可能有程序既連接到埠又監聽它。使用 HTTP 的 80 之類的埠號添加它會很有幫助,在這種情況下,您可能會有多個程序同時使用該埠。幸運的是,該
-s
標誌在許多情況下是可選的,因為這種用法僅適用於lsof
4.81 及更高版本。在舊版本中,-s
完全意味著其他東西!這是 2008 年的複古變化,但它仍然會出人意料地咬人。例如, RHEL 5 附帶lsof
4.78。