需要测试远程服务器的某个端口(如 MySQL 的 3306)是否可访问。介绍几种常用的测试方法。

快速测试方法

使用 nc (推荐)

最简洁的方式:

1
nc -zv 192.168.1.100 3306

输出:

1
Connection to 192.168.1.100 3306 port [tcp/mysql] succeeded!

参数说明

  • -z:扫描模式,不发送数据
  • -v:显示详细信息

使用 telnet

传统方式:

1
telnet 192.168.1.100 3306

成功时会显示:

1
2
Trying 192.168.1.100...
Connected to 192.168.1.100.

退出方式:按 Ctrl + ],然后输入 quit

批量测试端口

nc 批量扫描

1
2
3
4
# 测试多个端口
for port in 3306 80 443 22; do
nc -zv -w 3 192.168.1.100 $port
done

扫描端口范围

1
2
# 扫描 3000-3010 端口
nc -zv 192.168.1.100 3000-3010

高级测试方法

使用 nmap

功能最强大的扫描工具:

1
2
3
4
5
6
7
8
9
10
11
# 扫描单个端口
nmap -p 3306 192.168.1.100

# 扫描多个端口
nmap -p 3306,80,443 192.168.1.100

# 扫描端口范围
nmap -p 3000-4000 192.168.1.100

# 快速扫描(跳过主机发现)
nmap -Pn -p 3306 192.168.1.100

输出示例:

1
2
PORT     STATE SERVICE
3306/tcp open mysql

使用 timeout 避免卡住

1
2
3
4
5
6
7
8
9
# 3 秒超时
timeout 3 bash -c "cat < /dev/null > /dev/tcp/192.168.1.100/3306"

# 检查返回值
if [ $? -eq 0 ]; then
echo "端口 3306 开放"
else
echo "端口 3306 关闭或超时"
fi

使用 /dev/tcp (内置方法)

不需要额外工具:

1
2
# Bash 内置 TCP 测试
(echo > /dev/tcp/192.168.1.100/3306) &>/dev/null && echo "开放" || echo "关闭"

编写测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

host="192.168.1.100"
port=3306
timeout=3

# 测试端口
if timeout $timeout bash -c "cat < /dev/null > /dev/tcp/$host/$port" 2>/dev/null; then
echo "✓ $host:$port 可访问"
exit 0
else
echo "✗ $host:$port 不可访问"
exit 1
fi

使用:

1
2
chmod +x test-port.sh
./test-port.sh

方法对比

方法 优点 缺点 适用场景
nc 简单快速 需要安装 日常测试
telnet 通用性好 难以脚本化 交互式测试
nmap 功能强大 较慢,需要安装 批量扫描
/dev/tcp 无需工具 仅 Bash 支持 脚本中使用
timeout + /dev/tcp 内置 + 超时控制 语法复杂 生产脚本

安装工具

CentOS/RHEL

1
yum install nc nmap telnet

Ubuntu/Debian

1
apt-get install netcat nmap telnet

macOS

1
brew install netcat nmap telnet

注意事项

  • telnet 连接成功后需要手动退出,不适合脚本
  • nc-w 参数可以设置超时时间
  • nmap 扫描大量端口可能触发防火墙告警
  • /dev/tcp 方法在某些受限环境下可能不可用
  • 使用 timeout 命令避免无限等待