【问题标题】:how to Iterate an Array List inside 2 bash loops如何在 2 个 bash 循环中迭代数组列表
【发布时间】: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


【解决方案1】:

这可能对你有用:

for vlan in "${vlans[@]}"; do
  
  for ign in "${ignore[@]}"; do
    printf '%s.%s\n' "$vlan" "$ign"
  done >/tmp/ignore

  nmap -n -sn "$vlan.0/24" -oG - 2>/dev/null |
  grep -vwFf /tmp/ignore |
  awk '/Host:/{print $2}' |
  while read -r host; do
    echo "$host"
  done
done

【讨论】:

  • Léa Gris 你太神奇了!!!谢谢
  • grep -vwFf 为我创造了一切魔力。它比迭代另一个循环要聪明得多
猜你喜欢
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 2016-06-03
  • 2022-09-27
  • 2013-07-18
  • 1970-01-01
相关资源
最近更新 更多