Скриптовете, на които им трябва работещ 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 и настройката на идентификационните данни, която тя очаква. Команда, изпълнена в сесия на влязъл потребител на работния плот, и услуга, която стартира с машината, не споделят контекст. Не предполагайте, че скрипт, който работи, докато сте влезли, ще работи при зареждане. Тествайте пътя за стартиране отделно, със същия краен срок и журнал.

Подобни статии