Bash Ping 返回“活动”IP 地址

Bash Ping 返回“活动”IP 地址

(免责声明 - 我知道使用 可以更轻松地完成此操作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"在原始脚本中使用的内容是一样的。)

相关内容