shell——主机存活检测

使用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
执行速度更快更灵活,更支持端口存活检测,操作系统检测,服务检测等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值