如何同时ping通多个IP地址?


22

我知道您可以运行Bash for循环和ping多台服务器的方法,有没有可以使用的Linux CLI工具,可以使我做到这一点,而不必将Bash脚本写入ping服务器列表中一次一个?

像这样:

$ ping host1 host2 host3

注意:我正在专门寻找CentOS / Fedora,但是如果它在其他发行版上也可以用。


8
为什么要反对一个单行脚本来实现这一目标-Linux的美感和哲学;-)?(拥有小而简单的程序,并自己编写满足特殊需要的粘合剂。)
彼得-恢复莫妮卡

1
从回购中安装软件包要比将脚本复制到2000+ VM容易得多(8-)。我可以轻松地为自己编写脚本解决方案。另外,由于我已经自我回答了这一问题,因此我正在Internet上创建内容,因为有一些用户要求使用单个cmd与Shell脚本,并且无法找到简单的A'er来满足他们的基本Q要求。
slm

3
如果你的目的是从2000+虚拟机做多平,...我还是只能划伤我的头
哈根·冯·艾特森

@HagenvonEitzen-不,我要在2000多个VM上安装工具,以便用户可以使用工具来执行此操作。
slm

1
你为什么需要这个?
Tvde1

Answers:


32

如果您查看NMAP项目,您会发现它在just的基础上还包括其他工具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

用法

要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

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

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.

3
该输出是什么?统计数据表明,它向每个主机发送了2条消息,但先前的输出显示它向scanme.nmap.org(45.33.32.156)发送了3条消息,向google.com(64.233.177.100)发送了1条消息。当我运行它时,它也会发生在我身上。
JoL

4
它位于……(当然,因为它与自身不一致)。使用strace运行它时,我可以看到它向google.com发送了ping命令,但输出了一行代码,将其发送给了scanme.nmap.org。有趣的错误。但是,并非总是如此。
JoL

nmap通过指定option也直接支持ICMP -sn。有关详细信息,请参见我的答案
scai

@scai-感谢您的A'er。在研究这一点时,我也找到了那个。我发现我的方法是最干净的。
slm

1
“我发现此工具的唯一缺点是使用需要root特权的ICMP模式。” 是的,这很有趣,但是它与功能有关(至少在Linux中;您也可以为root执行setuid exec)。我不是建议使用setcap或给它setuid ....
Pryftan

18

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

fping将发出一个ping数据包,并以循环方式移至下一个目标...如果目标答复,则会将其记录下来并从列表中删除


9
oping host1 host2 host3

描述:

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

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


只是出于学问:从技术上讲,ICMP通常用于错误报告,它具有许多不同的功能。实际上,ping使用的是ICMP的ECHO_REQUEST / ECHO_REPLY类型的ICMP(以前的iirc为8,但是已经很长时间了,我懒得检查)。也许您引用的描述实际上是针对操作本身的,但是无论哪种方式都不是完全正确的(或者比应有的方式简化得多……或者也许不是,我想许多方式可能更好,但无论如何对我而言都不是。 )。
Pryftan


6

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

#!/bin/bash

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

wait

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


3
您无需记住PID。一个简单的wait将等待所有活动的子进程,因此您可以避免第二个循环。我认为要求它不需要编写bash脚本的部分原因是要有一种可以在任何计算机上运行的解决方案,而不必随身携带或编写脚本。缩短它似乎更有利,所以我认为最好避免该参数分配,而只需for host; do在您的第一个循环中执行即可。如果这是zsh,则可以dodonefor host in google.com; ping -c5 "$host" |& tail -3 & wait
间歇

4
SIGINT陷阱将使此脚本更加实用。
吉尔(Gilles)“所以,别再邪恶了”

2
为了进行交互使用,这只是command &在子外壳程序(即用括号包裹)中使用后台命令(即),wait并将任意数量的命令组合为一个人工命令,例如:(for f in google.com yahoo.com microsoft.com; do ping $f & done; wait)。它们的输出将被交错,当您在此命令后按ctrl + c组合键时,将终止所有三个子进程。Shell具有许多功能强大的作业控制结构,这就是其中之一。
Lie Ryan

2
谢谢大家 是的,我很犹豫地发布它,但我认为这里的问与答不仅仅针对OP,而且对于遇到类似问题的每个人,我都认为会有人偶然发现此问题,并且不想安装其他软件完成任务。
Jesse_b

@JoL但是可以肯定的是,并不是默认情况下所有主机上都安装了这些工具。那当然
不会说错话

2

我想这可以为您做吗?

eval $(printf 'ping "%s" & ' host1 host2 host3)

它利用printf的能力来“自动迭代”其参数,同时在每个参数上重新使用其格式字符串。printf因此,上面ping <hostname> &为每个作为参数提供的主机生成了一个字符串序列,并通过Command Substitution将这些eval命令序列馈送到命令以立即执行它们。

printfeval命令是POSIX标准以及命令替换。

将整个这样的命令包含在包含and-ed的子外壳中,wait如下所示:

(eval $(printf 'ping "%s" & ' host1 host2 host3) && wait)

提供了一个简单的随意中断一切的能力Ctrl+C

另外,您可以ping通过Shell的常规作业控件单独控制每个命令。

如果您的外壳还支持流程替换,则还可以使用以下命令:

. <(printf 'ping "%s" & ' host1 host2 host3)

少输入几个字符。

要点与的要点相同eval,但ping要通过流程替换将s 的序列输入给.(aka source)命令。


2

Nmap支持ping扫描(ICMP)和多个主机:

nmap -sn -n 127.0.0.1 8.8.8.8

您还可以创建一个名为的文件,其中包含所有目标IP(用空格或换行符分隔)targets.txt。然后运行:

nmap -sn -n -iL targets.txt

选项说明:

  • -sn Ping扫描。
  • -n 禁用DNS解析。
  • -iL 输入文件名。

如果您要ping大量目标,其他有趣的选择:

  • -T4 增加定时以减少扫描持续时间。
  • --min-parallelism 100 增加并行探针的数量。
  • -oG <file> 将扫描结果以可重复格式写入文件。

不创建文件

请记住,您也可以放弃创建文件,并使用-来从管道|或通过传统方法通过STDIN重定向输出的方式获取输入。

例子:

$ ( echo www.google.com; echo www.yahoo.com ) | sudo nmap -sn -n -iL -

-要么-

$ sudo nmap -sn -n -iL - < <(echo www.google.com; echo www.yahoo.com)

-要么-

$ sudo nmap -sn -n -iL - <<< $'www.google.com\nwww.yahoo.com'

参考文献


2

通过使用通用xargs命令构建一个执行多个ping请求:

echo host1 host2 host3 | xargs -n1 -P0 ping -c 4

其中host1 host2 host3可以是可变数量的主机(IP或主机名的任意组合)。

这将更改xargs默认值,以强制每个ping执行1个输入参数,并允许无限数量的并行子进程(每个ping主机1个)。如果打算对大量主机执行ping操作(将它们全部处理;同时减少几个),则将-P(aka --max-procs)设置为合理值可能是明智的。

它足够短,可以直接使用,可以作为功能添加到您的Shell配置文件或rc文件中,也可以在您的中变成小脚本$PATH。在下面的示例中,-P已将其设置为10,以避免过多的资源消耗。

示例脚本: /usr/bin/mping

#!/bin/sh

echo $@ | xargs -n1 -P10 ping -c4

内部的示例函数 ~/.bashrc

function mping() {
    echo $@ | xargs -n1 -P10 ping -c4
} 

并用作:

mping host1 host2 host3 ...

1
您可能会考虑使用-w 2使ping等待不超过2秒。默认值为10秒,这是对ping的每次调用,因此可能需要30秒钟以上的时间才能完成。
Criggie

1
是的,如果ping超过您为--max-procs/ 设置的主机,那是个好主意-P。但是,对于少于的主机数-P,所有ping都将并行执行-这意味着将花费一次最长的ping执行时间,而不是所有它们的总和。
杰森·穆斯格罗夫

1

我不知道您到底想要什么,但是您可以将最后8位设置为十进制255,这样您的主机将收到广播,实际上,它将向网络中存在的所有设备传输ping数据包。

ping -c 1 xx.xx.xx.255

1
那不是我要找的东西。
slm

8
欢迎来到站点-这是一个好主意,它显示了对广播IP及其在IP网络中的目的的理解,并且完全正确。但是,在这种狭义的情况下,它不符合OP的特定要求。请继续进行,并设法回答其他问题。
Criggie

0
ping google.com && ping localhost

输出量

Pinging google.com [xxxxxxx] with 32 bytes of data:
Reply from xxxxxxx: bytes=32 time=210ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=212ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=211ms TTL=49
Reply from ::1: time<1ms

这样做的缺点是:1)&&如果第一个命令成功完成,操作员仅允许第二条命令运行(即,退出代码为0); 2)没有^ C中断它,第一个ping将永远不会结束。考虑添加-c和-w参数。欢迎光临本站!
Criggie

-1

只是为了娱乐和利润...

#!/bin/sh -

# sends six "pings" to a list of hosts defined in "hosts" below

hosts="
host.a
host.b
host.c
host.d
host.e
"

for p in $hosts
do
# ONLY CHOOSE ONE OF THE FOLLOWING, NOT BOTH
# dump results to file
    ping -c 6 $p >>./PINGED
# dump output to console
    ping -c 6 $p
done

exit

这可以很容易地增强。这使其非常有用。:)

有关其他选项,请参见bsd pingLinux ping的手册页。

高温超导

编辑:略有更新以终止ping查询@ 6 ping每个,并添加手册页选项。


ping除非遇到致命错误,否则第一个调用永远不会返回。
吉尔(Gilles)“所以,别再邪恶了”

真?在将其发布到此处之前,我已经对其进行了测试,并且按说明进行了工作。您确实知道并非每个主机都会响应被ping通。您查询的主机可能没有响应。任何状况之下。为了提供更快的反馈,我将查询限制为每个主机6个请求。
某人

2
现在至少该脚本有机会在实践中终止。但是如果没有并行性,它仍然毫无用处。如果第一台主机做出响应,则用户在最初的5秒钟内不会获得有关其他主机的任何信息。
吉尔斯(Gillles)“别这么邪恶”,

好吧,这是根据需要提供的更多示例。我可以轻松地创建另一个使您的管道完全饱和的管道。但这就是你真正追求的吗?:)
某人

1
应该做的是创建指向ping手册页的链接。老实说 我只是将其创建为一个简单的模板,供人们轻松修改以自己的方式使用。ping成功大大不同操作系统的不同,以及不同的网络条件下,每个人可以下工作的无数下。因此,每个人都没有“完美”的默认设置。每个人都有自己的“最佳地点”。:)我是否提到过它非常适合我?;)
某人

-2

使用以下简单命令:

$ getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }
$ getip 'hostname.number1.net'
$ getip 'hostname.number2.net'
$ getip 'hostname.number3.net'
$ getip 'hostname.number4.net'
$ getip 'hostname.number5.net'
$ getip 'hostname.number6.net'
$ getip 'hostname.number7.net'
$ getip 'hostname.number8.net'
$ cat /tmp/result.log
ABC.DEF.GHI.XY1
ABC.DEF.GHI.XY2
ABC.DEF.GHI.XY3
ABC.DEF.GHI.XY4
ABC.DEF.GHI.XY5
ABC.DEF.GHI.XY6
ABC.DEF.GHI.XY7
ABC.DEF.GHI.XY8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.