首页 > 解决方案 > 如何让 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

Disclamer:这只是一个项目,并未用作严肃的安全工具。

标签: bashfor-loopnmap

解决方案


假设您仍然想打印出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"

推荐阅读