0%

linux/mac 查看正在监听的端口

netstat

要列出正在侦听的所有 TCP 或 UDP 端口,包括使用端口的服务和套接字状态,请使用以下命令:

1
sudo netstat -tunlp

此命令中使用的选项具有以下含义:

  • -t - 显示 TCP 端口。
  • -u - 显示 UDP 端口。
  • -n - 显示数字地址而不是解析主机。
  • -l - 只显示监听端口。
  • -p - 显示监听进程的PID和名称。仅当您以 root 或sudo 用户身份运行命令时才会显示此信息。

输出将如下所示:

1
2
3
4
5
6
7
8
9
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 929/master
tcp6 0 0 :::3306 :::* LISTEN 534/mysqld
tcp6 0 0 :::80 :::* LISTEN 515/apache2
tcp6 0 0 :::22 :::* LISTEN 445/sshd
tcp6 0 0 :::25 :::* LISTEN 929/master
tcp6 0 0 :::33060 :::* LISTEN 534/mysqld
udp 0 0 0.0.0.0:68 0.0.0.0:* 966/dhclient

列的含义:

  • Proto - 套接字使用的协议
  • Local Address - 进程侦听的 IP 地址和端口号
  • PID/Program name - PID 和进程的名称

如果要过滤结果,请使用 grep 命令。

1
sudo netstat -tnlp | grep :22

输出显示这台机器上的 22 端口被 SSH 服务器使用:

1
2
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      445/sshd
tcp6 0 0 :::22 :::* LISTEN 445/sshd

如果输出为空,则表示端口上没有任何内容正在侦听。

您还可以根据条件过滤列表,例如 PID、协议、状态等。

ss

ss 是新的 netstat。它缺少一些 netstat 特性,但暴露了更多的 TCP 状态,而且速度稍快。命令选项基本相同,因此从 netstat 到的转换 ss 并不困难。

要通过 ss 获取所有侦听端口的列表:

1
sudo ss -tunlp

输出与 netstat 几乎相同:

1
2
3
4
5
6
7
8
State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port                                                                                        
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=445,fd=3))
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=929,fd=13))
LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=534,fd=30))
LISTEN 0 128 *:80 *:* users:(("apache2",pid=765,fd=4),("apache2",pid=764,fd=4),("apache2",pid=515,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=445,fd=4))
LISTEN 0 100 [::]:25 [::]:* users:(("master",pid=929,fd=14))
LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=534,fd=33))

lsof

lsof 是一个强大的命令行实用程序,可提供有关进程打开的文件的信息。

在 Linux 中,一切都是文件。您可以将套接字视为写入网络的文件。

要获取所有侦听 TCP 端口的列表,lsof 类型为:

1
sudo lsof -nP -iTCP -sTCP:LISTEN

使用的选项如下: * -n - 不要将端口号转换为端口名称。 * -p - 不解析主机名,显示数字地址。 * -iTCP -sTCP:LISTEN - 仅显示具有 TCP 状态 LISTEN 的网络文件。

1
2
3
4
5
6
7
8
9
10
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd 445 root 3u IPv4 16434 0t0 TCP *:22 (LISTEN)
sshd 445 root 4u IPv6 16445 0t0 TCP *:22 (LISTEN)
apache2 515 root 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)
mysqld 534 mysql 33u IPv6 19973 0t0 TCP *:33060 (LISTEN)
apache2 764 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
apache2 765 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
master 929 root 13u IPv4 19637 0t0 TCP *:25 (LISTEN)
master 929 root 14u IPv6 19638 0t0 TCP *:25 (LISTEN)

要查找正在侦听特定端口的进程,例如,3306您将使用的端口:

1
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN

输出显示 MySQL 服务器使用端口3306:

1
2
COMMAND PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)