You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动