在从bash翻译一些脚本时,我遇到了netstat -an的许多用法,以确定我们的某个服务是否在监听。虽然我知道我可以使用subprocess.call或其他甚至popen,但我宁愿使用pythonic解决方案,所以我没有利用我们正在操作的unix环境。
从我所读到的socket模块应该有一些东西,但我还没有看到任何检查监听端口的东西。可能是我不理解一个简单的技巧,但到目前为止,我知道如何连接到一个socket,并编写一些东西,让我知道什么时候连接失败。但不一定我找到了一些专门检查端口是否监听的东西。
有什么想法吗?
6条答案
按热度按时间hmmo2u0o1#
不如试着联系...
字符串
agxfikkp2#
我知道这个问题很老了,但我是为初学者写的。如果你想识别系统上的侦听端口,你可以使用下面的代码。
字符串
dsekswqp3#
在Linux上,我们可以使用strace来查看netstat -ln从/proc文件系统中阅读和解析各种值。
字符串
所以你可以从Python中读取这些文件并提取你需要的数据。
型
侦听套接字将具有远程地址0000000:0000
地址:端口对是十六进制的。参见:* How can i match each /proc/net/tcp entry to each opened socket?
你可以交叉引用/proc//fd。例如,sshd在我的笔记本电脑上运行。
的字符串
套接字6456对应于/proc/net/tcp第二行中列出的inode 6458。
因此,您可以从proc获取所有这些信息,但最终可能需要重新创建netstat -ltp
ecbunoof4#
字符串
参考:https://stackoverflow.com/a/6244270
gzjq41n45#
您可以尝试连接到有问题的端口,或模拟
netstat
。执行后者将是特定于操作系统的。在Linux上,您可以检查
/proc/net/tcp
。它看起来像这样:字符串
您正在查找
st
(“status”)列中包含0A
的行。local_address
中冒号后面的数字--C809
,16CC
等--是TCP端口号(十六进制),在这些端口上有侦听进程。vd2z7a6w6#
我知道我晚了好几年,但现有的答案都不够好。
我在谷歌搜索一个好的,优雅的解决方案,完全相同的问题,已经发布的答案似乎不够好,相反,我找到了自己的解决方案,我想把它们贴在这里,以帮助未来的读者谁得到谷歌重定向到这里。
大多数操作系统都有一个名为
netstat
的可执行文件,可以用来捕获侦听端口,在这个例子中,我使用的是Windows 10和Python 3.9.6 x64,但这是用Python编写的,所以你可以很容易地根据自己的用例进行调整。使用普通的
netstat
会非常慢,因为所有的名称解析,使用netstat -n
会成倍地快,因为它不会浪费时间解析名称。在Python 3.9.6中,使用
subproces.run()
运行os调用,使用capture_output=True
捕获标准输出,然后使用结果进程的.stdout
属性获取输出,结果是二进制形式,使用.decode()
获取字符串。那么输出应该如下所示:
字符串
使用
splitlines()
来获取单独的行,然后使用列表切片来获取实际表的内容,这里我们使用index 4,然后使用正则表达式分割来分割空格字符,然后使用index来获取本地地址值,最后使用字符串分割冒号和索引来获取端口。代码:
型
或者在一行代码中:
型
性能:
型
或者,
psutil
有一个.net_connections()
方法,你可以直接从它获取端口。只需使用set comprehension来获取输出:
型
这种方法比前一种方法快得多:
型