如何同时ping多个IP地址?

slm*_*slm 26 networking ping icmp

我知道可以运行 Bashfor循环的方法和ping多台服务器的方法,是否有我可以使用的 Linux CLI 工具,它允许我执行此操作而不必求助于将 Bash 脚本编写到ping服务器列表一次一个?

像这样的东西:

$ ping host1 host2 host3
Run Code Online (Sandbox Code Playgroud)

注意:我正在寻找 CentOS/Fedora,但如果它适用于其他发行版,那也很好。

slm*_*slm 33

如果您查看NMAP 项目,您会发现它在nmap. 这些工具之一是nping,它包括以下功能:

Nping 有一个非常灵活和强大的命令行界面,允许用户完全控制生成的数据包。Nping的特点包括:

  • 自定义 TCP、UDP、ICMP 和 ARP 数据包生成。
  • 支持多目标主机规范。
  • 支持多目标端口规范。
  • ...

nping 在标准的 EPEL 存储库中启动。

$ repoquery -qlf nmap.x86_64 | grep nping
/usr/bin/nping
/usr/share/man/man1/nping.1.gz
Run Code Online (Sandbox Code Playgroud)

用法

要 ping 多个服务器,您只需告诉nping名称/IP 以及您要使用的协议。在这里,由于我们想模仿传统pingCLI 的功能,因此我们将使用 ICMP。

$ sudo nping -c 2 --icmp scanme.nmap.org google.com

Starting Nping 0.7.70 ( https://nmap.org/nping ) at 2019-06-14 13:43 EDT
SENT (0.0088s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=1] IP [ttl=64 id=57921 iplen=28 ]
RCVD (0.0950s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=1] IP [ttl=46 id=24195 iplen=28 ]
SENT (1.0091s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
SENT (2.0105s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
RCVD (2.0107s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=2] IP [ttl=46 id=24465 iplen=28 ]
SENT (3.0138s) ICMP [10.3.144.95 > 64.233.177.100 Echo request (type=8/code=0) id=49169 seq=2] IP [ttl=64 id=57921 iplen=28 ]

Statistics for host scanme.nmap.org (45.33.32.156):
 |  Probes Sent: 2 | Rcvd: 2 | Lost: 0  (0.00%)
 |_ Max rtt: 86.053ms | Min rtt: 0.188ms | Avg rtt: 43.120ms
Statistics for host google.com (64.233.177.100):
 |  Probes Sent: 2 | Rcvd: 0 | Lost: 2  (100.00%)
 |_ Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 4 (112B) | Rcvd: 2 (108B) | Lost: 2 (50.00%)
Nping done: 2 IP addresses pinged in 3.01 seconds
Run Code Online (Sandbox Code Playgroud)

我发现这个工具的唯一缺点是使用需要 root 权限的 ICMP 模式。

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.
Run Code Online (Sandbox Code Playgroud)

  • 它撒谎......(当然,因为它与自身不一致)。使用 strace 运行它时,我可以看到它向 google.com 发送了一个 ping,但输出了一行说它已将它发送到 scanme.nmap.org。有趣的错误。不过,这并不总是发生。 (4认同)
  • 那个输出是怎么回事?统计数据显示它向每个主机发送了 2 个,但之前的输出显示它向 scanme.nmap.org (45.33.32.156) 发送了 3 个,向 google.com (64.233.177.100) 发送了 1 个。当我运行它时,它也会发生在我身上。 (3认同)

meu*_*euh 21

fping位于同名的 Fedora 包中,并允许多个主机或一组 IP 地址。

$ fping -a -A -c 1 hosta hostb
192.168.0.20 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.64/0.64/0.64
192.168.1.3  : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.50/0.50/0.50
Run Code Online (Sandbox Code Playgroud)

fping 将发送一个 ping 数据包并以循环方式移动到下一个目标...如果目标回复,则将其从列表中记录并删除


GAD*_*D3R 10

oping host1 host2 host3
Run Code Online (Sandbox Code Playgroud)

描述:

oping 使用 ICMP 包(也称为“ping 包”)来测试网络主机的可达性。它支持并行ping多台主机使用 IPv4 和/或 IPv6 透明地。

该软件包包含两个命令行应用程序:“oping”是 ping(1)、ping6(1) 和 fping(1) 等工具的替代品。“noping”是一个基于 ncurses 的工具,它在 ping 时显示统计信息并突出显示异常的往返时间。


小智 10

我建议使用GNU Parallel

parallel -u ping ::: host1 host2 host3
Run Code Online (Sandbox Code Playgroud)

输出将被交错

  • 很好的答案,感谢您引起我们对“并行”的关注。它允许我并行使用我的自定义 ping 脚本,这正是我所需要的。 (2认同)

jes*_*e_b 5

我知道这不是您所要求的,而是一个 bash 脚本来完成此任务:

#!/bin/bash

for host; do
    ping -c5 "$host" 2>&1 | tail -3 &
done

wait
Run Code Online (Sandbox Code Playgroud)

这会将您的端点作为命令行参数,并向每个端点发送 5 次 ping 作为后台进程,然后等待所有端点完成后再退出。它将打印 ping 输出的最后三行,其中包含有关成功率和延迟的有用统计信息。

  • SIGINT 陷阱将使该脚本更加实用。 (4认同)
  • 您不需要记住 pid。一个简单的“wait”将等待所有活动的子进程,因此您可以避免第二个循环。我认为要求不需要编写 bash 脚本的部分原因是拥有一个可以在任何计算机上运行的解决方案,而无需随身携带或编写脚本。使其简短似乎更有利,所以我认为最好避免该参数分配,而只做“for host;”。在你的第一个循环中执行`do`。如果这是 zsh,您可以避免使用“do”和“done”,而只需交互地执行:“for host in google.com;” ping -c5 "$host" |& tail -3 & 等待` (3认同)
  • 对于交互式使用,这只是在子 shell 中使用后台命令(即“命令 &”)(即用括号包裹)并使用“wait”将任意数量的命令组合成一个人工命令,例如:“(for f in google.com yahoo.com microsoft.com;执行 ping $f 并完成;等待)`。它们的输出将是交错的,当您在此命令后按 ctrl+c 时,所有三个子进程都将被终止。shell 有许多强大的作业控制结构,这就是其中之一。 (2认同)
  • 谢谢大家。是的,我很犹豫是否要发布它,但我认为这里的问答不仅仅是针对OP,而是针对每个遇到类似问题的人,我认为会有人偶然发现这个问题并且不想安装额外的软件完成任务。 (2认同)