Linux 查看端口占用:从基础到进阶的全方位指南

在 Linux 系统管理中,端口占用是一个高频出现的问题。无论是部署服务时遇到的“端口已被占用”错误,还是排查网络故障、监控系统安全,准确识别端口的占用情况都是必备技能。端口作为网络通信的“门牌号”,一旦被错误进程占用,可能导致服务启动失败、数据传输异常甚至安全风险(如恶意程序监听敏感端口)。

本文将从端口的基础概念讲起,系统介绍 Linux 中查看端口占用的常用命令(如 netstatsslsoffusernmap),详解其语法、参数及实战案例,并延伸至高级用法(如过滤、脚本化)和常见故障排查场景。无论你是 Linux 初学者还是资深管理员,都能通过本文掌握端口管理的核心技能。

目录#

  1. 端口基础概念:你需要知道的核心知识

    • 1.1 什么是端口?
    • 1.2 TCP 与 UDP 端口的区别
    • 1.3 端口号的分类
    • 1.4 为什么端口会被“占用”?
  2. 常用命令详解:从基础到实战

    • 2.1 netstat:传统端口查看工具(含 deprecated 说明)
    • 2.2 ss:现代高效的端口查看工具(推荐)
    • 2.3 lsof:通过“文件”视角查看端口占用
    • 2.4 fuser:快速定位并管理占用端口的进程
    • 2.5 nmap:网络扫描与端口探测工具
  3. 高级用法:过滤、脚本化与权限管理

    • 3.1 结合 grep/awk 过滤端口信息
    • 3.2 端口监控脚本实战
    • 3.3 权限问题:为什么有些命令需要 root?
  4. 实战故障排查案例

    • 4.1 案例 1:服务启动失败——“地址已在使用”
    • 4.2 案例 2:识别并处理可疑端口占用
    • 4.3 案例 3:批量检查服务器端口状态
  5. 总结:如何选择合适的工具?

  6. 参考资料

1. 端口基础概念:你需要知道的核心知识#

在学习“查看端口占用”之前,我们先明确几个基础概念,避免后续操作中“知其然不知其所以然”。

1.1 什么是端口?#

端口(Port)是操作系统中用于标识网络进程的逻辑端点。它并非物理设备,而是一个 16 位的整数(范围 0-65535),用于区分同一台主机上不同网络服务的通信通道。

例如:当你通过浏览器访问 http://example.com 时,实际上是连接到服务器的 80 端口(HTTP 默认端口);使用 HTTPS 时,则连接到 443 端口。操作系统通过“IP 地址 + 端口号”的组合,将网络数据准确发送到对应的进程。

1.2 TCP 与 UDP 端口的区别#

端口按传输层协议可分为 TCP 端口UDP 端口,两者的核心区别在于协议特性:

  • TCP(传输控制协议):面向连接、可靠传输(三次握手建立连接,四次挥手断开),适用于对数据完整性要求高的场景(如 HTTP、FTP、SSH)。TCP 端口的占用会显示为“已建立连接”或“监听中”。

  • UDP(用户数据报协议):无连接、不可靠传输(数据直接发送,不确认对方是否接收),适用于实时性要求高的场景(如 DNS、DHCP、视频流)。UDP 端口的占用通常表现为“监听中”(但无连接状态)。

同一端口号可同时被 TCP 和 UDP 协议使用(例如:DNS 同时使用 UDP 53 和 TCP 53),因为协议不同,它们被视为独立的端点。

1.3 端口号的分类#

端口号范围为 0-65535,按用途分为三类:

类别范围说明
公认端口(Well-Known Ports)0-1023由 IANA(互联网号码分配机构)分配,绑定系统核心服务(如 80=HTTP、22=SSH)。普通用户进程需 root 权限才能绑定。
注册端口(Registered Ports)1024-49151用于用户级应用或服务(如 3306=MySQL、8080=常见 Web 服务),需向 IANA 注册(非强制)。
动态/私有端口(Dynamic/Private Ports)49152-65535临时端口,由客户端程序随机使用(如浏览器访问网站时,客户端会临时占用一个动态端口与服务器通信)。

1.4 为什么端口会被“占用”?#

当一个进程启动并调用 bind() 系统调用时,会请求操作系统分配一个端口。若端口已被其他进程绑定(且未释放),则会返回 EADDRINUSE(地址已在使用) 错误,即“端口被占用”。常见原因包括:

  • 进程未正常退出:服务崩溃或被强制终止后,端口可能因“TIME_WAIT”状态(TCP 连接断开后的等待时间,默认 60 秒)未释放,导致暂时无法重新绑定。

  • 服务重复启动:同一服务(如 Nginx)被多次启动,后启动的进程会因端口已被占用而失败。

  • 恶意程序占用:黑客通过病毒或后门程序监听敏感端口(如 21=FTP、3389=远程桌面),窃取数据或控制服务器。

2. 常用命令详解:从基础到实战#

Linux 提供了多种工具查看端口占用,以下是最常用的 5 类命令,涵盖从基础到进阶的场景。

2.1 netstat:传统端口查看工具#

netstat(Network Statistics)是最经典的网络状态查看命令,支持列出所有网络连接、路由表、接口统计等。尽管 netstat 已被 ss 取代(部分 Linux 发行版默认不预装),但因长期使用习惯,仍需掌握。

2.1.1 安装 netstat#

netstat 属于 net-tools 工具包,若系统提示“command not found”,需手动安装:

  • Debian/Ubuntusudo apt install net-tools

  • CentOS/RHELsudo yum install net-toolssudo dnf install net-tools

2.1.2 核心参数与语法#

基本语法:

netstat [选项]

常用选项(可组合使用):

选项说明
-t仅显示 TCP 端口。
-u仅显示 UDP 端口。
-l仅显示“监听中”(Listening)的端口(即服务端进程绑定的端口,等待客户端连接)。
-n以数字形式显示 IP 和端口(不解析主机名、端口名,如直接显示 80 而非 http)。
-p显示占用端口的进程 PID 和名称(需 root 权限,否则显示 -)。
-a显示所有连接(包括监听中、已建立连接、TIME_WAIT 等状态),默认不显示 TIME_WAIT

2.1.3 实战案例#

案例 1:查看所有监听中的 TCP/UDP 端口(常用)#
netstat -tuln

输出示例:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
udp        0      0 0.0.0.0:5353            0.0.0.0:*                          
udp        0      0 192.168.1.100:68        0.0.0.0:*                          
  • Proto:协议(tcp/udp)。

  • Local Address:本地 IP:端口(0.0.0.0:22 表示监听所有网卡的 22 端口)。

  • State:TCP 连接状态(LISTEN=监听中,UDP 无状态故为空)。

案例 2:查看监听端口对应的进程(需 root)#
sudo netstat -tulnp

输出示例(增加了 PID/Program name 列):

Active Internet connections (only servers)
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      123/sshd: /usr/sbin 
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      456/mysqld          
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           789/avahi-daemon: r

可直接看到:22 端口由 sshd(PID 123)占用,3306 端口由 mysqld(PID 456)占用。

案例 3:查看所有 TCP 连接(包括已建立连接)#
netstat -tan

输出中会包含 ESTABLISHED(已建立连接)、TIME_WAIT(等待释放)等状态,例如:

tcp        0      0 192.168.1.100:22        10.0.0.5:54321          ESTABLISHED
tcp        0      0 192.168.1.100:80        203.0.113.10:8080       TIME_WAIT

2.2 ss:现代高效的端口查看工具#

ss(Socket Statistics)是 iproute2 工具包的一部分,用于替代 netstat。它直接读取内核数据结构(/proc/net/tcp 等),速度更快、信息更全,尤其在高并发场景(如大量 TCP 连接)下优势明显。推荐优先使用 ss

2.2.1 安装 ss#

ss 通常随 iproute2 预装在 Linux 系统中,若缺失,安装 iproute2 即可:

  • Debian/Ubuntusudo apt install iproute2

  • CentOS/RHELsudo yum install iproute2

2.2.2 核心参数与语法#

基本语法:

ss [选项]

常用选项(与 netstat 类似,部分参数更直观):

选项说明
-t/--tcp显示 TCP 端口。
-u/--udp显示 UDP 端口。
-l/--listening显示监听中端口。
-n/--numeric数字形式显示 IP 和端口。
-p/--processes显示占用端口的进程(需 root 权限)。
-a/--all显示所有连接(监听中、已建立、关闭等)。
-o/--options显示 TCP 连接的定时器信息(如 TIME_WAIT 剩余时间)。
-i/--info显示 TCP 连接的内部信息(如拥塞控制算法、发送/接收缓冲区大小)。
-4/-6仅显示 IPv4/IPv6 端口。

2.2.3 实战案例#

案例 1:查看监听中的 TCP/UDP 端口(等效于 netstat -tuln#
ss -tuln

输出示例(格式与 netstat 类似,但更紧凑):

State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128          0.0.0.0:22                      0.0.0.0:*                  
LISTEN      0      80           127.0.0.1:3306                   0.0.0.0:*                  
UNCONN      0      0           0.0.0.0:5353                     0.0.0.0:*                  
UNCONN      0      0         192.168.1.100:68                    0.0.0.0:*                  
案例 2:查看监听端口的进程(需 root,等效于 netstat -tulnp#
sudo ss -tulnp

输出示例(PID 和进程名直接显示在 Process 列):

State       Recv-Q Send-Q Local Address:Port               Peer Address:Port               Process                             
LISTEN      0      128          0.0.0.0:22                      0.0.0.0:*                   users:(("sshd",pid=123,fd=3))      
LISTEN      0      80           127.0.0.1:3306                   0.0.0.0:*                   users:(("mysqld",pid=456,fd=30))    
案例 3:查看 TCP 连接的 TIME_WAIT 状态及剩余时间#
ss -to | grep TIME-WAIT

输出示例(timer:(timewait,25sec) 表示剩余 25 秒释放):

TIME-WAIT   0      0        192.168.1.100:80                 203.0.113.10:8080               timer:(timewait,25sec)
案例 4:查看 TCP 连接的详细信息(如缓冲区大小)#
ss -ti | grep ESTAB

输出示例(包含发送/接收缓冲区、拥塞控制算法等):

ESTAB       0      0        192.168.1.100:22                 10.0.0.5:54321                  cubic wscale:7,7 rto:204 rtt:50.562/12.641 ato:40 mss:1448 rcvmss:1448 advmss:1448 cwnd:10 bytes_acked:12345 bytes_received:6789 segs_out:10 segs_in:8 data_segs_out:5 data_segs_in:3 send 1.2Mbps lastsnd:123 lastrcv:123 lastack:123

2.3 lsof:通过“文件”视角查看端口占用#

lsof(List Open Files)是一个强大的工具,用于列出系统中所有被进程打开的文件。在 Linux 中,网络连接也被视为“文件”(一切皆文件),因此 lsof 可通过 -i 选项查看端口占用情况。lsof 的优势在于能关联端口与进程的详细信息(如用户、文件描述符)。

2.3.1 安装 lsof#

lsof 通常预装,若缺失:

  • Debian/Ubuntusudo apt install lsof

  • CentOS/RHELsudo yum install lsof

2.3.2 核心参数与语法#

基本语法(查看端口占用):

lsof -i [46][protocol][@hostname|hostaddr][:service|port]

参数说明:

参数示例说明
-ilsof -i显示所有网络文件(包括 TCP/UDP 连接、监听端口)。
-i :portlsof -i :80显示占用指定端口(TCP 或 UDP)的进程。
-i tcp:portlsof -i tcp:22仅显示 TCP 协议的指定端口。
-i udp:portlsof -i udp:53仅显示 UDP 协议的指定端口。
-Plsof -i -P禁用端口号到服务名的转换(如显示 80 而非 http)。
-nlsof -i -n禁用 IP 到主机名的转换(如显示 192.168.1.100 而非 server.local)。
-u userlsof -i -u root显示指定用户占用的网络端口。

2.3.3 实战案例#

案例 1:查看指定端口(如 80)的占用情况#
lsof -i :80

输出示例:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx    1234   root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)
nginx    1235 nobody    6u  IPv4  12345      0t0  TCP *:http (LISTEN)
  • COMMAND:进程名(nginx)。

  • PID:进程 ID(1234、1235,主进程与工作进程)。

  • USER:进程所属用户(rootnobody)。

  • FD:文件描述符(6u 表示 6 号文件描述符,u=可读可写)。

  • TYPE:文件类型(IPv4=IPv4 网络连接)。

  • NAME:网络地址(*:http 表示监听所有 IP 的 80 端口,http 是服务名,可用 -P 显示为 *:80)。

案例 2:查看 TCP 端口 22(SSH)的占用情况#
lsof -i tcp:22 -P -n

输出示例(-P -n 禁用名称解析,更简洁):

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    5678 root    3u  IPv4  67890      0t0  TCP *:22 (LISTEN)
sshd    7890 root    3u  IPv4  89012      0t0  TCP 192.168.1.100:22->10.0.0.5:54321 (ESTABLISHED)
  • 第一行:LISTEN 状态,表示 sshd 监听 22 端口。

  • 第二行:ESTABLISHED 状态,表示已与 10.0.0.5:54321 建立 SSH 连接。

案例 3:查看所有监听中的端口(等效于 netstat -tuln#
lsof -i -P -n | grep LISTEN

输出示例(通过 grep LISTEN 过滤监听状态):

sshd      5678 root    3u  IPv4  67890      0t0  TCP *:22 (LISTEN)
mysqld    4567 mysql   10u  IPv4  56789      0t0  TCP 127.0.0.1:3306 (LISTEN)
nginx     1234 root    6u  IPv4  12345      0t0  TCP *:80 (LISTEN)

2.4 fuser:快速定位并管理占用端口的进程#

fuser(File User)用于识别“使用指定文件或文件系统的进程”,也可通过 -n 选项指定“网络命名空间”,从而查看占用端口的进程。fuser 的特点是简洁高效,尤其适合快速获取 PID 并进行管理(如终止进程)。

2.4.1 安装 fuser#

fuser 属于 psmisc 工具包,通常预装,若缺失:

  • Debian/Ubuntusudo apt install psmisc

  • CentOS/RHELsudo yum install psmisc

2.4.2 核心参数与语法#

基本语法(查看端口占用):

fuser [选项] [-n protocol] port

参数说明:

参数示例说明
-n tcp/udpfuser -n tcp 80指定协议(tcp/udp),查看占用端口的进程 PID。
port/protocolfuser 80/tcp简化写法,直接指定“端口/协议”(等效于 -n tcp 80)。
-v/--verbosefuser -v 443/tcp详细模式,显示进程的用户、PID、命令等信息。
-k/--killfuser -k 8080/tcp终止占用端口的进程(需谨慎使用!)。
-i/--interactivefuser -ki 80/tcp终止进程前提示确认。

2.4.3 实战案例#

案例 1:快速查看占用端口的 PID(简洁模式)#
fuser 80/tcp

输出示例(直接返回 PID):

80/tcp:              1234 1235

表示 TCP 80 端口被 PID 1234 和 1235 的进程占用(对应 lsof 示例中的 Nginx 主进程和工作进程)。

案例 2:查看端口占用的详细信息(详细模式)#
fuser -v 22/tcp

输出示例(类似 ps 格式):

                     USER        PID ACCESS COMMAND
22/tcp:              root       5678 F.... sshd
  • ACCESS:进程对端口的访问模式(F=文件描述符,.=当前未访问)。

  • COMMAND:进程名(sshd)。

案例 3:终止占用端口的进程(需谨慎)#

若需强制释放端口(如服务卡死无法正常停止),可使用 -k 选项终止进程:

sudo fuser -k 8080/tcp  # 终止占用 8080/tcp 的进程

警告:直接终止进程可能导致数据丢失,建议先通过 pslsof 确认进程安全性(如是否为关键服务)。如需确认,可添加 -i 选项:

sudo fuser -ki 8080/tcp

输出提示:

8080/tcp:              9012
Kill process 9012? (y/N) y

2.5 nmap:网络扫描与端口探测工具#

nmap(Network Mapper)是一款开源网络扫描工具,主要用于探测目标主机的开放端口、服务版本、操作系统等。与上述工具不同,nmap 不仅可查看本地端口,还能扫描远程主机的端口状态,是网络管理员和安全人员的必备工具。

2.5.1 安装 nmap#

  • Debian/Ubuntusudo apt install nmap

  • CentOS/RHELsudo yum install nmap

2.5.2 核心参数与语法#

基本语法(扫描本地端口):

nmap [扫描类型] -p [端口范围] [目标主机]

常用扫描类型与参数:

参数说明
-p port指定端口(如 -p 80-p 1-1000-p 80,443)。
-sT/-sTCPTCP 连接扫描(完整三次握手,准确性高,但易被防火墙检测)。
-sU/-sUDPUDP 扫描(探测 UDP 端口,速度较慢,因 UDP 无连接特性)。
-sS/-sSYNTCP SYN 半开扫描(仅发送 SYN 包,不建立完整连接,隐蔽性强,需 root)。
-O/--os-detection探测目标主机的操作系统。
-sV/--service-version探测端口上运行的服务版本(如 nginx 1.21.0)。

2.5.3 实战案例#

案例 1:扫描本地主机的 1-1000 端口(TCP)#
nmap -p 1-1000 localhost

输出示例:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-01 10:00 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00012s latency).
Not shown: 997 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds
  • STATE:端口状态(open=开放,closed=关闭,filtered=被防火墙过滤)。

  • SERVICE:默认服务名(可通过 -sV 获取具体版本)。

案例 2:扫描远程主机的指定端口(如 80、443)#
nmap -sT -p 80,443 example.com

输出示例(探测 example.com 的 80 和 443 端口):

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-01 10:05 CST
Nmap scan report for example.com (93.184.216.34)
Host is up (0.20s latency).

PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 0.85 seconds
案例 3:探测端口服务版本(-sV#
nmap -sV -p 22 localhost

输出示例(显示 SSH 服务版本):

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)

3. 高级用法:过滤、脚本化与权限管理#

掌握基础命令后,我们进一步学习如何通过过滤工具(如 grepawk)处理输出、编写自动化脚本监控端口,以及理解命令所需的权限。

3.1 结合 grep/awk 过滤端口信息#

netstatsslsof 等命令的输出通常包含大量信息,通过 grep 过滤关键词(如端口号、进程名)或 awk 提取特定列,可快速定位目标。

3.1.1 用 grep 过滤特定端口或进程#

  • 示例 1:查看端口 8080 的占用情况(无论协议):

    ss -tulnp | grep 8080
  • 示例 2:查看 nginx 进程占用的所有端口:

    lsof -i -P -n | grep nginx
  • 示例 3:查看所有已建立的 SSH 连接(端口 22,状态 ESTABLISHED):

    netstat -tan | grep ':22' | grep ESTABLISHED

3.1.2 用 awk 提取关键列(如 PID、端口)#

awk 用于按列处理文本,适合提取结构化输出中的特定字段(如 PID、端口号)。

  • 示例 1:从 ss -tulnp 输出中提取“端口-PID-进程名”:

    sudo ss -tulnp | awk 'NR>1 {split($4, port, ":"); print "Port: " port[2], "PID: " $6}'

    输出示例:

    Port: 22 PID: users:(("sshd",pid=123,fd=3))
    Port: 3306 PID: users:(("mysqld",pid=456,fd=30))
    
  • 示例 2:从 lsof -i :80 输出中提取 PID(第 2 列):

    lsof -i :80 | awk 'NR>1 {print $2}'  # NR>1 跳过表头

    输出示例(仅 PID):

    1234
    1235
    

3.2 端口监控脚本实战#

编写 Bash 脚本可实现端口状态的自动化监控(如定时检查端口是否开放,异常时发送告警)。

3.2.1 脚本 1:检查指定端口是否开放#

#!/bin/bash
# 检查端口是否开放的脚本,用法:./check_port.sh port
 
port=$1
if [ -z "$port" ]; then
    echo "用法:$0 <端口号>"
    exit 1
fi
 
# 使用 ss 检查端口是否监听中
result=$(ss -tuln | grep ":$port")
 
if [ -n "$result" ]; then
    echo "端口 $port 已开放,占用进程:"
    sudo ss -tulnp | grep ":$port"
else
    echo "端口 $port 未开放"
fi

使用方法:

chmod +x check_port.sh
./check_port.sh 80  # 检查 80 端口

3.2.2 脚本 2:定时监控端口并记录日志#

#!/bin/bash
# 定时监控端口状态并记录日志,每 5 分钟检查一次
 
port=8080
log_file="/var/log/port_monitor.log"
 
while true; do
    timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    # 检查端口是否开放
    if ss -tuln | grep -q ":$port"; then
        status="开放"
        pid=$(sudo ss -tulnp | grep ":$port" | awk '{split($6, pid, "pid="); split(pid[2], pid, ","); print pid[1]}')
        echo "[$timestamp] 端口 $port 状态:$status,PID:$pid" >> "$log_file"
    else
        status="关闭"
        echo "[$timestamp] 端口 $port 状态:$status" >> "$log_file"
    fi
    sleep 300  # 5分钟(300秒)检查一次
done

启动脚本:

nohup ./port_monitor.sh &  # 后台运行,日志输出到 nohup.out

3.3 权限问题:为什么有些命令需要 root?#

在使用 netstat -pss -plsof -i 等命令时,若未加 sudo,可能无法显示进程名或 PID(显示为 - 或无权限)。这是因为:

  • 进程信息属于敏感数据:非 root 用户只能查看自己的进程,而 root 可查看所有用户的进程。

  • 端口绑定权限:公认端口(0-1023)需 root 权限绑定,非 root 进程绑定此类端口会失败(可通过 CAP_NET_BIND_SERVICE capability 赋予非 root 用户权限,如 setcap 'cap_net_bind_service=+ep' /path/to/program)。

解决方法:需要查看完整进程信息时,使用 sudo 提升权限(如 sudo ss -tulnp)。

4. 实战故障排查案例#

以下通过真实场景演示如何使用上述命令解决端口占用问题。

4.1 案例 1:服务启动失败——“地址已在使用”#

问题:启动 Nginx 时提示 bind() to 0.0.0.0:80 failed (98: Address already in use)

排查步骤

  1. 确认 80 端口占用情况

    sudo ss -tulnp | grep 80  # 或 lsof -i :80

    输出发现:apache2 进程(PID 567)占用了 80 端口。

  2. 处理冲突

    • 若 Apache 是多余服务:停止 Apache 并禁用开机启动:
      sudo systemctl stop apache2
      sudo systemctl disable apache2
    • 若需保留 Apache:修改 Nginx 配置文件(/etc/nginx/nginx.conf),将端口从 80 改为 8080,重启 Nginx:
      sudo systemctl restart nginx

4.2 案例 2:识别未知进程占用敏感端口#

问题:服务器上发现端口 4444 被未知进程占用,怀疑恶意程序。

排查步骤

  1. 定位进程 PID

    sudo fuser -v 4444/tcp

    输出显示 unknown_proc(PID 9876)占用端口。

  2. 查看进程详细信息

    ps aux | grep 9876  # 查看进程命令行、用户、路径
    ls -l /proc/9876/exe  # 查看进程可执行文件路径(/proc/PID/exe 是进程的符号链接)
  3. 判断安全性:若可执行文件路径异常(如 /tmp/unknown_proc),且用户为 nobody,极可能是恶意程序。

  4. 处理措施:终止进程并删除文件:

    sudo kill -9 9876
    sudo rm -f /tmp/unknown_proc

4.3 案例 3:批量检查服务器端口状态#

问题:作为管理员,需检查多台服务器的常用端口(22、80、443、3306)是否正常开放。

解决方案:使用 nmap 批量扫描(需服务器允许 ICMP 和端口扫描):

#!/bin/bash
# 批量检查服务器端口状态
 
servers=("server1" "server2" "server3")  # 服务器列表(IP 或主机名)
ports="22,80,443,3306"  # 需检查的端口
 
for server in "${servers[@]}"; do
    echo "=== 检查 $server ==="
    nmap -p "$ports" "$server" | grep "open"  # 仅显示开放的端口
    echo "-------------------"
done

输出示例:

=== 检查 server1 ===
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https
-------------------
=== 检查 server2 ===
22/tcp  open  ssh
3306/tcp open  mysql
-------------------

5. 总结:如何选择合适的工具?#

Linux 查看端口的工具各有侧重,选择时可参考以下场景:

工具优势适用场景
ss速度快、信息全、支持高并发日常端口查看(推荐)、脚本自动化
lsof关联进程与文件,支持按端口/进程过滤需详细进程信息(如用户、文件描述符)
fuser简洁高效,支持直接终止进程快速定位 PID 并释放端口(需谨慎)
nmap支持远程扫描、服务版本探测网络监控、远程服务器端口检查
netstat传统工具,兼容性好但速度慢老系统或习惯 netstat 命令的场景

最佳实践:日常优先使用 ss -tulnp 查看监听端口;需定位具体进程时用 lsof -i :port;远程扫描用 nmap;快速释放端口用 fuser -k(配合 -i 确认)。

6. 参考资料#

  1. netstat 手册:man netstat
  2. ss 手册:man ss
  3. lsof 手册:man lsof
  4. fuser 手册:man fuser
  5. nmap 官方文档:https://nmap.org/docs.html
  6. Linux 内核文档:https://www.kernel.org/doc/html/latest/networking/socket.html
  7. IANA 端口分配列表:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml