使用shell脚本检测某个网段内存活的主机,主要原理是使用循环ping该网段内的每一个地址,根据执行是否成功输出主机是否存活。
脚本如下:
#!/bin/bash
read -p "input network:" net
for i in {1..254};do echo $net | sed "s/[0-9]*$/$i/" | xargs -i ping -c 1 -W 1 {} &>/dev/null && echo $i:yes || echo -ne "\r$i:no";done
脚本文件为alivehost.sh,只能探测子网掩码为255.255.255.0的部分
chmod +x alivehost.sh # 使文件具有可执行权限,使用声名的bash
当我在ubuntu16中使用sh alivehost.sh时,总是报各种错,显示脚本文件语法的各种问题,可能是因为bash不兼容的原因。
以下分别讲解各段内容,涉及知识点较多。
read -p “input network:” net # 将输入内容赋值给net
-p 显示输入提示
for i in {1..254} i循环取值1到254,只能探测254个地址
sed “s/[0-9]$/$i” 将该行的最后一个数字替换为变量i。[0-9]表示任意数字,表示0个或任意个。之前考虑使用+表示一个到任意多个,但是sed好像不支持。
sed一般用于处理文件,为了处理变量,使用echo输出变量再处理。
sed不加其他参数,会输出处理后的结果。补充:p表示打印处理之前的行
xargs -i ping -c 2 -W {} &> /dev/null
利用管道符”|”不能直接将sed的处理结果传递给ping,这里使用xargs配合参数-i 将sed的处理结果传递给ping的指定位置。其中-c指定ping的次数,-W指定超时,如果主机不存活,ping会因超时而执行失败。&>/dev/null不显示ping的任何执行内容。
如果ping成功,执行echo $i:yes
否则执行echo -ne “\r$i:no”
-n 不换行
-e 开启转义,使字符串中的\r生效
\r 将鼠标定位到行首
由于ping的对象很多,为了显示程序正在运行和运行的每个结果,这里使用一行动态显示ping失败的对象。
执行效果如下:
ubuntu@localhost:~/python2$ ./alivehost.sh
input network:192.168.0.1
1:yes
99:no100:yes
101:yes
102:yes
103:yes
104:yes
105:yes
106:yes
107:no108:yes
109:yes
110:yes
254:noubuntu@localhost:~/python2$
执行速度较慢,建议使用更专业的工具nmap
nmap -n -sn 192.168.0.1/24
执行速度更快更灵活,更支持端口存活检测,操作系统检测,服务检测等