我怎样才能得到一个for循环输出一次,而不是每次迭代?



我编写了这个简单的bash脚本来运行ping扫描并获取网络上活动的MAC地址,输出到一个文件,然后将该文件与我从路由器的ARP表中获取的已知MAC地址列表的文件进行比较。

与其为它迭代的每一行回显一个结果,我如何使for循环吐出一个像"你的网络上所有设备都是熟悉的"这样的输出?

当前代码:

sudo nmap -sn 192.168.0.0/24 | grep "MAC" | awk '{print $3}'| sort > $HOME/Desktop/arp.txt
readarray -t mac <$HOME/Desktop/arptable.txt
for address in "${mac[@]}"; do
if grep -Fxq "$address" $HOME/Desktop/arptable.txt;
then 
echo "$address is a known network device"
else
echo "WARNING: $address is an unknown device on the network"
fi
done 

和我当前的输出看起来像:

XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device
XXXXXXXXXXXXXXXXX is a known network device

声明:这只是一个项目,不用作严肃的安全工具。

假设您仍然想打印出WARNING消息…跟踪成功的次数,如果等于数组mac[]中的条目数,则打印您想要的消息,例如:

found=0
for address in "${mac[@]}"; do
if grep -Fxq "$address" $HOME/Desktop/arptable.txt;
then 
((found++))
else
echo "WARNING: $address is an unknown device on the network"
fi
done 
[[ "${found}" -eq "${#max[@]}" ]] && echo "All Devices are familiar on your network"

或者,如果您生成任何WARNING消息,则清除标志:

foundall=true
for address in "${mac[@]}"; do
if ! grep -Fxq "$address" $HOME/Desktop/arptable.txt;
then 
echo "WARNING: $address is an unknown device on the network"
foundall=false
fi
done 
[[ "${foundall}" == 'true' ]] && echo "All Devices are familiar on your network"

伪代码(我不做bash,不懂语法):

sudo nmap -sn 192.168.0.0/24 | grep "MAC" | awk '{print $3}'| sort > $HOME/Desktop/arp.txt
readarray -t mac <$HOME/Desktop/arptable.txt
# everythingGood = true
for address in "${mac[@]}"; do
if grep -Fxq "$address" $HOME/Desktop/arptable.txt;
then 
else
# everythingGood = false
# some code here maybe to store which ones failed
fi
done 
# if everythingGood
# echo "All Devices are familiar on your network"
# else
# echo "WARNING: $address is an unknown device on the network"

最新更新