无需安装 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()

️ 使用说明

  1. 保存脚本

    nano telnet.py
    # 粘贴上面的代码,保存退出
  2. 赋予执行权限(可选)

    chmod +x telnet.py
  3. 运行测试

    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 格式、重试机制、并发测试 —— 但记住,简单即美

posted on 2025-09-16 11:52  ycfenxi  阅读(35)  评论(0)    收藏  举报