1

我有一个 IP 列表(从 Python Scapy 中的跟踪路由生成),我需要发送 3 个 ping 来测量每个跃点的平均时间。我的第一个方法是使用套接字构建 ICMP 请求并测量响应时间。但是在 ping 多个主机时它是不准确且缓慢的。我确实尝试使用正常的 Linux ping,但是for i在等待响应时我的循环被阻塞了,显然我希望同时发送所有 ping 请求。

所以我正在寻找一种fping在 Linux 中使用的方法,我给出一个 IP 列表,然后让它完成构建数据包的工作。但我不确定如何将参数列表传递给 shell 命令或将数据返回到数组中以在完成后进行进一步处理。

任何指针表示赞赏!

4

2 回答 2

3

我不太了解fping,但是像这样的东西......

import subprocess

CMD = ['fping', 'param1', 'param2']

result = subprocess.check_output(CMD)

...将运行,并在进程终止后将fping param1 param2输出作为字符串放入result变量中。fping

您可以将输出拆分为带有result.splitlines().

这是一个快速的单行示例,ping用于获取到 localhost 的三个 ping 时间...

>>> [line.rpartition('=')[-1] for line in subprocess.check_output(['ping', '-c', '3', 'localhost']).splitlines()[1:-4]]
['0.028 ms', '0.023 ms', '0.025 ms']
于 2013-04-22T20:24:19.540 回答
0

以下函数解析fping的输出并返回一个字典,其中包含每个主机的可用性:

import subprocess
from typing import List, Dict

def ping(hosts: List[str], timeout: int = 500) -> Dict[str, bool]:
    command = ["fping", "-t", str(timeout)] + hosts
    proc    = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    parse   = lambda stream: [
        line.split(" ")
        for line
        in stream.read().decode("UTF-8").split("\n")
        if len(line) != 0
    ]
    lines = parse(proc.stdout) + parse(proc.stderr)
    return {p[0]: p[-1] == "alive" for p in lines if p[1] == 'is'}

print(ping(["google.com", "asdfasdfasdf1234.com", "stackoverflow.com"]))
# {'google.com': True, 'stackoverflow.com': True, 'asdfasdfasdf1234.com:': False}
于 2020-12-14T14:38:17.823 回答