无需安装 telnet,只要有 Python 环境,即可批量测试服务器端口连通性!
在日常运维、开发调试或网络排查中,我们经常需要测试某个服务器的特定端口是否开放。传统做法是使用 telnet
命令:
telnet host port
但问题来了 —— 很多现代系统(如精简版 Linux、容器环境、云主机)默认不安装 telnet 客户端。而安装它又可能涉及权限、包管理器、安全策略等麻烦事。
有没有更轻便、灵活的解决方案?
有!用 Python 写一个!
一行命令,批量测试多个端口
我们开发了一个极简但实用的 Python 脚本 telnet.py
,支持如下调用:
python telnet.py H1:p1,H2:p2,H3:p3,H4:p4
例如:
python telnet.py google.com:80,example.com:443,localhost:9999
输出:
google.com:80 - open (15ms)
example.com:443 - open (32ms)
localhost:9999 - closed
是不是比反复敲 telnet
命令方便多了?
✅ 为什么选择这个脚本?
1. 零依赖,纯标准库
完全基于 Python 3.7+ 标准库(socket
, sys
, time
),无需 pip 安装任何第三方包,在任何有 Python 的环境都能跑。
2. 批量测试,效率翻倍
支持逗号分隔多个 host:port
,一次性测试多个服务端口,告别重复操作。
3. 智能输出,一目了然
- 端口开放 ➜ 显示
open
+ 延迟毫秒数(网络质量评估) - 端口关闭或不可达 ➜ 显示
closed
- 自动过滤无效输入,错误提示清晰
4. 超时控制,避免卡死
默认 5 秒超时,避免因网络阻塞导致脚本长时间无响应。
5. 错误处理完善
- 主机名解析失败?→
closed
- 端口拒绝连接?→
closed
- 超时?→
closed
- 输入格式错误?→ 友好提示并跳过
技术实现原理
脚本核心是使用 Python 的 socket
模块创建 TCP 连接:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
sock.connect((host, port))
- 如果
connect()
成功 → 端口开放 ✅ - 如果抛出异常(超时、连接拒绝、DNS失败等)→ 端口关闭 ❌
同时,我们用 time.monotonic()
计算连接耗时,精确到毫秒,帮助评估网络延迟。
完整代码(复制即用)
将以下代码保存为 telnet.py
:
import sys
import socket
import time
def test_port(host, port, timeout=5):
"""测试指定主机的端口是否可连通"""
try:
# 创建socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
# 尝试连接
start_time = time.monotonic()
sock.connect((host, port))
end_time = time.monotonic()
# 计算连接耗时
latency = int((end_time - start_time) * 1000) # 毫秒
return True, latency
except socket.timeout:
return False, 0
except (socket.gaierror, ConnectionRefusedError, OSError):
return False, 0
finally:
sock.close()
def main():
if len(sys.argv) != 2:
print("Usage: python telnet.py H1:p1,H2:p2,...")
sys.exit(1)
targets = sys.argv[1].split(',')
results = []
for target in targets:
# 解析主机和端口
parts = target.split(':')
if len(parts) != 2:
print(f"Invalid target format: {target
}")
continue
host, port_str = parts
try:
port = int(port_str)
except ValueError:
print(f"Invalid port number: {port_str
}")
continue
# 测试端口连通性
success, latency = test_port(host, port)
status = "open" if success else "closed"
results.append(f"{host
}:{port
} - {status
} ({latency
}ms)" if success else f"{host
}:{port
} - {status
}")
# 打印所有结果
print("\n".join(results))
if __name__ == "__main__":
main()
️ 使用说明
保存脚本
nano telnet.py # 粘贴上面的代码,保存退出
赋予执行权限(可选)
chmod +x telnet.py
运行测试
python telnet.py baidu.com:80,github.com:443,127.0.0.1:3306
实用场景举例
- 部署前检查:确认数据库、Redis、Nginx 等服务端口是否监听
- 网络排障:快速判断是服务没启动,还是防火墙/安全组拦截
- 自动化脚本集成:作为健康检查前置步骤
- 容器/云环境:无 telnet 工具时的完美替代品
注意事项
- 本脚本仅测试 TCP 端口连通性,不支持 UDP
- “closed” 不一定代表服务未运行,可能是防火墙拦截
- 延迟值仅反映 TCP 握手耗时,非完整 HTTP 请求响应时间
- 主机名需能被 DNS 解析,或直接使用 IP 地址
总结
这个不到 50 行的 Python 脚本,解决了我们在无 telnet 环境下测试端口连通性的刚需。它轻量、无依赖、易用、可批量,是每个开发者和运维人员都值得收藏的“瑞士军刀”。
下次当你在容器里、云主机上、或者精简系统中想测试端口时,别再折腾安装 telnet 了 —— 一个 python telnet.py ...
命令,搞定一切!
✅ 收藏 + 分享给你的团队,让端口测试从此高效无忧!
GitHub Gist / 脚本仓库推荐:你可以将此脚本上传至内部工具库或 Gist,方便团队共享使用。
作者:arbboter
标签:#Python #网络工具 #端口测试 #运维脚本 #无依赖工具
你还可以扩展它:添加颜色输出、JSON 格式、重试机制、并发测试 —— 但记住,简单即美