【发布时间】:2021-12-04 08:12:28
【问题描述】:
我在 bash 中有 2 个数组。 数组编号 1 是没有最后一个八位字节的 vlan 子网。 数组 2 是我想忽略的八位字节列表,同时使用 Nmap 扫描子网。 让我们假设每个子网都有 254 个可 ping 的 ip(c 类子网) 我希望脚本扫描每个子网,并排除以 1,2,3,252,253,254 结尾的 ip,它们通常是路由器/防火墙/交换机。 我设法运行了 2 次迭代,但在 if [[ $host == $host."${ignore[@]" ]] 上未能识别相关的 IP(sunbet + 忽略字符串) 非常感谢您的帮助。
#!/bin/bash
# lets assume each subnet has 254 ips and all ignore ip's like 10.6.114.1 10.6.115.1 and 10.5.120.1
declare -a vlans=(
10.6.114
10.6.115
10.5.120
)
declare -a ignore=(
1
2
3
252
253
254
)
for vlan in "${vlans[@]}"; do
nmap -sn "$vlan" | grep Nmap | awk "{print $5}" | sed -n '1!p' | sed -e "$d" | sort > /tmp/vlan_ips.txt
readarray -t hosts < /tmp/vlan_ips.txt
for host in "${hosts[@]}"; do
check=$(echo "$host" | cut -d"." -f1-3)
if [ $host == $check."${ignore[@]}" ]; then
echo 'skipping record'
fi
done
done
【问题讨论】:
-
请将您的脚本粘贴到shellcheck.net 并尝试实施那里提出的建议。
-
为什么你认为
$host == $host.$ignore可以匹配? -
failed on the last是什么意思...错误?输出错误?没有输出?考虑更新问题以包含 3 个vlans[]条目中每一个的hosts[]数组的示例内容 -
我编辑了脚本和问题
-
我假设你的意思是
$host == $vlan.$ignore[@],但由于ignore是一个数组,你需要一种方法来测试ignore数组中的每个条目(例如,第三个for循环);另一种方法是解析$host以获取最后一个元组并测试所述元组是否在ignore数组中; '当然,这个问题适用于你的循环的每一次通过,所以我不确定你是如何确定前 2 次通过'工作'...... ??
标签: arrays bash loops for-loop