我目前正在尝试在 bash 中创建一个工具来检查活动系统。我不需要它成为某种疯狂复杂的工具。我只需要它告诉我我的机器已启动并正在运行。我知道我的剧本是嘉宝……这就是我来这里的原因。
#!/bin/bash
here()
{
ping -c 1 $1 > dev/null
echo "Good morning, Here are the machines that are up and running: $i"
}
for i in insert ip range
do here $i
done
答案1
考虑一下 nmap 的一些东西吗?
nmap -sP 10.1.2.0/24 10.2.5.0/24
它可能比 ping 循环更简单,并且它可以并行扫描多个主机,因此速度会更快;但它需要安装 nmap 及其通常的依赖项,这可能会让专注于最坏情况的驻地安全中尉感到不安。
更新:好的,当然是 Oberleutnanten。
反而:
xargs parallel -j20 ping -c1 -- | grep 'bytes from'
喜欢
echo 10.0.{1..2}.{1..15} |\
xargs parallel -j20 ping -c1 -- | grep 'bytes from'
64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 10.0.2.3: icmp_seq=1 ttl=64 time=0.150 ms
64 bytes from 10.0.2.4: icmp_seq=1 ttl=64 time=0.176 ms
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.138 ms
时间也很好,因为大部分时间都在等待 ping 立即终止。积极的结果很快就会回来:
$ time (echo 10.0.{1..2}.{1..15} | xargs parallel -j30 ping -c1 -- | grep 'bytes from')
64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 10.0.2.3: icmp_seq=1 ttl=64 time=0.150 ms
64 bytes from 10.0.2.4: icmp_seq=1 ttl=64 time=0.176 ms
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.138 ms
real 0m10.030s
user 0m0.019s
sys 0m0.018s
如果你也想嗅探 winbox,请将 arping 及其特定参数替换为 ping,因为它们讨厌 ping。
如果你想变得更热衷的话,可以将俗气的 grep 换成 awk '/bytes from/{print $4}'。
毫无疑问,其他人的想法看起来像是很棒的测验提交,而我的想法看起来就像用螺丝刀敲钉子,但它又快又简单。
答案2
与此类似的内容应该会有所帮助,将任意数量的 IP 添加到 ip 列表中:
#!/bin/bash
ips=(192.168.0.1 8.8.8.8 127.0.0.1)
here() {
ping -c 1 $1 > /dev/null
if [[ $? -eq 0 ]]
then
echo "Good morning, Here are the machines that are up and running: $i"
fi
}
for i in ${ips[@]}
do here $i
done
答案3
你的IP范围有多大?
对于 /24 考虑
for i in {1..254} ; do
if ping -c1 10.11.12.$i >/dev/null 2>/dev/null ; do
echo "10.11.12.$i is up"
else
echo "10.11.12.$i is down
fi
done
对于 /16,您可以添加第二个循环:
for j in {1..254} ; do
for i in {1..254} ; do
if ping -c1 10.11.$j.$i >/dev/null 2>/dev/null ; do
echo "10.11.$j.$i is up"
else
echo "10.11.$j.$i is down
fi
done
done
然后喝几杯咖啡等待它完成。
但确实nmap
是正确的工具。
答案4
给你。
你可以这样使用:
./your_script_name.sh 192.168.1.0/24
#!/bin/bash
SUBNET=$1
if [[ -z "$SUBNET" ]]; then
echo "Usage: ./your_script_name.sh <SUBNET>"
exit
fi
printsubnet() {
local OLDIFS="$IFS"
local SUB=${1/\/*/}
local MASK=$(( 1 << ( 32 - ${1/*\//} )))
IFS="."
set -- $SUB
IPS=$((0x$(printf "%02x%02x%02x%02x\n" $1 $2 $3 $4)))
IFS="$OLDIFS"
for ((N=0; N<MASK; N++))
{
VAL=$((IPS|N))
printf "%d.%d.%d.%d\n" \
$(( (VAL >> 24) & 255 )) \
$(( (VAL >> 16) & 255 )) \
$(( (VAL >> 8 ) & 255 )) \
$(( (VAL) & 255 ))
}
}
mapfile IPS < <(printsubnet $SUBNET)
for row in "${IPS[@]}";do
ping -c 1 "$row" >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
echo "$row is up"
else
echo "$row is down"
fi
done