本文目录导读:

Linux系统
使用 ss 命令
#!/bin/bash
# 获取所有监听端口及其对应进程
ss -tlnp | awk 'NR>1 {
split($4, addr, ":")
port = addr[length(addr)]
split($7, proc, ",")
gsub(/users:\(\(/, "", proc[1])
print port, proc[1]
}' | sort -u
使用 netstat 命令
#!/bin/bash
# 获取TCP/UDP端口与进程PID的关联
netstat -tulpn 2>/dev/null | grep -E "tcp|udp" | awk '{
split($4, addr, ":")
port = addr[length(addr)]
split($7, proc, "/")
if (proc[2] != "") {
print "端口:", port, "进程:", proc[2], "PID:", proc[1]
}
}'
使用 lsof 命令
#!/bin/bash
# 列出所有监听端口及其进程信息
lsof -i -P -n | grep LISTEN | awk '{
split($9, addr, ":")
port = addr[length(addr)]
print "进程:", $1, "PID:", $2, "端口:", port
}'
Windows系统
PowerShell脚本
# 获取进程端口关联
Get-NetTCPConnection | ForEach-Object {
$process = Get-Process -Id $_.OwningProcess
[PSCustomObject]@{
ProcessName = $process.ProcessName
PID = $_.OwningProcess
LocalPort = $_.LocalPort
RemotePort = $_.RemotePort
State = $_.State
}
} | Format-Table -AutoSize
# 简化为只显示监听端口
Get-NetTCPConnection | Where-Object {$_.State -eq "Listen"} |
Select-Object LocalPort, @{N="Process";E={(Get-Process -Id $_.OwningProcess).ProcessName}}
batch脚本
@echo off netstat -ano | findstr "LISTENING" echo 需要配合tasklist获取进程名
跨平台Python脚本
#!/usr/bin/env python3
import platform
import subprocess
import re
def get_linux_process_ports():
"""Linux系统获取进程端口关联"""
try:
result = subprocess.run(['ss', '-tlnp'], capture_output=True, text=True)
lines = result.stdout.strip().split('\n')[1:]
for line in lines:
parts = line.split()
if len(parts) >= 7:
addr = parts[3]
port = addr.split(':')[-1]
proc_info = parts[6]
proc_name = re.search(r'"(.+?)"', proc_info)
if proc_name:
print(f"端口: {port}, 进程: {proc_name.group(1)}")
except Exception as e:
print(f"错误: {e}")
def get_windows_process_ports():
"""Windows系统获取进程端口关联"""
try:
# 使用PowerShell命令
cmd = '''
Get-NetTCPConnection | Where-Object {$_.State -eq "Listen"} |
Select-Object LocalPort, @{N="Process";E={(Get-Process -Id $_.OwningProcess).ProcessName}}
'''
result = subprocess.run(['powershell', '-Command', cmd], capture_output=True, text=True)
print(result.stdout)
except Exception as e:
print(f"错误: {e}")
# 自动检测操作系统
if platform.system() == "Linux":
get_linux_process_ports()
elif platform.system() == "Windows":
get_windows_process_ports()
else:
print("不支持的操作系统")
实时监控脚本
#!/bin/bash
# 持续监控端口变化
while true; do
clear
echo "=== 进程端口关联 (刷新间隔: 2秒) ==="
echo ""
ss -tlnp 2>/dev/null | awk 'NR>1 {
split($4, addr, ":")
port = addr[length(addr)]
split($7, proc, ",")
gsub(/users:\(\(/, "", proc[1])
gsub(/\)\)/, "", proc[1])
printf "端口: %-8s 进程: %s\n", port, proc[1]
}'
sleep 2
done
高级功能:查找特定端口
#!/bin/bash
# 查找特定端口对应的进程
find_port_process() {
local port=$1
echo "查找端口 $port 的进程..."
# 在Linux上
info=$(ss -tlnp 2>/dev/null | grep ":$port ")
if [ -z "$info" ]; then
echo "端口 $port 未被使用"
return 1
fi
pid=$(echo $info | grep -oP 'pid=\K\d+')
proc_name=$(ps -p $pid -o comm= 2>/dev/null)
echo "端口: $port"
echo "PID: $pid"
echo "进程名: $proc_name"
echo "完整信息: $info"
}
# 使用示例
find_port_process 80
使用建议
- 权限要求:查看其他进程的端口信息通常需要root/administrator权限
- 命令选择:
- Linux推荐使用
ss(更快更现代) - Windows推荐使用PowerShell
- Linux推荐使用
- 安全考虑:生产环境使用前应在测试环境验证
选择最适合你操作系统和使用场景的方法即可。