如何通过Python的pyping库获取TTL值?现有代码仅能判断服务器状态
如何修改pyping的Python程序以输出TTL值?
我来帮你解决这个问题!要让你的pyping程序输出TTL值其实很简单,先看修改后的代码,再给你几个其他实现思路:
一、修改现有pyping代码以输出TTL值
pyping的ping()方法返回的结果对象中,当服务器在线时,已经包含了解析好的TTL值,我们只需要直接读取这个属性并添加到输出里即可。修改后的代码如下:
import pyping servers = ('192.168.1.1', '192.168.1.2', '192.168.1.3') temp = [] for server in servers: checker = pyping.ping(server) if checker.ret_code == 0: # 直接从ping结果中获取TTL值 ttl_value = checker.ttl body = f"{server} Server is UP, TTL: {ttl_value}" temp.append(body) else: body = f"{server} Server is Down" temp.append(body) # 改成逐行输出更易读,也可以保留原print(temp) print('\n'.join(temp))
说明:
当checker.ret_code == 0(服务器在线)时,checker.ttl会返回从ICMP响应包中解析出的TTL数值,直接把它拼接到输出字符串里就完成了需求。
二、其他获取TTL值的实现思路
如果pyping库的功能不能满足你的需求,或者你想尝试其他方案,这里有两个常用的思路:
1. 调用系统原生ping命令(无需额外库)
系统自带的ping命令会输出TTL信息,我们可以用subprocess模块执行命令,再通过正则表达式解析输出内容:
import subprocess import re servers = ('192.168.1.1', '192.168.1.2', '192.168.1.3') temp = [] for server in servers: try: # 注意:Windows系统请把参数改成 ['ping', '-n', '1', server] result = subprocess.run( ['ping', '-c', '1', server], capture_output=True, text=True, timeout=5 ) if result.returncode == 0: # 用正则匹配TTL值,兼容不同系统的输出格式 ttl_match = re.search(r'TTL=(\d+)', result.stdout, re.IGNORECASE) ttl_value = ttl_match.group(1) if ttl_match else 'Unknown' body = f"{server} Server is UP, TTL: {ttl_value}" else: body = f"{server} Server is Down" except subprocess.TimeoutExpired: body = f"{server} Server is Down (Timeout)" temp.append(body) print('\n'.join(temp))
2. 使用Scapy库直接处理ICMP包
Scapy是一个强大的网络数据包处理库,可以手动构造ICMP请求并直接读取响应包中的TTL字段:
from scapy.all import ICMP, IP, sr1 servers = ('192.168.1.1', '192.168.1.2', '192.168.1.3') temp = [] for server in servers: try: # 构造ICMP请求包,设置2秒超时 packet = IP(dst=server)/ICMP() response = sr1(packet, timeout=2, verbose=0) if response: ttl_value = response.ttl body = f"{server} Server is UP, TTL: {ttl_value}" else: body = f"{server} Server is Down" except Exception as e: body = f"{server} Server is Down (Error: {str(e)})" temp.append(body) print('\n'.join(temp))
注意:
使用Scapy需要先安装库:pip install scapy,并且在部分系统(比如Linux)下可能需要管理员权限运行程序。
内容的提问来源于stack exchange,提问作者Maximus




