Networking

我如何知道打開 tcp 埠的程序名稱?

  • May 18, 2014

我有兩個 linux 伺服器。假設它們是CS

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 -pLinux 不同。

對於像您問題中的埠號這樣的不常見埠號,您通常可以在不添加lsof-s標誌的情況下逃脫,因為給定的機器不太可能有程序既連接到埠又監聽它。使用 HTTP 的 80 之類的埠號添加它會很有幫助,在這種情況下,您可能會有多個程序同時使用該埠。

幸運的是,該-s標誌在許多情況下是可選的,因為這種用法僅適用於lsof4.81 及更高版本。在舊版本中,-s完全意味著其他東西!這是 2008 年的複古變化,但它仍然會出人意料地咬人。例如, RHEL 5 附帶lsof4.78。

引用自:https://unix.stackexchange.com/questions/44009