Мой VPN иногда ведет себя странно, и мне приходится часто его перезагружать. Я хотел написать сценарий, который делает это для меня. Это не должно быть чем-то необычным, просто ярлык для команд, которые я должен ввести в терминал. Более конкретно: он будет смотреть на запущенные процессы. Если он найдет работающий процесс vpnc, он его убьет. Затем он запустит vpnc.

Я написал сценарии Bash аналогичной сложности, но теперь у меня нет Bash, только пепел. До сих пор единственное отличие, которое я заметил, состоит в том, что доступно гораздо меньше команд, но тогда я использую их не очень часто. Итак, у меня есть несколько вопросов.

  1. Отличается ли написание сценариев ash от сценариев bash?
  2. Есть ли что-то конкретное, чтобы рассмотреть, делая это?
  3. Когда скрипт готов, как я могу его развернуть? Для bash я просто поместил исполняемый файл в /usr /lib и запустил его, введя имя файла в командной строке. Будет ли это работать с ash?
  4. Есть ли какие-то особые ловушки, на которые стоит обратить внимание в сценарии, который я хочу написать? Я думаю, что часть процесса убийства может стать волосатой, если я напишу что-то, что убивает неправильный процесс, но даже тогда запуск скрипта не должен навсегда что-то сломать, верно?

2 ответа2

2

Я сомневаюсь, что в этом есть что-то конкретное, большая часть "магии" заключается во внешних командах. Итак, что-то вроде:

#!/bin/ash  
pgrep vpnc >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
    /etc/init.d/vpnc stop
    sleep 1
    pkill vpnc
    sleep 1
    pkill -9 vpnc
    sleep 1
    /etc/init.d/vpnc start
fi

Будет работать при условии, что у вас установлены pgrep и pkill и что ваш скрипт инициализации называется vpnc и находится в /etc/init.dash в /bin). Перетащите его в любое место в $PATH , установите бит выполнения (chmod +x myscript), и вам просто нужно вызвать его по имени, под которым вы его сохранили.

Традиционно локально установленные двоичные файлы (и сценарии) должны располагаться в /usr/local/bin , а не в /usr/lib . Если это не существует и отсутствует в вашем текущем $PATH просто создайте каталог (mkdir -p /usr/local/bin) и отредактируйте файл, который устанавливает $PATH (вероятно, что-то в /etc).

Обратите внимание, что с небольшим усилием вы можете обернуть это в скрипт, который делает что-то вроде:

#!/bin/ash
pgrep vpnc
if [ $? -eq 0 ]; then
    ping -n -q -c 4 ip.at.other.side
    if [ $? -ne 0 ]; then
        /usr/local/bin/myscript
    fi
fi

Вызывайте его из cron каждые N минут, и, когда VPN работает, а пинг с IP на другой стороне не выполняется, он перезапускает VPN.

Осторожно - я просто скомбинировал их из опыта, никаких испытаний не проводилось, и я никогда не использовал золу. Может потребоваться некоторая настройка или доработка.


Хорошо, если у вас нет cron, вы можете обернуть второй скрипт следующим образом:

#!/bin/ash
while [ true ]; do
    pgrep vpnc
    if [ $? -eq 0 ]; then
        ping -n -q -c 4 ip.at.other.side
        if [ $? -ne 0 ]; then
            /usr/local/bin/myscript
        fi
    fi
sleep 60
done

Чтобы запустить его в фоновом режиме, используйте nohup:

nohup /usr/local/bin/mywrapper &

Вы должны обнаружить, что есть по крайней мере один сервер, который отвечает на эхо-запрос, возможно, даже конечная точка VPN. Если это не работает, попробуйте DNS-серверы или маршрутизаторы (люди особенно редко блокируют маршрутизаторы).

0

Для полноты, фактический скрипт, который я использовал:

#! /bin/ash
pgrep vpnc >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
 pkill vpnc
 sleep 1
fi
vpnc /etc/vpnc/hybrid.conf

где hybrid.conf - это файл конфигурации для клиента vpnc. Я хотел бы узнать больше о сценариях, поэтому, если кто-то заметит здесь пример плохой практики, расскажите мне об этом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .