简介
社区或者是大型公司往往有成千上万或者几百台设备,保持设备始终在线对网络运维人员来说至关重要,然而一个一个登录检查,或者一个一个ping并不明智,累人且效率极低,并出错率高。花钱买检测服务当我没说。
shell编程无处不在。
代码
ip.sh
#!/bin/bash
for i in {2..254}
do
for p in {2..254}
do
{
ip=192.168.$i.$p
ping -c1 -W1 $ip &>/dev/null
if [ $? -ne 0 ];then
echo "$ip" | tee -a ip.txt
else
echo "$ip" >> successIP.txt
fi
} &
done
done
wait
echo "command execution completed"
效果
bash ./ip.sh
终端显示ping失败的IP地址
内容太长,使用more ip.txt可显示一部分
ip.txt内容
ping成功的ip地址会输出到“successIP.txt”文本中
模拟的IP,就不展示了
说明
代码共18行336字节,使用双for循环,替换C类内网IP192.168.*.*,-c1参数选项只ping一次,-W1参数选项只等待1s,ping的结果不显示,丢弃到字符设备文件null中,失败的IP地址使用| tee命令双向重定向到终端和ip.txt文本中,ping成功的ip地址使用追加重定向命令>>追加到successIP.txt文件中。
优化:代码设计使用双for循环,控制192.168后两个网段的可变数字,用变量i和p替代,使用集合将可变数字添加;使用一条if语句逻辑判断失败和成功结果,并将结果保存在txt格式文档中;使用"{} &"将if语句囊括在内,让程序在后台并发;使用wait命令等待程序所有ping都结束,打印最终的结果;
tips
大家可以试试动手运行下,中途停止运行可以在当前终端使用Ctrl键+Z强制终止程序运行,或者Ctrl+C强制终止程序运行;可能命令无法生效,可以再开一个终端输入如下命令强制终止:
当执行./ip.sh,再开一个终端,使用如下命令可查询并发进程ID
pgrep -af "ip.sh"
使用
kill
命令终止所有这些进程:pkill -9 -f "ip.sh"
#这样可以一次性终止所有与特定脚本相关的进程,双引号“”的内容替换为自己的脚本名字(注意脚本文件所在路径是当前路径,如果不在当前路径,使用绝对路径
例:pkill -9 -f "/home/xiumo/Desktop/ip.sh"
简单的事情简单化,复杂的事情也简单化,让运行更高效