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