给定一个服务名称,获取其端口号?

给定一个服务名称,获取其端口号?

嗨,我觉得这是一个显而易见的问题,但到目前为止我还没有得到很好的答案。给定服务的名称(我知道在本地主机上运行),是否有任何网络命令行工具(例如(netstat/ ss))可以告诉我该服务正在哪个端口运行?理想情况下是这样的:

$ some-program --service-name='mysql' localhost
'mysql' is running at localhost:3306

我觉得有一些解决方案,但没有一个能够充分解决这个问题。例如,我考虑了以下两个ss命令:

  1. ss -tuln与输出:
Netid   State    Recv-Q   Send-Q       Local Address:Port        Peer Address:Port   Process
udp     UNCONN   0        0            127.0.0.53%lo:53               0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:21119            0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:37766            0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:54399            0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:5353             0.0.0.0:*
udp     UNCONN   0        0                     [::]:51755               [::]:*
udp     UNCONN   0        0                     [::]:5353                [::]:*
udp     UNCONN   0        0                        *:1716                   *:*
tcp     LISTEN   0        100              127.0.0.1:25               0.0.0.0:*
tcp     LISTEN   0        70               127.0.0.1:33060            0.0.0.0:*
tcp     LISTEN   0        64                 0.0.0.0:59687            0.0.0.0:*
tcp     LISTEN   0        151              127.0.0.1:3306             0.0.0.0:*

  1. ss -tul与输出:
Netid   State    Recv-Q   Send-Q      Local Address:Port         Peer Address:Port   Process
udp     UNCONN   0        0                 0.0.0.0:36308             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:36570             0.0.0.0:*
udp     UNCONN   0        0           127.0.0.53%lo:domain            0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:41124             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:21119             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:37766             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:54399             0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:mdns              0.0.0.0:*
udp     UNCONN   0        0                 0.0.0.0:54522             0.0.0.0:*
udp     UNCONN   0        0                    [::]:51755                [::]:*
udp     UNCONN   0        0                    [::]:mdns                 [::]:*
udp     UNCONN   0        0                       *:1716                    *:*
tcp     LISTEN   0        100             127.0.0.1:smtp              0.0.0.0:*
tcp     LISTEN   0        70              127.0.0.1:33060             0.0.0.0:*
tcp     LISTEN   0        64                0.0.0.0:59687             0.0.0.0:*
tcp     LISTEN   0        151             127.0.0.1:mysql             0.0.0.0:*

第一个命令的输出列出了正在侦听的端口号,而第二个命令的输出能够将它们解析为在端口上运行的服务。但我无法以某种方式“组合”两个输出,在这两个输出中,我可以将端口号映射到并排运行的服务。例如行:

tcp     LISTEN   0        151             127.0.0.1:mysql             0.0.0.0:*

tcp     LISTEN   0        151              127.0.0.1:3306             0.0.0.0:*

将被“组合”为“127.0.0.1:3306 (mysql)”或类似的东西。我只知道上面的映射,因为我用谷歌搜索了默认的 MySQL 端口是什么。

有没有办法做到这一点?必须说的是,我只是在学习使用这些网络工具,因此非常感谢任何指导。

答案1

有两个标准库调用;getservbyname(3)getservbyport(3)。这些允许程序将名称(例如telnet)转换为端口 (23),或从端口转换回名称。

典型的实现使用/etc/services权威来源,但这可以通过services中的条目进行更改nsswitch.conf

该命令getent可用于执行一些查找,包括服务条目。

例如从端口转换为名称

% getent services 80
http                  80/tcp www www-http

这告诉我端口 80/tcp 被映射到“http”作为服务名称,但也有别名“www”和“www-http”。

类似地从名称到端口

% getent services https       
https                 443/tcp

我们可以看到 https 位于端口 443/tcp 上。

这些服务名称只是这些端口的注册值。它们不对应于流程(它可能是 apache、nginx、python 脚本...)并且它不保证进程使用这些(例如,如果配置为 apache 可以侦听端口 12345)。

据我所知,标准netstatss命令将提供名称或端口,而不是两者都提供。但是您可以编写一个简单的程序,从其中获取输出ss并将端口->名称映射添加到每一行。

答案2

将服务配置为绑定到与标准不同的端口是很常见的,因此grep对于您正在寻找的进程名称来说,它可能更可靠,例如:

ss -lntpu | grep mysql

还适用于netstat

netstat -lntpu | grep ssh

相关内容