Linux找出哪个进程正在监听端口

时间:2020-01-09 10:44:12  来源:igfitidea点击:

我如何找出正在运行的进程与Linux上的每个开放端口相关联?
我如何找出使用Linux在CLI下打开TCP端口#111或者UDP端口7000的进程?
端口不过是计算机网络中使用的通信端点。
您在硬件级别具有物理或者无线连接。
在软件或者操作系统级别,端口充当逻辑构造,并充当SSH,HTTPD等网络服务的通信端口。

TCP和UDP是最常见的端口。

TCP是传输控制协议的缩写。

UDP是用户数据报协议的缩写。
在此处查看UDP和TCP Internet协议之间的几个区别。
该页面显示Linux命令,以找出哪个进程在TCP或者UDP端口上列出。

Linux找出哪个进程正在监听端口

您可以使用以下程序查找端口号及其相关过程:

  • " netstat命令"或者" ss命令"是一种命令行工具,它显示网络连接,路由表和许多网络接口统计信息。
  • fuser command命令行工具,用于使用文件或者套接字标识进程。
  • lsof command是一个命令行工具,用于列出Linux/UNIX下的打开文件,以报告所有打开文件的列表以及打开它们的进程。
  • /proc/$pid /文件系统在Linux下/proc在/proc/PID处包含每个正在运行的进程(包括内核进程)的目录,其中包含有关该进程的信息,尤其是包括打开端口的进程名称。

您必须以root用户身份在命令上方运行。

Linux netstat命令找出端口上列出了哪个进程

执行以下命令:

# netstat -tulpn

输出示例:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1138/mysqld     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      850/portmap     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1607/apache2    
tcp        0      0 0.0.0.0:55091           0.0.0.0:*               LISTEN      910/rpc.statd   
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1467/dnsmasq    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      992/sshd        
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1565/cupsd      
tcp        0      0 0.0.0.0:7000            0.0.0.0:*               LISTEN      3813/transmission
tcp6       0      0 :::22                   :::*                    LISTEN      992/sshd        
tcp6       0      0 ::1:631                 :::*                    LISTEN      1565/cupsd      
tcp6       0      0 :::7000                 :::*                    LISTEN      3813/transmission
udp        0      0 0.0.0.0:111             0.0.0.0:*                           850/portmap     
udp        0      0 0.0.0.0:662             0.0.0.0:*                           910/rpc.statd   
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1467/dnsmasq    
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1467/dnsmasq    
udp        0      0 0.0.0.0:68              0.0.0.0:*                           3697/dhclient   
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           3813/transmission
udp        0      0 0.0.0.0:54746           0.0.0.0:*                           910/rpc.statd

TCP端口3306由具有PID 1138的mysqld进程打开。
您可以使用/proc进行验证,执行:

# ls -l /proc/1138/exe

输出示例:

lrwxrwxrwx 1 root root 0 2010-10-29 10:20 /proc/1138/exe -> /usr/sbin/mysqld

您可以使用grep命令或者egrep命令来过滤掉信息:

# netstat -tulpn | grep :80

输出示例:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1607/apache2

关于ss命令的注意事项

一些Linux发行版认为nestat命令已被弃用,因此应逐步淘汰,以支持更现代的替代方法,例如ss命令。
语法为:

$ sudo ss -tulpn
$ sudo ss -tulpn | grep :3306

fuser命令

找出打开tcp端口7000的进程PID,执行:

# fuser 7000/tcp

输出示例:

7000/tcp:             3813

最后,找出与PID 3813相关的过程名称,执行:

# ls -l /proc/3813/exe

输出示例:

lrwxrwxrwx 1 Hyman Hyman 0 2010-10-29 11:00 /proc/3813/exe -> /usr/bin/transmission

/usr/bin/transmission是一个Bittorrent客户端,执行:

# man transmission

或者

# whatis transmission

输出示例:

transmission (1)     - a bittorrent client

找出进程的当前工作目录

要查找名为bittorrent或者pid 3813的进程的当前工作目录,请执行:

# ls -l /proc/3813/cwd

输出示例:

lrwxrwxrwx 1 Hyman Hyman 0 2010-10-29 12:04 /proc/3813/cwd -> /home/Hyman

或者使用pwdx命令,执行:

# pwdx 3813

输出示例:

3813: /home/Hyman

查找Linux上进程的所有者

使用以下命令找出名为3813的进程PID的所有者:

# ps aux | grep 3813

或者

# ps aux | grep '[3]813'

输出示例:

Hyman     3813  1.9  0.3 188372 26628 ?        Sl   10:58   2:27 transmission

或者尝试以下ps命令:

# ps -eo pid,user,group,args,etime,lstart | grep '[3]813'

输出示例:

3813 Hyman    Hyman    transmission                   02:44:05 Fri Oct 29 10:58:40 2010

另一个选项是/proc/$PID/environ,执行:

# cat /proc/3813/environ

或者

# grep --color -w -a USER /proc/3813/environ

lsof命令示例

执行命令,如下所示:

lsof -i :portNumber 
lsof -i tcp:portNumber 
lsof -i udp:portNumber 
lsof -i :80
lsof -i :80 | grep LISTEN

输出示例:

apache2   1607     root    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1616 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1617 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1618 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1619 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1620 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)

现在,您将获得有关pid 1607或者1616等的更多信息:

# ps aux | grep '[1]616'

输出示例:

www-data 1616 0.0 0.0 35816 3880 ? S 10:20 0:00 /usr/sbin/apache2 -k start

我建议使用以下命令来获取有关pid 1616的信息:

# ps -eo pid,user,group,args,etime,lstart | grep '[1]616'

输出示例:

1616 www-data www-data /usr/sbin/apache2 -k start     03:16:22 Fri Oct 29 10:20:17 2010

其中:

  • 1616:PID
  • www-date:用户名(所有者EUID)
  • www-date:组名(组EGID)
  • /usr/sbin/apache2 -k start:命令名称及其参数
  • 03:16:22:自流程开始以来经过的时间,格式为[[dd-] hh:] mm:ss。
  • Fri Oct 29 10:20:17 2010:命令启动的时间。

/etc/services文件

/etc/services文件用于将端口号和协议映射到服务名称。
尝试匹配端口号:

$ grep port /etc/services
$ grep 443 /etc/services

输出示例:

https		443/tcp				# http protocol over TLS/SSL
https		443/udp