#arrays #bash #awk #ip
#массивы #bash #awk #ip
Вопрос:
Я пытаюсь написать скрипт bash, который будет принимать выходные данные who, анализировать его с помощью awk, извлекая IP-адрес, а затем сверяя его с массивом IP-адресов…звучит просто, но сценарий, который я собрал, похоже, не работает, я протестировал его на OSX и Ubuntu, кто-нибудь может определить, почему?
ip_address_is_safe() {
local address_to_test=$1;
for safe_ip in "${safe_ips[@]}"
do
if [[ $safe_ip == $address_to_test ]];
then
return 0;
fi
done;
return 1;
}
who="root pts/0 2011-10-03 23:13 (99.99.999.999)
root pts/0 2011-10-03 23:13 (12.12.121.121)
root pts/0 2011-10-03 23:13 (14.14.141.141)
root pts/0 2011-10-03 23:13 (127.0.0.1)
";
safe_ips=("(14.14.141.141)" "(127.0.0.1)")
old_ifs=$IFS;
export IFS="
";
for word in $who; do
remote_connected_ip=`echo $word | awk '/(23)/ {print $5}'`;
if (ip_address_is_safe "$remote_connected_ip")
then
echo "ip was ok - $remote_connected_ip"
else
echo "ip was not ok - $remote_connected_ip"
fi
done;
Он продолжает сообщать о каждом IP-адресе как «ip не был в порядке»
Приветствия!3
Ответ №1:
Вы не цитируете свои переменные, поэтому awk не видит того, что, по вашему мнению, он видит: вам нужно
for word in "$who"; do
remote_connected_ip=`echo "$word" | awk '/(23)/ {print $5}'`
Это может быть более чистым и не требует awk:
who | while read name tty date time ip; do
if ip_address_is_safe $ip; then
echo $ip ok
else
echo $ip not ok
fi
done
Ответ №2:
if [[ $safe_id == ...
должно быть:
if [[ $safe_ip ==
Учитывая, что задействован awk, вы могли бы сделать все это в awk:
who |
awk 'BEGIN {
n = split("(14.14.141.141) (127.0.0.1)", t)
for (i = 0; i <= n;) safe_ips[t[i]]
}
$NF {
print "ip was", ($NF in safe_ips ? x : "not"), "OK"
}'