Несколько непоняток с at

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Несколько непоняток с at

Непрочитанное сообщение kpp » 2011-01-28 11:35:52

Сделал скрипт, для безопасного тестирования изменений правил фаервола при работе за удаленным терминалом.
Т.е. чтобы случайно не рубануть самому себе доступ к удаленному серверу :oops:
Может изобрел велосипед или самокат, но цель преследовал двоякую: потренироваться в написании шелл-скриптов и получить полезную штуку :smile:
Приниц работы.
Есть эталонный файл правил фаерволла, кот. однозначно работает и тестовый(непроверенный) файл правил.
Командой at планируется применение эталонного файла через указанное время (2-5 мин).
Выполняется применение тестового файла с выводом вопроса типа: "Оставить изменения ?[Y|y]"
Если тестовый файл применился нормально(самому себе коннект не рубанулся) - значит нажимаем Y , при этом запланированное задание удаляется, текущие загруженные правила остаются из тестового файла.
Если же не нажать Y ранее указанного времени (считается что что-то не так) и выполняется запланированное задание - загрузка эталонного файла правил фаерволла.

В принципе, все работает, однако есть непонятки в команде at
- скрипту не удается передать параметр из-за этого скрипт получился более громоздкий чем ожидалось;
- запланированное задание выполняется не через строго указанный промежуток времени - указываю

Код: Выделить всё

now + 2 minutes
, а выполняется в интервале 2-6 минут :Search: ;
- неудается получить номер запланированного задания при выполнении команды

Код: Выделить всё

`at -f $CURR_DIR/$LOAD_FIREWALL now + $TIMEOUT minutes
поэтому пришлось перенаправлять поток вывода в файл

Код: Выделить всё

`at -f $CURR_DIR/$LOAD_FIREWALL now + $TIMEOUT minutes 2> $AT_OUT`
и потом выкусывать из этого файла номер задания.
Прошу критично оценить что где не так и как сделать лучше\правильней. :smile:

Основной скрипт:

Код: Выделить всё

#!/bin/sh
# замена правил фаервола испытуемыми
# устанавливается время, по истечении кот. возвращается предыдущий(эталонный) файл правил

ETALON_FILE="/etc/my.firewall"
TEST_FILE="/etc/my.firewall_test"
TIMEOUT=2
CURR_DIR="/massiv/system/system/sh"
LOAD_FIREWALL="reload_firewall.sh"
AT_OUT="/tmp/at_out"

# удалить временный файл, если есть
if [ -f "$AT_OUT" ]
then
 rm "$AT_OUT"
fi

# через указанное ко-во минут вернуть исходные правила фаервола
 `at -f $CURR_DIR/$LOAD_FIREWALL now + $TIMEOUT minutes 2> $AT_OUT`

if [ $? -eq 0 ]
then
 # загрузить испытуемые правила
  RER=`$CURR_DIR/$LOAD_FIREWALL $TEST_FILE`

 # записть номер процесса во временный файл
  `echo "pid=$$" >> $AT_OUT`
 # получить номер зашедуленного задания
  VAT=`cat "$AT_OUT" | grep 'Job [0-9]\{1,\} will be executed' | awk -F ' ' '{print $2}'`
 # получить и отобразить полную информацию по зашедуленному заданию
  printf "Запланировано выполнение скрипта:\n `atq $VAT`\n\n"

 echo "Оставить изменения ?[Y|y]"
 read REZ
 if [ "$REZ" = "y" ] || [ "$REZ" = "Y" ]
 then
  # Удалить зашедуленное задание
  if [ -n "`atq | grep $VAT`" ]
  then
    echo "Удаление зашедуленного задания"
    atrm $VAT
  else
    echo "Задание с номером "$VAT" не найдено!"
  fi
 fi

else echo "Ошибка команды at!"
fi

# удалить временный файл, если есть
if [ -f "$AT_OUT" ]
then
 rm "$AT_OUT"
fi
Вспомагательный скрипт reload_firewall.sh, кот. запускается(или зашедуливается) из основного скрипта:

Код: Выделить всё

#!/bin/sh
#
ETALON_FILE="/etc/my.firewall"
TEST_FILE="/etc/my.firewall_test"
AT_OUT="/tmp/at_out"

if [ -z $1 ]
then VYP=$ETALON_FILE
else VYP=$1
fi

# загрузить правила фаерволла из указанного файла
# для теста пока только вывод имени загружаемого файла (прийдет на почту рута)
# . "$VYP"
echo "$VYP"

if [ -n "$1" ]
then
 echo "exit"
 exit 0
fi

# удалить начальный скрипт
VAT=""
if [ -f "$AT_OUT" ]
then
 VAT=`cat "$AT_OUT" | grep 'pid=' | awk -F '=' '{print $2}'`
 #`ps -aux | grep '' `
  if [ -n "$VAT" ]
  then
   echo "kill -9 $VAT"
   kill -9 $VAT
  else echo "No PID process!".
  fi
fi
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
vadim64
майор
Сообщения: 2101
Зарегистрирован: 2009-09-17 15:15:26
Откуда: Засратовец

Re: Несколько непоняток с at

Непрочитанное сообщение vadim64 » 2011-02-03 11:26:52

а чем вам не подходит решение с запуском этих сценариев из крона?
Люди не делятся на национальности, партии, фракции и религии. Люди делятся на умных и дураков, а вот дураки делятся на национальности, партии, фракции и религии.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Несколько непоняток с at

Непрочитанное сообщение kpp » 2011-02-03 13:58:55

Это одноразовое действие, зачем крон?
Можно, конечно, добавить задание в крон - потом его незабыть удалить.
Разве в данном случае не логичнее использовать "одноразовый" планировщик at ?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
vadim64
майор
Сообщения: 2101
Зарегистрирован: 2009-09-17 15:15:26
Откуда: Засратовец

Re: Несколько непоняток с at

Непрочитанное сообщение vadim64 » 2011-02-03 14:07:18

ну когда я эксперементировал с фаерволом, мне було удобнее на 2 дня повесить еже10минутное задание в крон, чем перед каждым эксперементальным запуском назначать разоваое задание
помимо того: можно в самом верху правил поставить разрешение для себя, так чтоб оно отрабатывало со 100% вероятностью
помимо того: если речь идёт об отрубаниях по причине синтаксических ошибок, юзайте ipfw -n /path-to-rules-file
Люди не делятся на национальности, партии, фракции и религии. Люди делятся на умных и дураков, а вот дураки делятся на национальности, партии, фракции и религии.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Несколько непоняток с at

Непрочитанное сообщение kpp » 2011-02-03 14:27:14

Повторюсь.
Основная цель - потренироваться в написании скриптов, я не утверждаю, что мой вариант "безопасного тестирования изменения правил фаерволла" самый лучший.
Скрипт удобен тем, что его достаточно запустить (можно доработать с параметрами) - и он все сделает сам. Т.е. автоматизирован процесс - не нужно добавлять задание в крон, помнить, когда оно сработает, не забыть удалить из крона.

В процессе написания\использования скрипта появились вопросы\непонятки в поведении команды at, в которых хочу разобраться.
Возможно есть более короткий\оптимальный\правильный вариант.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Несколько непоняток с at

Непрочитанное сообщение kpp » 2011-02-05 22:51:43

По поводу :
- запланированное задание выполняется не через строго указанный промежуток времени - указываю
now + 2 minutes
, а выполняется в интервале 2-6 минут ;
Ответ нашел.
Оказывается, все задания, запланированные командой at проверяются на наступление момента выполнения и выполняются утилитой atrun, которая по умолчанию запускается кроном раз в 5 минут. Поэтому возможна разбежность 0+5 минут.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.