Проверьте, если IP в массиве с Bash - PullRequest
0 голосов
/ 04 октября 2011

Я пытаюсь написать 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 not not ok"

Cheers! 3

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Вы не цитируете свои переменные, поэтому 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  
1 голос
/ 04 октября 2011
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"
     }' 
...