Т.е. чтобы случайно не рубануть самому себе доступ к удаленному серверу

Может изобрел велосипед или самокат, но цель преследовал двоякую: потренироваться в написании шелл-скриптов и получить полезную штуку

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

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

Основной скрипт:
Код: Выделить всё
#!/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
Код: Выделить всё
#!/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