URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 42408
[ Назад ]

Исходное сообщение
"Помогите написать скрипт."

Отправлено RSRuslan , 01-Апр-04 15:03 
К сожалению в FreeBSD я пока новичок. И синтаксиса написания скриптов в среде sh пока не знаю.

Надо, написать скрипт, который в будущем был бы запущен как постоянный процесс и выполнял следующее:

Если (ping на определённый адрес проходит) то
     Если (route -net 10.10.10.0 88.88.88.88) нету в таблице маршрутизации, ТО
         route add -net 10.10.10.0/24 88.88.88.88;
     Иначе
         ничего не делать;
     Конец Если;
Иначе
     Ничего не делать;
Конец Если;

Извените, за синтаксис. Логически я себе это представляю, а вот как это должно выглядеть в скрипте для FreeBSD - увы, пока не знаю.


Спасибо, за любую помощь.


Содержание

Сообщения в этом обсуждении
"Помогите написать скрипт."
Отправлено vitaliy , 01-Апр-04 15:21 
#!/bin/sh
ping -c 4 x.x.x.x>/dev/null
if [ $? -eq 0 ]
then
echo "Ping"
netstat -r|grep 10.10.10.0>/dev/null
if [ $? -eq 0 ]
then
echo "Route"
else
echo "Not route"
fi
else
echo "Not ping"
fi

"Помогите написать скрипт."
Отправлено RSRuslan , 01-Апр-04 15:31 
Большое спасибо за ответ!
Если не тяжело, помогите понять что здесь к чему...

>#!/bin/sh
>ping -c 4 x.x.x.x>/dev/null - Это понятно!

>if [ $? -eq 0 ] - вот этого я не понимаю!!!

>then
>echo "Ping" - вот этого тоже не понимаю!


>netstat -r|grep 10.10.10.0>/dev/null - это понятно!

>if [ $? -eq 0 ] - этого тоже не доганяю!

>then
>echo "Route" - здесь, насколько я понял, должна быть команда добавления маршрута???


Всё остальное вроде ясно...
>else
>echo "Not route"
>fi
>else
>echo "Not ping"
>fi

Если не тяжело - объясните, пожалуйста.

Спасибо.


"Помогите написать скрипт."
Отправлено RSRuslan , 01-Апр-04 15:51 
Вроде со всем разобрался и скрипт заработал.
Осталось последнее: скрипт выполняется один раз - и прекращает свою работу. А мне надо, чтобы он выполнялся постоянно. Другими словами, в конце кода, должна стоять метка безусловного перехода на начало.

Как это должно выглядеть?
Подскажите?


"Помогите написать скрипт."
Отправлено isehot , 01-Апр-04 15:54 
Слушайте когда у вас полностью скрипт написан будет кинте его задесь весь... желательно с коментариями...  может людям понадобиться... да и я заберу :)

"Помогите написать скрипт."
Отправлено vitaliy , 01-Апр-04 15:58 
>Вроде со всем разобрался и скрипт заработал.
>Осталось последнее: скрипт выполняется один раз - и прекращает свою работу. А
>мне надо, чтобы он выполнялся постоянно. Другими словами, в конце кода,
>должна стоять метка безусловного перехода на начало.
>
>Как это должно выглядеть?
>Подскажите?

1 вариант - бесконечный цикл:
while true
do
здесь остальные команды
done

2 вариант - запихнуть скрипт в крон. Это мне нравитмся больше.


"Помогите написать скрипт."
Отправлено RSRuslan , 01-Апр-04 16:04 
>1 вариант - бесконечный цикл:
>while true
>do
>здесь остальные команды
>done
>
>2 вариант - запихнуть скрипт в крон. Это мне нравитмся больше.


А что такое "запихнуть скрипт в крон"??? И как это сделать!

Извените, конечно, за навязчивость...

Спасибо.


"Помогите написать скрипт."
Отправлено vitaliy , 01-Апр-04 16:09 
>А что такое "запихнуть скрипт в крон"??? И как это сделать!
>
>Извените, конечно, за навязчивость...
>
>Спасибо.

man cron, man crontab


"Помогите написать скрипт."
Отправлено vitaliy , 01-Апр-04 15:54 
>>if [ $? -eq 0 ] - вот этого я не понимаю!!!
Это значит, что предыдущая команда вернула 0, то есть нормальное завершение. Для пинга это есть пинг, для грепа - есть вхождение
>>echo "Ping" - вот этого тоже не понимаю!
Просто вывод на экран слова Ping
>>echo "Route" - здесь, насколько я понял, должна быть команда добавления маршрута???
Нет. Это значит что она есть
>>else
>>echo "Not route"
Вот здесь должна быть команда добавления маршрута

"Помогите написать скрипт."
Отправлено RSRuslan , 01-Апр-04 15:58 
>>>if [ $? -eq 0 ] - вот этого я не понимаю!!!
>Это значит, что предыдущая команда вернула 0, то есть нормальное завершение. Для
>пинга это есть пинг, для грепа - есть вхождение
>>>echo "Ping" - вот этого тоже не понимаю!
>Просто вывод на экран слова Ping
>>>echo "Route" - здесь, насколько я понял, должна быть команда добавления маршрута???
>Нет. Это значит что она есть
>>>else
>>>echo "Not route"
>Вот здесь должна быть команда добавления маршрута

Спасибо, Виталий!!! Всё понял, со все разобрался!
Только скрипт выполняется один раз и завершает свою работу. А мне надо, чтобы он выполнялся постоянно, тоесть в конце стоял безусловный переход в самое начало.
Вы поняли, я хочу запустить его как постоянный процесс, который будет анализировать, работает соединение или нет...

Спасибо.



"Pomogite napisat' skript."
Отправлено Brainbug , 01-Апр-04 16:38 
>>>>if [ $? -eq 0 ] - vot `etogo ya ne ponimayu!!!
>>`Eto znachit, chto predyduschaya komanda vernula 0, to est' normal'noe zavershenie. Dlya
>>pinga `eto est' ping, dlya grepa - est' vhozhdenie
>>>>echo "Ping" - vot `etogo tozhe ne ponimayu!
>>Prosto vyvod na `ekran slova Ping
>>>>echo "Route" - zdes', naskol'ko ya ponyal, dolzhna byt' komanda dobavleniya marshruta???
>>Net. `Eto znachit chto ona est'
>>>>else
>>>>echo "Not route"
>>Vot zdes' dolzhna byt' komanda dobavleniya marshruta
>
>Spasibo, Vitalij!!! Vsio ponyal, so vse razobralsya!
>Tol'ko skript vypolnyaetsya odin raz i zavershaet svoyu rabotu. A mne nado,
>chtoby on vypolnyalsya postoyanno, toest' v konce stoyal bezuslovnyj perehod v
>samoe nachalo.
>Vy ponyali, ya hochu zapustit' ego kak postoyannyj process, kotoryj budet analizirovat',
>rabotaet soedinenie ili net...
>
>Spasibo.

#!/bin/sh

PING_CMD=`which ping`
PING_FLAGS="-c 3"
PING_HOST_IP="10.10.10.10"
ROUTE_CMD=`which route`
ROUTE_CMD_FLAGS="add -net 10.10.10.0/24 88.88.88.88 "
NETSTAT_CMD=`which netstat`
NETSTAT_FLAGS="-rn -f inet"

while true
do
        $PING_CMD $PING_FLAGS $PING_HOST_IP > /dev/null 2>&1
        case  $? in
                0)echo "PING GOOD"
                ;;
                *) NETSTAT_RESULT=`$NETSTAT_CMD $NETSTAT_FLAGS | awk '{if($1~/10.10.10\/24/) print $1}'`
                   echo $NETSTAT_RESULT
                   if [ $NETSTAT_RESULT ]; then
                         echo "route exist"
                   else
                         echo $ROUTE_CMD $ROUTE_CMD_FLAGS
                   fi
                ;;
        esac
        sleep 10
done


"Вот резюме по данному вопросу!!!"
Отправлено RSRuslan , 01-Апр-04 20:33 
Спасибо, за опцию "sleep 10". Она мне в этом бесконечном цикле помогла выдержать какую-то паузу.
Спасибо, Виталию за помощь в написании скрипта.

Итак, по вышеизложенным просьбам пишу как он выглядит окончательно:

#!/bin/sh
while true
do
ping -c 4 10.10.10.10>/dev/null
if [ $? -eq 0 ]
then
   echo "The vpn connection to office 'ХХХХХХХ' is active."
   netstat -r | grep 88.88.88/24>/dev/null
   if [ $? -eq 0 ]
   then
      echo "The route to office 'ХХХХХХХ' is active."
   else
      echo "The route to office 'ХХХХХХХ' is not active!"
      ifconfig ng0 | grep UP>/dev/null
      if [ $? -eq 0 ]
      then
         route add -net 88.88.88.0/24 10.10.10.10
      else
         echo "The interface 'ng0' is down!"
      fi
   fi
else
   echo "The vpn connection to office 'ХХХХХХХ' is not active!"
fi
sleep 30
done

А теперь с комментариями:

#!/bin/sh

while true
do
- запускаем бесконечный цикл;

ping -c 4 10.10.10.10>/dev/null
- пингуем нужный нам адресс;

if [ $? -eq 0 ]
then
- если пинг проходит успешно, то переходим к анализу присутствия маршрута;

   echo "The vpn connection to office 'ХХХХХХХ' is active."
- эту строчку можно выводить или на терминал, или в лог-файл, по желанию;

   netstat -r | grep 88.88.88.0/24>/dev/null
- проверяем присутствие маршрута в таблице маршрутизации;

   if [ $? -eq 0 ]
   then
      echo "The route to office 'ХХХХХХХ' is active."
- если маршрут присутствует, то выводим сообщение;

   else
      echo "The route to office 'ХХХХХХХ' is not active!"
      ifconfig ng0 | grep UP>/dev/null
- если маршрут не присутствует, то делаем проверку: поднят ВПН-интерфейс или нет. Без этой проверки, очень часто бывало так, что нижеуказанный маршрут добавлялся, но не на ВПН-интерфейс, а на интерфейс локальной сети и соответственно ВПН-соединение между двумя офисами не работало, корректно;

      if [ $? -eq 0 ]
      then
         route add -net 88.88.88.0/24 10.10.10.10
- если ВПН-интерфейс поднят, то добавляем маршрут;

      else
         echo "The interface 'ng0' is down!"
      fi
- иначе выводим, что интерфейс закрыт, и соттветственно конец проверки условия на предмет активности ВПН-интерфейса;

   fi
- конец проверки условия присутствия маршрута в таблице маршрутизации;

else
   echo "The vpn connection to office 'ХХХХХХХ' is not active!"
- если пинга нет, то выводим вышеуказанный текст;

fi
- конец проверки условия, на наличие положительного пинга;

sleep 30
- выдерживаем паузу 30 секунд, для запуска цикла по новой;

done
- конец.


Вот, в принципе и всё!
От себя хочу добавить, что запустив этот скрипт в фоновом режиме из rc-шников - всё работает пока отлично. Рвётся ВПН-соединение из-за "погодных условий", или нет, скрипт своё дело делает и как только соединение появляется, две локальных сети видят друг-друга по ВПНу на ура..

Всем спасибо, за помощь и внимание!


"Вот резюме по данному вопросу!!!"
Отправлено Simps , 02-Апр-04 14:35 
>Спасибо, за опцию "sleep 10". Она мне в этом бесконечном цикле помогла
>выдержать какую-то паузу.
>Спасибо, Виталию за помощь в написании скрипта.
>
>Итак, по вышеизложенным просьбам пишу как он выглядит окончательно:
>
>#!/bin/sh
>while true
>do
>ping -c 4 10.10.10.10>/dev/null
>if [ $? -eq 0 ]
>then
>   echo "The vpn connection to office 'ХХХХХХХ' is active."
>
>   netstat -r | grep 88.88.88/24>/dev/null
>   if [ $? -eq 0 ]
>   then
>      echo "The route to office 'ХХХХХХХ'
>is active."
>   else
>      echo "The route to office 'ХХХХХХХ'
>is not active!"
>      ifconfig ng0 | grep UP>/dev/null
>      if [ $? -eq 0 ]
>
>      then
>         route add -net
>88.88.88.0/24 10.10.10.10
>      else
>         echo "The interface
>'ng0' is down!"
>      fi
>   fi
>else
>   echo "The vpn connection to office 'ХХХХХХХ' is not
>active!"
>fi
>sleep 30
>done
>
>А теперь с комментариями:
>
>#!/bin/sh
>
>while true
>do
> - запускаем бесконечный цикл;
>
>ping -c 4 10.10.10.10>/dev/null
> - пингуем нужный нам адресс;
>
>if [ $? -eq 0 ]
>then
> - если пинг проходит успешно, то переходим к анализу присутствия маршрута;
>
>
>   echo "The vpn connection to office 'ХХХХХХХ' is active."
>
> - эту строчку можно выводить или на терминал, или в лог-файл,
>по желанию;
>
>   netstat -r | grep 88.88.88.0/24>/dev/null
> - проверяем присутствие маршрута в таблице маршрутизации;
>
>   if [ $? -eq 0 ]
>   then
>      echo "The route to office 'ХХХХХХХ'
>is active."
> - если маршрут присутствует, то выводим сообщение;
>
>   else
>      echo "The route to office 'ХХХХХХХ'
>is not active!"
>      ifconfig ng0 | grep UP>/dev/null
> - если маршрут не присутствует, то делаем проверку: поднят ВПН-интерфейс или
>нет. Без этой проверки, очень часто бывало так, что нижеуказанный маршрут
>добавлялся, но не на ВПН-интерфейс, а на интерфейс локальной сети и
>соответственно ВПН-соединение между двумя офисами не работало, корректно;
>
>      if [ $? -eq 0 ]
>
>      then
>         route add -net
>88.88.88.0/24 10.10.10.10
>- если ВПН-интерфейс поднят, то добавляем маршрут;
>
>      else
>         echo "The interface
>'ng0' is down!"
>      fi
>- иначе выводим, что интерфейс закрыт, и соттветственно конец проверки условия на
>предмет активности ВПН-интерфейса;
>
>   fi
> - конец проверки условия присутствия маршрута в таблице маршрутизации;
>
>else
>   echo "The vpn connection to office 'ХХХХХХХ' is not
>active!"
> - если пинга нет, то выводим вышеуказанный текст;
>
>fi
> - конец проверки условия, на наличие положительного пинга;
>
>sleep 30
> - выдерживаем паузу 30 секунд, для запуска цикла по новой;
>
>done
> - конец.
>
>
>Вот, в принципе и всё!
>От себя хочу добавить, что запустив этот скрипт в фоновом режиме из
>rc-шников - всё работает пока отлично. Рвётся ВПН-соединение из-за "погодных условий",
>или нет, скрипт своё дело делает и как только соединение появляется,
>две локальных сети видят друг-друга по ВПНу на ура..
>
>Всем спасибо, за помощь и внимание!

У блин ребята! А нафиг я все скрипты пишу на перле ? sh - крута!