Linux/UNIX如何找出正在指定端口中侦听的程序/服务
时间:2019-11-20 08:53:28 来源:igfitidea点击:
在Linux中,如何确定哪个服务正在侦听某个端口?
如何找出在特定TCP端口上进行侦听的程序?
解决方案
在Linux和UNIX中,可以使用下面的命令找出正在监听某个端口的程序:
lsof
:列出打开某个端口或者文件的程序netstat
:netstat命令以符号方式显示各种与网络相关的数据和信息的内容。
lsof命令示例
执行以下命令以查看系统上打开的IPv4端口:
# lsof -Pnl +M -i4
- P选项:禁止将端口号转换为网络文件的端口名。
- n选项:此选项禁止将网络号转换为网络文件的主机名。
- l选项:此选项禁止将用户ID号转换为登录名。
- M选项:启用报告本地TCP和UDP端口的端口映射程序注册。
- i4:只显示IPv4列表
- i6:只显示IPv6列表
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 680 32 6u IPv4 17882 0t0 UDP *:111[portmapper] rpcbind 680 32 7u IPv4 17887 0t0 UDP *:842 rpcbind 680 32 8u IPv4 17888 0t0 TCP *:111[portmapper] (LISTEN) avahi-dae 743 70 12u IPv4 21769 0t0 UDP *:5353 avahi-dae 743 70 13u IPv4 21770 0t0 UDP *:34807 chronyd 775 994 5u IPv4 21629 0t0 UDP 127.0.0.1:323 cupsd 1119 0 12u IPv4 26091 0t0 TCP 127.0.0.1:631 (LISTEN) sshd 1122 0 3u IPv4 24844 0t0 TCP *:22 (LISTEN) master 1414 0 13u IPv4 25506 0t0 TCP 127.0.0.1:25 (LISTEN) dnsmasq 1728 99 3u IPv4 26580 0t0 UDP *:67 dnsmasq 1728 99 5u IPv4 26583 0t0 UDP 192.168.122.1:53 dnsmasq 1728 99 6u IPv4 26584 0t0 TCP 192.168.122.1:53 (LISTEN) sshd 62356 0 3u IPv4 688785 0t0 TCP 192.168.56.130:22->192.168.56.1:13704 (ESTABLISHED) sshd 62362 1000 3u IPv4 688785 0t0 TCP 192.168.56.130:22->192.168.56.1:13704 (ESTABLISHED)
COMMAND 给出了有关程序或者服务的名称信息。
查看系统上打开的IPv6端口:
# lsof -Pnl +M -i6
netstat命令示例
使用netstat命令查看系统中监听的端口:
# netstat -tulpn
或者
# netstat -npl
- -t:TCP端口
- -u:UDP端口
- -l:仅显示监听套接字。
- -p:显示每个套接字/端口所属的程序的PID和名称
- -n:不进行DNS查找
输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1119/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1414/master tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 680/rpcbind tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1728/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1122/sshd tcp6 0 0 ::1:631 :::* LISTEN 1119/cupsd
关于/etc/services文件
在Liunx中, 文件/etc/services 包含了服务名和端口号之间映射的信息。
每个网络程序都调用此文件来获取其服务的端口号(和协议)。
所以很容易通过它找到系统默认服务打开的端口号:
$ cat /etc/services $ grep 110 /etc/services $ less /etc/services