如何获取进程正在监听的端口?

发布于 2024-09-04 17:04:40 字数 44 浏览 9 评论 0原文

如何使用 python 获取进程正在侦听的端口?进程的 pid 是已知的。

How do I get the ports that a process is listening on using python? The pid of the process is known.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

傲鸠 2024-09-11 17:04:40

您可以使用 psutil:

>>> import psutil
>>> p = psutil.Process(2549)
>>> p.name()
'proftpd: (accepting connections)'
>>> p.connections()
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]

...来过滤侦听套接字:

>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN]
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]
>>>

You can use psutil:

>>> import psutil
>>> p = psutil.Process(2549)
>>> p.name()
'proftpd: (accepting connections)'
>>> p.connections()
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]

...To filter for listening sockets:

>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN]
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]
>>>
淡淡の花香 2024-09-11 17:04:40

我的回答分为两部分:

1.在 shell 中获取信息

对于第一部分,netstat 可以工作,但我更喜欢使用 lsof,因为它可用于提取信息更丰富且更详细的信息。简洁的清单。使用的确切选项可能会根据您的操作系统、内核和编译选项而有所不同,但我相信您想要这样的东西:

lsof -a -p23819 -i4

其中 23819 是您选择的 PID,i4 表示所有 IPv4 套接字(尽管您可能需要 i6 用于 IPv6,视情况而定)。从那里,您可以通过 grep 管道来仅选择侦听套接字。

lsof -a -p23819 -i4 | grep LISTEN

(在lsof版本4.82中,您还可以使用-sTCP:LISTEN标志而不是grep来选择侦听套接字,尽管此选项不会似乎在 4.78 版本中可用)

2。从Python 调用lsof

您应该能够使用subprocess 模块从Python 调用lsof 并读取输出,例如所以:

from subprocess import Popen, PIPE
p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE)
p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

希望这有帮助!

There are two parts to my answer:

1. Getting the information in the shell

For the first part, netstat would work, but I prefer using lsof, 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:

lsof -a -p23819 -i4

Where 23819 is the PID you are selecting for, and i4 denotes all IPv4 sockets (though you might want i6 for IPv6, as the case may be). From there, you can pipe through grep to select only listening sockets.

lsof -a -p23819 -i4 | grep LISTEN

(In lsof version 4.82, you can additionally use the -sTCP:LISTEN flag instead of grep to select listening sockets, though this option doesn't seem to be available back in version 4.78)

2. Calling lsof from Python

You should be able to call lsof and read the output, from Python, using the subprocess module, like so:

from subprocess import Popen, PIPE
p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE)
p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

Hope this helps!

于我来说 2024-09-11 17:04:40

如果您不想解析像 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.

没有伤那来痛 2024-09-11 17:04:40

您可以使用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.

深海夜未眠 2024-09-11 17:04:40

有一件事没有提到。 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文