Управление именованным профилем Tunnelblick из терминала
Tunnelblick предоставляет connect, state и disconnect через AppleScript. Вызывайте этот интерфейс, оставляйте приложение ответственным и давайте каждому ожиданию срок.
Скрипты, которым нужен работающий VPN перед резервным копированием, часто запускают openvpn напрямую. Это отбрасывает профиль, DNS и обработку маршрутов, которыми Tunnelblick уже управляет. Поддерживаемый путь — собственный интерфейс AppleScript самого Tunnelblick, принимающий запросы connect, state и disconnect для именованной конфигурации. Используйте его и оставляйте приложение ответственным.
Говорите с приложением, а не с openvpn
Tunnelblick владеет профилем OpenVPN, выбором движка, скриптами и интеграцией DNS и маршрутов. Отдельный бинарник openvpn — другая схема запуска, а не короткий путь к тому же соединению.
Вызов скриптового интерфейса приложения сохраняет это владение неизменным и делает каждый запрос проверяемым.
Примеры здесь предполагают, что Tunnelblick находится в Applications, рабочая конфигурация называется HQ, а команды выполняются в сеансе вошедшего пользователя Mac. Замените имя на точную конфигурацию, которая у вас есть.
Запустите ровно один именованный профиль
Запрос connect называет конфигурацию. Это не запрос на подключение к тому, что было выбрано последним.
Выполните его в сеансе пользователя, которому принадлежит конфигурация:
osascript -e 'tell application "/Applications/Tunnelblick.app" to connect "HQ"'Пройдите обычные запросы входа. macOS может спросить, разрешено ли вызывающему приложению управлять Tunnelblick; проверьте, какое приложение и какая цель, прежде чем одобрять. Автоматизация, которая прощёлкивает этот диалог, лишает его смысла.
Запрос connect возвращается до того, как туннель поднят
Руководство по скриптам Tunnelblick однозначно: connect возвращается до завершения соединения. Нулевой код выхода означает, что запрос принят, а не что трафик идёт.
Читайте состояние отдельно:
osascript -e 'tell application "/Applications/Tunnelblick.app" to get state of first configuration where name = "HQ"'CONNECTED — это результат состояния соединения. Он всё ещё не доказывает, что частный ресурс, нужный вашей задаче, доступен, поэтому проверьте это отдельно, прежде чем начинать зависимую работу.
Другие элементы управления скриптового интерфейса охватывают более широкие действия и не нужны, когда меняется только один профиль.
Ждите со сроком, затем завершайтесь неудачей
Бесконечный опрос — это способ, которым скрипт висит всю ночь и блокирует следующий запуск. Дайте ожиданию срок, короткий интервал и явный исход неудачи. Считайте любое состояние, кроме CONNECTED, неготовым, включая переходные. Записывайте последнее увиденное состояние, чтобы неудача объясняла сама себя.
Ограниченный цикл выглядит так:
for i in $(seq 1 30); do
state=$(osascript -e 'tell application "/Applications/Tunnelblick.app" to get state of first configuration where name = "HQ"')
if [ "$state" = "CONNECTED" ]; then exit 0; fi
sleep 1
done
echo "tunnel did not reach CONNECTED" >&2
exit 1Тридцать секунд — пример, а не универсальный тайм-аут. Выбирайте срок по пути аутентификации, который профиль действительно использует, и храните его в записи рабочего процесса.
Проверьте состояние и отключите по имени
Чтобы остановить тот же профиль, вызовите disconnect с тем же именем. Это сохраняет запрос узким и не трогает другие конфигурации.
osascript -e 'tell application "/Applications/Tunnelblick.app" to disconnect "HQ"'Держите имя профиля и контроллер вместе в записи рабочего процесса, вместе с ожидаемыми проверками аутентификации и завершения. Именно эта запись делает команду проверяемой полгода спустя.
Поведение при запуске вместе с компьютером — другой режим. Используйте документированную опцию запуска Tunnelblick и настройку учётных данных, которую она предполагает. Команда, выполненная в сеансе вошедшего рабочего стола, и служба, стартующая вместе с машиной, не разделяют контекст. Не предполагайте, что скрипт, работающий при вашем входе, сработает при загрузке. Проверяйте путь запуска отдельно, с тем же сроком и журналированием.