脚本如何检测端口是否被占用

wen 实用脚本 1

本文目录导读:

脚本如何检测端口是否被占用

  1. Python 脚本方法
  2. Bash/Shell 脚本
  3. Node.js 脚本
  4. 通用检测原理
  5. 注意事项

Python 脚本方法

使用 socket 库(推荐)

import socket
def check_port(host, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(2)  # 超时设置
    result = sock.connect_ex((host, port))
    sock.close()
    if result == 0:
        print(f"端口 {port} 已被占用")
        return True
    else:
        print(f"端口 {port} 可用")
        return False
# 使用示例
check_port('127.0.0.1', 8080)
check_port('localhost', 3306)

多端口批量检测

def scan_ports(host, start_port, end_port):
    available = []
    occupied = []
    for port in range(start_port, end_port + 1):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(0.5)
        result = sock.connect_ex((host, port))
        if result == 0:
            occupied.append(port)
        else:
            available.append(port)
        sock.close()
    return available, occupied

Bash/Shell 脚本

Linux/Mac 系统

#!/bin/bash
# 检查端口是否被占用
check_port() {
    PORT=$1
    if lsof -i :$PORT > /dev/null 2>&1; then
        echo "端口 $PORT 已被占用"
        return 0
    else
        echo "端口 $PORT 可用"
        return 1
    fi
}
# 使用 netstat
check_port_netstat() {
    PORT=$1
    if netstat -tuln | grep -q ":$PORT "; then
        echo "端口 $PORT 已被占用"
        return 0
    else
        echo "端口 $PORT 可用"  
        return 1
    fi
}
# 使用 ss (推荐,更现代)
check_port_ss() {
    PORT=$1
    if ss -tuln | grep -q ":$PORT "; then
        echo "端口 $PORT 已被占用"
        return 0
    else
        echo "端口 $PORT 可用"
        return 1
    fi
}
# 使用示例
check_port 8080

Windows 系统 (PowerShell)

function Check-Port {
    param([int]$Port)
    $connections = Get-NetTCPConnection -LocalPort $Port -ErrorAction SilentlyContinue
    if ($connections) {
        Write-Host "端口 $Port 已被占用" -ForegroundColor Red
        return $true
    } else {
        Write-Host "端口 $Port 可用" -ForegroundColor Green
        return $false
    }
}
# 使用 netstat
function Check-PortLegacy {
    param([int]$Port)
    $result = netstat -ano | Select-String ":$Port "
    if ($result) {
        return $true
    }
    return $false
}
# 使用示例
Check-Port 8080

Node.js 脚本

const net = require('net');
function checkPort(port, host = '127.0.0.1') {
    return new Promise((resolve, reject) => {
        const server = net.createServer();
        server.once('error', (err) => {
            if (err.code === 'EADDRINUSE') {
                resolve(false); // 端口被占用
            } else {
                reject(err);
            }
        });
        server.once('listening', () => {
            server.close();
            resolve(true); // 端口可用
        });
        server.listen(port, host);
    });
}
// 使用示例
async function test() {
    const isAvailable = await checkPort(8080);
    if (isAvailable) {
        console.log('端口可用');
    } else {
        console.log('端口已被占用');
    }
}

通用检测原理

不同语言的实现原理类似:

  1. 尝试绑定端口:如果绑定成功表示端口空闲
  2. 尝试建立连接:如果连接成功表示端口被占用
  3. 系统命令调用:使用系统工具检测

注意事项

  • 权限问题:检测低于1024的端口可能需要管理员权限
  • 超时设置:网络延迟可能导致检测不准确,建议设置合理超时
  • 防火墙影响:防火墙可能阻止连接,导致误判
  • 端口复用:某些服务可能使用SO_REUSEADDR选项,需特殊处理

选择哪种方法取决于你的使用场景和编程环境,Python的socket方法最为通用且跨平台。

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