Ping 本质上是利用 ICMP 协议检查网络连通性,它只能检测主机是否在线和延迟,不能直接检测指定端口号是否开放


如何检测指定 IP 的端口号?

要检测某个 IP 的指定端口是否开放,一般用以下工具:

1. 使用 telnet 命令

telnet <IP地址> <端口号>

例如检测端口 80:

telnet 192.168.1.1 80
  • 连接成功表示端口开放
  • 连接失败(超时或拒绝)表示端口关闭或被防火墙拦截

2. 使用 nc(netcat)

nc -zv <IP地址> <端口号>

示例:

nc -zv 192.168.1.1 80
  • -z 表示扫描模式(不发送数据)
  • -v 显示详细信息

3. 使用 nmap 端口扫描工具

安装:

sudo apt install nmap       # Debian/Ubuntu
brew install nmap           # macOS

命令示例:

nmap -p <端口号> <IP地址>

例如扫描端口 22:

nmap -p 22 192.168.1.1

总结

工具是否能Ping端口说明
ping只能检测主机存活
telnet测试端口是否开放
nc (netcat)端口扫描
nmap专业端口扫描工具

明白!这里给你两种脚本示例,分别用 Shell 和 Python 来检测指定 IP 的指定端口是否开放:


一、Shell 脚本检测指定IP端口(基于 nc/netcat)

#!/bin/bash

IP=$1
PORT=$2

if nc -z -w3 $IP $PORT; then
  echo "端口 $PORT 在 $IP 上开放"
else
  echo "端口 $PORT 在 $IP 上未开放或被阻止"
fi

使用方法

chmod +x check_port.sh
./check_port.sh 192.168.1.1 80
  • -z :仅扫描,不发送数据
  • -w3:等待超时时间3秒

二、Python脚本检测指定IP端口

import socket
import sys

def check_port(ip, port, timeout=3):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(timeout)
    try:
        s.connect((ip, int(port)))
        print(f"端口 {port} 在 {ip} 上开放")
        s.close()
        return True
    except (socket.timeout, ConnectionRefusedError):
        print(f"端口 {port} 在 {ip} 上未开放或被阻止")
        return False

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print(f"用法: python {sys.argv[0]} <IP地址> <端口号>")
        sys.exit(1)

    ip = sys.argv[1]
    port = sys.argv[2]
    check_port(ip, port)

使用方法

python check_port.py 192.168.1.1 80