嗨,我觉得这是一个显而易见的问题,但到目前为止我还没有得到很好的答案。给定服务的名称(我知道在本地主机上运行),是否有任何网络命令行工具(例如(netstat
/ ss
))可以告诉我该服务正在哪个端口运行?理想情况下是这样的:
$ some-program --service-name='mysql' localhost
'mysql' is running at localhost:3306
我觉得有一些解决方案,但没有一个能够充分解决这个问题。例如,我考虑了以下两个ss
命令:
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:*
和
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)。
据我所知,标准netstat
和ss
命令将提供名称或端口,而不是两者都提供。但是您可以编写一个简单的程序,从其中获取输出ss
并将端口->名称映射添加到每一行。
答案2
将服务配置为绑定到与标准不同的端口是很常见的,因此grep
对于您正在寻找的进程名称来说,它可能更可靠,例如:
ss -lntpu | grep mysql
还适用于netstat
:
netstat -lntpu | grep ssh