怎么用脚本获取进程端口关联

wen 实用脚本 2

本文目录导读:

怎么用脚本获取进程端口关联

  1. Linux系统
  2. Windows系统
  3. 跨平台Python脚本
  4. 实时监控脚本
  5. 高级功能:查找特定端口
  6. 使用建议

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

使用建议

  1. 权限要求:查看其他进程的端口信息通常需要root/administrator权限
  2. 命令选择
    • Linux推荐使用 ss(更快更现代)
    • Windows推荐使用PowerShell
  3. 安全考虑:生产环境使用前应在测试环境验证

选择最适合你操作系统和使用场景的方法即可。

抱歉,评论功能暂时关闭!