У меня есть скрипт bash, который должен прочитать список доменов из txt-файла, найти его IP-адрес и найти его открытые порты с помощью Nmap и записать три из них в файл .csv. Вот код:
#!/usr/bin/env bash
# cache maps from IP addresses to open ports
declare -A cache
getports() {
local ip=$1
nmap -v -Pn -p 1-100 "$ip" -oG - \
| awk -F '\t' '
/Ports:/ {
n = split($2, a, /,? /)
printf "%s", a[2]
for (i = 3; i <= n; ++i)
printf ":%s", a[i]
}
'
}
{
echo 'Name,IP,Port'
while IFS= read -r url; do
# Read filtered dig output into array
readarray -t ips < <(dig +short "$url")
# Build array of open ports
unset ports
for ip in "${ips[@]}"; do
ports+=("${cache["$ip"]:=$(getports "$ip")}")
done
# Output
printf '%s,%s,%s\n' \
"$url" \
"$(IFS='-'; echo "${ips[*]}")" \
"$(IFS='-'; echo "${ports[*]}")"
done < URLs.txt
} > myFile.csv
Проблема в том, что иногда Nmap не возвращает никакого результата. В этом случае я хочу добавить значение None
в массив ports
, поэтому я добавил этот фрагмент кода перед #Output
part:
if [ ${#ports[@]} -eq 0 ]; then
ports+=("none")
fi
, но, похоже, это не так работать, и это значение не добавляется в третий столбец моего файла .csv (соответствующее поле третьего столбца становится пустым). Что не так?