尝试getservbyport在python3中显示mongod服务



我最近在学习python3的套接字编程。当我尝试getservbyport方法来显示mongod的服务名称时,这是一个令人烦恼的小问题。

这是我的代码:

import socket
print(socket.getservbyport(80))   # 'http' returns as expected
print(socket.getservbyport(3306))   # 'mysql' returns as expected
print(socket.getservbyport(27017))   # OSError: port/proto not found

需要确认的是,mongod 同时在另一个终端窗口中的端口 27017 上运行。

MongoDB starting : pid=18791 port=27017 dbpath=/data/db 64-bit host=xxx

那么print(socket.getservbyport(27017))为什么不返回像僧侣这样的东西呢?

socket.getservbyport()函数将端口号转换为通常在 IANA(互联网号码分配机构)注册的知名服务。在类 UNIX 系统上,您通常会在纯文本文件中找到已知服务的本地列表:/etc/services

getservbyport映射只是方便查找可以合理预期侦听给定端口的服务。这不会检查当前是否有服务在主动侦听,或者侦听服务是否实际上是预期的服务。

那么print(socket.getservbyport(27017))为什么不返回像僧侣这样的东西呢?

这意味着您的/etc/services文件(或等效文件)没有将端口 27017 与mongod关联的条目。更具体地说,端口 27017 目前未与 IANA 协议端口号注册管理机构上的mongod正式关联。

可以将本地条目添加到/etc/services文件中,但是任何更改都可能在将来的操作系统更新中被覆盖。

例如,如果您编辑/etc/services并为mongod添加一个条目,您应该会看到这是 Pythonsocket.getservbyport(27017)调用的结果:

mongod          27017/tcp   # MongoDB

需要确认的是,mongod 同时在另一个终端窗口中的端口 27017 上运行。

对于更全面的端口映射(包括检测侦听端口的正在运行的服务),我会考虑使用python-nmap.Nmap包含一个nmap-services文件,其中包含其他公共端口关联,包括MongoDB的几个关联(即MongoDB手册的默认MongoDB端口部分中列出的那些)。默认情况下,Nmap 仅扫描端口和服务子集,因此您必须查看 Nmap 文档,了解根据要扫描的端口和服务范围提供的正确选项组合。

最新更新