PDA

Просмотр полной версии : Будет ли работать скрипт?


Sir Arthur
04.06.2009, 11:10
Скрипт
cat /etc/mrtg/ipsec.sh
#!/usr/bin/perl -w

$file = "addr.txt";

open (InFile, "$file");
foreach $line (<InFile>)
{

PING="/bin/ping";
ADDR=$line;
DATA=`$PING -c4 -s500 $ADDR -q `;
LOSS=`echo $DATA | awk '{print $18 }' | tr -d %`;
echo $LOSS
if [ $LOSS = 100 ];
then
echo 0;
else
echo $DATA | awk -F/ '{print $5 }';
fi

};
close(InFile);
#original by GrayCat

файл входных параметров

cat /etc/mrtg/addr.txt
10.2.2.1
10.16.2.1
10.39.2.129
10.52.2.1
10.86.2.1
10.86.2.129
10.54.2.1
10.61.2.193
10.63.2.1
10.78.2.253
10.23.2.1
10.72.2.1
10.25.2.1
10.25.2.129
172.17.4.10


---------- Добавлено в 11:10 ---------- Предыдущее сообщение было написано в 11:03 ----------

ругается вот так
/etc/mrtg/ipsec.sh > result
Unquoted string "awk" may clash with future reserved word at /etc/mrtg/ipsec.sh line 18.
Unquoted string "fi" may clash with future reserved word at /etc/mrtg/ipsec.sh line 21.
Can't modify constant item in scalar assignment at /etc/mrtg/ipsec.sh line 9, near ""/bin/ping";"
syntax error at /etc/mrtg/ipsec.sh line 17, near "else"
syntax error at /etc/mrtg/ipsec.sh line 21, near "fi

}"
Execution of /etc/mrtg/ipsec.sh aborted due to compilation errors.

storinger
04.06.2009, 11:36
Не знаю будет оно работать или нет, но по-моему смешно вызывать awk изнутри перлового скрипта :)

shurutov
04.06.2009, 15:37
Нет, не будет. У тебя шелловский скрипт, кроме:
#!/usr/bin/perl -w

$file = "addr.txt";

open (InFile, "$file");
foreach $line (<InFile>)
{

и
close(InFile);
ВСЕ! все остальное тело - шелл в чистом виде.

GrayCat
04.06.2009, 17:08
я намекну
%-)))


#!/bin/sh

ip_list=`cat ip-list.txt`

for ip in $ip_list
do
echo $ip
done


сделано "в лоб" и за 15 сек
%-)))

вот только не знаю, сколько влазит в переменную (максимум)

storinger
04.06.2009, 18:50
Да нафига тебе вообще переменная ?

for ip in `cat ip-list.txt` ; do echo $ip ; done

Даже и скрипт писать не надо, просто команда :)

GrayCat
04.06.2009, 19:03
Даже и скрипт писать не надо, просто команда
ты, пардон, выше-то читал ?
"скрипт" Sir Arthur-а смотрел ?
%-)))

лучче бы сказал, сколько IP-адресов максимально влезет в переменную
и будет ли разница между
for ip in $ip_list
и
for ip in `cat ip-list.txt`

%-)))

storinger
04.06.2009, 19:12
Я чего-то не догнал что сделать-то надо в этом скрипте. Лоссы посчитать по каждому адресу что ли ?

slim
04.06.2009, 21:57
ping -n -c 3 -q $ip |grep avg |cut -d= -f2 |awk -F"/" '{print $2}' |sed -e 's/ms//'

запихнуть это :horr: в туда, что сказал storinger или GrayCat :)

Sir Arthur
05.06.2009, 09:46
Я чего-то не догнал что сделать-то надо в этом скрипте. Лоссы посчитать по каждому адресу что ли ?
есть адреса в файле. их надо пинговать по крону, результат пинга отдать в mrtg

as
05.06.2009, 10:38
Вить, дык пинг много о чем сказать может, ты определись с параметрами, которые тебе нужны. Организовать перебор хостов можно по разному, я тебе в скайпе показывал чтение read-ом из файла в цикле, здесь вон народ по другому, а уже аут можно хоть авк, хоть седом парсить.

GrayCat
05.06.2009, 10:52
чтение read-ом из файла в цикле
это вот, кстати, более аккуратно будет
%-)

я просто раньше не пользовался, а потому в нужный момент не вспомнил

GrayCat
08.06.2009, 12:57
гыгы
чтение read-ом из файла в цикле
штука хитрая, как выяснилось

привожу два примера - вдруг кому спонадобится


data_file="read-list.txt"

# N 1
while read line
do
echo "$line"
done <${data_file}

# N 2
cat ${data_file} |
while read line
do
echo "$line"
done



:ps: это два разных способа сделать одно и то же
а то - мало ли
%-)))

GrayCat
08.06.2009, 14:08
третий вариант

# N 3
exec 5<>${data_file}

while read -u 5 line
do
echo "$line"
done

но не факт, что этот способ сработает в любом шелле (из-за ключика "-u")