如何知道某个PID监听了哪些端口?

sha*_*ote 18 osx networking bsd

我有一个特定进程的 PID 正在监听我的 OS X 上的一些端口,我需要知道这个进程监听了哪些端口。我该怎么做?

我知道我可以lsof用来知道哪个进程正在监听某个端口,但我需要执行一个逆操作。

谢谢你。

UPD

OS X 使用 BSD utils,所以我有 BSDnetstat而不是 Linux netstat。Linuxnetstat-p显示 PID 的选项,BSDnetstat使用-p指定端口并且没有显示 PID 的选项。

sha*_*ote 21

通过深入阅读,我自己找到了解决方案man lsof。(是的,RT*M 仍然有帮助。)感谢 @Gilles 瞄准。

这是解决方案: lsof -aPi -p 555(555 是 PID)。

解释:

  1. -p 指定PID编号;
  2. -i 仅显示网络设备;
  3. -a 对上面的两个条件进行 AND(否则它们将被 ORed);
  4. -P 显示端口号(而不是默认端口名称)。

此外,可以相应地使用lsof -aPi4 -p 555lsof -aPi6 -p 55仅用于 IPv4 或 IP6 地址。

如果输出将被另一个程序-Fn选项解析可能会有所帮助。使用此选项lsof将生成“其他程序的输出”而不是格式良好的输出。lsof -aPi4 -Fn -p 555将输出如下内容:

p554
nlocalhost:4321
Run Code Online (Sandbox Code Playgroud)

PS 所有这些我都在我的 OS X El Capitan 上测试过,但正如我所见,它也应该适用于 Linux。


Gil*_*il' 6

lsof提供有关进程打开的文件的信息,包括网络端口。它几乎可以在所有 unix 系统上使用,包括 OSX

UnixRosetta Stone没有列出 OSX 上用于“将进程与文件或端口匹配”的任何其他工具。

要列出侦听 TCP 端口的进程,您可以使用

lsof -iTCP -sTCP:LISTEN
Run Code Online (Sandbox Code Playgroud)

lsof -iUDP列出打开 UDP 套接字的进程。lsof -i列出所有打开的网络套接字(TCP 客户端、TCP 服务器和其他 IP 协议)。