跳到主要内容

9、linux批量ping

linux批量ping

image-20240327124206840

v1

1、脚本内容

[root@docusaurus-wiki linux_batch_ping]# cat ip-test.txt 
10.30.136.104
10.30.136.105

10.30.141.133
10.30.141.134

10.30.138.104
10.30.138.105
[root@docusaurus-wiki linux_batch_ping]# cat ping.sh
#!/bin/bash
#根据测试需要修改ip-test.txt

for k in `cat ip-test.txt`

do
ping -c 2 $k |grep -q 'ttl=' && echo "$k ok" || echo "$k failed"
done
[root@docusaurus-wiki linux_batch_ping]#

2、使用方法

  1. ping.sh和ip-test.txt文件上传到linux系统下
  2. 修改ip-test.txt里面的ip地址
  3. 执行ping.sh脚本,测试ip连通性

注意事项:在把ping.sh文件上传到linux下,要保证其文件格式是linux版本,否则脚本执行时会报错; 可用cat -v ping来观察。

实际测试效果:

image-20210901113317723

3、脚本位置

当前目录下。

说明

[root@docusaurus-wiki linux_batch_ping]# cat ip-test.txt 
10.30.136.104
10.30.136.105

10.30.141.133
10.30.141.134

10.30.138.104
10.30.138.105
[root@docusaurus-wiki linux_batch_ping]# cat ping.sh
#!/bin/bash
#根据测试需要修改ip-test.txt

for k in `cat ip-test.txt`

do
ping -c 2 $k |grep -q 'ttl=' && echo "$k ok" || echo "$k failed"
done
[root@docusaurus-wiki linux_batch_ping]#

这段代码是一个简单的 Bash 脚本,用于批量测试在 ip-test.txt 文件中列出的 IP 地址是否可以通过 ICMP(网络控制消息协议,通常用于执行 ping 测试)到达。

以下是脚本 ping.sh 中每一行代码的逐行解释:

  1. #!/bin/bash:这行被称为 shebang,它告诉系统这个脚本应当使用 /bin/bash,即 Bash shell 环境来执行。

  2. 空行:在脚本中不起作用,只是为了可读性。

  3. #根据测试需要修改ip-test.txt:这是一个注释,为用户提供了一条指示,说明如果需要进行不同的测试,则应修改 ip-test.txt 文件。

  4. 空行:在脚本中不起作用,只是为了可读性。

  5. for k in cat ip-test.txt:这是一个 for 循环,循环的变量是 `k`。这个循环会逐行读取 `ip-test.txt` 中的内容。反引号( ``)用于命令替换,这意味着Shell会首先执行反引号内的命令(这里是cat ip-test.txt`),并将输出作为 for 循环的输入。

  6. do:这是循环的开始。

  7. ping -c 2 $k |grep -q 'ttl=' && echo "$k ok" || echo "$k failed":这是一个管道命令序列,执行以下操作:

    • ping -c 2 $k:对变量 $k 中的 IP 地址执行 ping 命令,其中 -c 2 表示发送两个 ICMP 回显请求包。
    • |:管道符号,将上一个命令的输出传递给下一个命令。
    • grep -q 'ttl=':使用 grep 命令在 ping 的输出中静默搜索文本 'ttl='(表示 ping 成功得到了响应)。
    • &&:逻辑与(AND)运算符,如果 grep -q 'ttl=' 命令(即 ping 成功)返回值为 0(成功),就会执行后面的命令。
    • echo "$k ok":如果 ping 命令成功(找到 'ttl='),则打印 IP 地址和 "ok"。
    • ||:逻辑或(OR)运算符,如果 grep -q 'ttl=' 命令(即 ping 失败)返回值非 0(失败),就会执行后面的命令。
    • echo "$k failed":如果 ping 命令失败(没有找到 'ttl='),则打印 IP 地址和 "failed"。
  8. done:这个循环的结束。

总之,这个脚本会逐个读取 ip-test.txt 文件中的每个 IP 地址,并尝试 ping 这些地址。如果 ping 成功(即 ICMP 响应中包含 TTL),则打印 IP 地址和 "ok";如果 ping 失败(即没有收到 ICMP 响应),则打印 IP 地址和 "failed"。

在实际执行前,需要给 ping.sh 脚本文件执行权限,这可以通过运行命令 chmod +x ping.sh 来实现。然后,通过运行 ./ping.sh 命令来执行脚本。

v2(增强版)

[root@NG-WAF095239 fj]# cat ping.sh 
#!/bin/bash
for ip in `cat ip.txt` #启动循环调动ip地址
do
{
ping -c1 -W1 $ip &>/dev/null # 测试ip是否在线
if [ $? -eq 0 ] ;then
echo -e "$ip" >>ok_`date +%F`.txt #如果修改成功进行记录
else
echo "$ip" >>fail_`date +%F`.txt #如果修改失败进行记录
fi
}&
done

待亲自测试