如何获取进程正在监听的端口?
如何使用 python 获取进程正在侦听的端口?进程的 pid 是已知的。
How do I get the ports that a process is listening on using python? The pid of the process is known.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用 psutil:
...来过滤侦听套接字:
You can use psutil:
...To filter for listening sockets:
我的回答分为两部分:
1.在 shell 中获取信息
对于第一部分,
netstat
可以工作,但我更喜欢使用lsof
,因为它可用于提取信息更丰富且更详细的信息。简洁的清单。使用的确切选项可能会根据您的操作系统、内核和编译选项而有所不同,但我相信您想要这样的东西:其中
23819
是您选择的 PID,i4 表示所有 IPv4 套接字(尽管您可能需要
i6
用于 IPv6,视情况而定)。从那里,您可以通过 grep 管道来仅选择侦听套接字。(在
lsof
版本4.82中,您还可以使用-sTCP:LISTEN
标志而不是grep
来选择侦听套接字,尽管此选项不会似乎在 4.78 版本中可用)2。从Python 调用
lsof
您应该能够使用
subprocess
模块从Python 调用lsof
并读取输出,例如所以:希望这有帮助!
There are two parts to my answer:
1. Getting the information in the shell
For the first part,
netstat
would work, but I prefer usinglsof
, since it can be used to extract a more informative and concise list. The exact options to use may vary based on your OS, kernel and compilation options, but I believe you want something like this:Where
23819
is the PID you are selecting for, andi4
denotes all IPv4 sockets (though you might wanti6
for IPv6, as the case may be). From there, you can pipe through grep to select only listening sockets.(In
lsof
version 4.82, you can additionally use the-sTCP:LISTEN
flag instead ofgrep
to select listening sockets, though this option doesn't seem to be available back in version 4.78)2. Calling
lsof
from PythonYou should be able to call
lsof
and read the output, from Python, using thesubprocess
module, like so:Hope this helps!
如果您不想解析像 netstat 或 lsof 这样的程序的输出,您可以仔细浏览 /proc 文件系统并尝试查找有关其中文件的文档。
/proc//net/tcp
您可能特别感兴趣。当然,这些文件的格式可能会在内核版本之间发生变化,因此解析命令输出通常被认为更可靠。If you don't want to parse the output of a program like netstat or lsof, you can grovel through the /proc filesystem and try to find documentation on the files within.
/proc/<pid>/net/tcp
might be especially interesting to you. Of course, the format of those files might change between kernel releases, so parsing command output is generally considered more reliable.您可以使用
netstat -lnp
,最后一列将包含pid和进程名称。在 Python 中,您可以解析此命令的输出。You can use
netstat -lnp
, last column will contain pid and process name. In Python you can parse output of this command.有一件事没有提到。 Python 中的大多数端口应用程序都采用命令行参数。您可以解析/proc/pid/cmdline并解析出端口号。这避免了在具有大量连接的服务器上使用 ss 或 netstat 的巨大开销。
One thing that wasn't mentioned. Most port applications in python take a command line argument. You can parse /proc/pid/cmdline and parse out the port number. This avoids the large overhead of using ss or netstat on servers with a ton of connections.