(免责声明 - 我知道使用 可以更轻松地完成此操作nmap
,但它应该是 bash shell 脚本的练习)。
$ scriptname 192.168.42 18 23
Checking: 192.168.42.18 19 20 21 22 23
Live hosts:
192.168.42.21
192.168.42.22
There were:
5 alive hosts
1 not alive hosts
found through the use of 'ping'.
上面是我想要的输出的样子。 “Checking: ...”将列出正在检查的所有 IP。所有活动的主机都将列在“活动主机”下,然后运行活动和不活动的总计。
这是我到目前为止所拥有的
for i in `seq ${2} ${3}`
do
ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
if [ $? -eq 0 ]; then
echo "Live hosts: \n ${1}.${i}"; LIVECOUNT=$( ???? )
fi
done
因为LIVECOUNT=$( ???? )
我不知道该放什么进去。我不知道如何保持活体/非活体的运行总数。在检查完成之前,“实时主机”和“有”部分不需要出现。
答案1
你的第一个问题的简短答案是LIVECOUNT=$((LIVECOUNT+1))
。此算术扩展由双括号 $(()) 所示,每次 ping 命令成功返回 0 时,变量 LIVECOUNT 就加一。
计算主机总数的简短答案是从高位地址 (${3}) 中减去低位地址 (${2}),然后加一以获得主机总数。
所以:
#!/bin/bash
CHECKING=${1}.
LIVEHOSTS=""
LIVECOUNT=0
TOTALHOSTS=$(($3 - $2 + 1))
for i in `seq ${2} ${3}`
do
CHECKING="$CHECKING${i} "
ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
if [ $? -eq 0 ]; then
LIVEHOSTS="$LIVEHOSTS \n ${1}.${i}"
LIVECOUNT=$((LIVECOUNT+1))
fi
done
echo ""
echo "Checking: $CHECKING"
echo ""
echo "Live hosts:"
echo -e "$LIVEHOSTS"
echo ""
echo "There were:"
echo "$LIVECOUNT alive hosts"
echo "$((TOTALHOSTS - $LIVECOUNT)) not alive hosts"
echo "found through the use of ping"
请注意以下事项:$CHECKING 是一个字符串,以参数 1 ${1} 给出的子网开头,然后为 do 循环的每次迭代添加当前主机号 ${i}。
由于这种格式的方式(在“实时主机:”行之前添加“检查:”行),将实时主机保留在字符串中似乎更容易(类似于 $CHECKING),所以这就是 $LIVEHOSTS 的含义。
$LIVEHOSTS 和 $LIVECOUNT 初始化为空白和零,以明确发生了什么;严格来说,这不是必需的。
请注意输出 $LIVEHOSTS 时使用 echo -e。这是为了让 \n 作为换行符。
编辑:要显示当前正在检查的 IP 而不是末尾的列表,请替换CHECKING="$CHECKING${i} "
为echo "Checking $CHECKING${i}"
并删除或注释掉该行echo "Checking: $CHECKING"
。自从echo
是里面循环do
中,它将在每次传递时打印,使用 $i 的当前值。 (这与 @slm 指出的关于您echo "Live hosts"
在原始脚本中使用的内容是一样的。)