Проверьте, есть ли IP в массиве с Bash

#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"
     }'