需要测试远程服务器的某个端口(如 MySQL 的 3306)是否可访问。介绍几种常用的测试方法。
快速测试方法
使用 nc (推荐)
最简洁的方式:
1
| nc -zv 192.168.1.100 3306
|
输出:
1
| Connection to 192.168.1.100 3306 port [tcp/mysql] succeeded!
|
参数说明:
使用 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
| 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
| 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
| (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 命令避免无限等待