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)。
解释:
-p 指定PID编号;-i 仅显示网络设备;-a 对上面的两个条件进行 AND(否则它们将被 ORed);-P 显示端口号(而不是默认端口名称)。此外,可以相应地使用lsof -aPi4 -p 555或lsof -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。
lsof提供有关进程打开的文件的信息,包括网络端口。它几乎可以在所有 unix 系统上使用,包括 OSX。
Unix的Rosetta Stone没有列出 OSX 上用于“将进程与文件或端口匹配”的任何其他工具。
要列出侦听 TCP 端口的进程,您可以使用
lsof -iTCP -sTCP:LISTEN
Run Code Online (Sandbox Code Playgroud)
lsof -iUDP列出打开 UDP 套接字的进程。lsof -i列出所有打开的网络套接字(TCP 客户端、TCP 服务器和其他 IP 协议)。