我知道您可以运行Bash for
循环和ping
多台服务器的方法,有没有可以使用的Linux CLI工具,可以使我做到这一点,而不必将Bash脚本写入ping
服务器列表中一次一个?
像这样:
$ ping host1 host2 host3
注意:我正在专门寻找CentOS / Fedora,但是如果它在其他发行版上也可以用。
我知道您可以运行Bash for
循环和ping
多台服务器的方法,有没有可以使用的Linux CLI工具,可以使我做到这一点,而不必将Bash脚本写入ping
服务器列表中一次一个?
像这样:
$ ping host1 host2 host3
注意:我正在专门寻找CentOS / Fedora,但是如果它在其他发行版上也可以用。
Answers:
如果您查看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以及要使用的协议。在这里,由于我们要模仿传统ping
CLI的功能,因此我们将使用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.
oping host1 host2 host3
oping使用ICMP程序包(通常称为“ ping数据包”)来测试网络主机的可达性。它支持透明地使用IPv4和/或IPv6 并行 ping多个主机。
该软件包包含两个命令行应用程序:“ oping”是ping(1),ping6(1)和fping(1)之类的工具的替代品。“ noping”是基于ncurses的工具,它在ping时显示统计信息并突出显示异常的往返时间。
我知道这不是您要的,而是一个bash脚本来完成此任务:
#!/bin/bash
for host; do
ping -c5 "$host" 2>&1 | tail -3 &
done
wait
这会将端点作为命令行参数,并向每个端点发送5个计数ping作为后台进程,然后等待所有操作完成后再退出。它将打印ping输出的最后三行,其中包含有关成功率和延迟的有用统计信息。
wait
将等待所有活动的子进程,因此您可以避免第二个循环。我认为要求它不需要编写bash脚本的部分原因是要有一种可以在任何计算机上运行的解决方案,而不必随身携带或编写脚本。缩短它似乎更有利,所以我认为最好避免该参数分配,而只需for host; do
在您的第一个循环中执行即可。如果这是zsh,则可以do
done
for host in google.com; ping -c5 "$host" |& tail -3 & wait
command &
在子外壳程序(即用括号包裹)中使用后台命令(即),wait
并将任意数量的命令组合为一个人工命令,例如:(for f in google.com yahoo.com microsoft.com; do ping $f & done; wait)
。它们的输出将被交错,当您在此命令后按ctrl + c组合键时,将终止所有三个子进程。Shell具有许多功能强大的作业控制结构,这就是其中之一。
我想这可以为您做吗?
eval $(printf 'ping "%s" & ' host1 host2 host3)
它利用printf
的能力来“自动迭代”其参数,同时在每个参数上重新使用其格式字符串。printf
因此,上面ping <hostname> &
为每个作为参数提供的主机生成了一个字符串序列,并通过Command Substitution将这些eval
命令序列馈送到命令以立即执行它们。
printf
和eval
命令是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
)命令。
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'
通过使用通用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 ...
--max-procs
/ 设置的主机,那是个好主意-P
。但是,对于少于的主机数-P
,所有ping都将并行执行-这意味着将花费一次最长的ping执行时间,而不是所有它们的总和。
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
&&
如果第一个命令成功完成,操作员仅允许第二条命令运行(即,退出代码为0); 2)没有^ C中断它,第一个ping将永远不会结束。考虑添加-c和-w参数。欢迎光临本站!
只是为了娱乐和利润...
#!/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 ping和Linux ping的手册页。
高温超导
编辑:略有更新以终止ping查询@ 6 ping每个,并添加手册页选项。
ping
除非遇到致命错误,否则第一个调用永远不会返回。
使用以下简单命令:
$ 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