Автоматизуйте вхід у VPN, коли клієнт не має API чи CLI
Виберіть шлях скрипту за тим, що надає клієнт: профіль, що належить операційній системі, CLI постачальника, який читає секрет зі stdin, або автоматизація GUI як останній засіб.
Це вирішують три питання, і лише три. Чи створює клієнт у операційній системі запис підключення, який переживає перезавантаження? Чи надає він командний рядок, здатний узяти секрет не зі свого списку аргументів? Чи вимога ідентичності змушує людину відповідати на запит у браузері? Дайте відповідь у цьому порядку, і вибір перестає бути справою смаку, бо запланована задача може бути безголовою лише настільки, наскільки дозволяє найслабша з трьох відповідей.
Зіставте клієнт із трьома скриптованими рівнями
Власний профіль ОС, CLI постачальника, клієнт лише з GUI і клієнт із браузерним SSO потребують чотирьох різних підходів. Перші два переживають перезавантаження без нагляду, і перезавантаження без нагляду це вся суть. Іншим двом потрібне проєктне рішення раніше, ніж скрипт.
| What the client exposes | What to script | What still bites |
|---|---|---|
| OS-native connection entry | rasdial, scutil --nc, nmcli | Tunnel is up before DNS and routes settle |
| Vendor CLI reading stdin | CLI wrapped by the scheduler, secret from the credential store | Prompt text changes between releases |
| GUI only | Pinned version plus a state assertion | Locale and DPI break the click targets |
Шлях перший: профілем уже володіє операційна система
Це найдешевший шлях і той, який більшість оминає. У Windows rasdial "Office" підключається, а rasdial "Office" /disconnect закриває з'єднання; rasphone -d "Office" керує тим самим записом через інтерфейс комутованого доступу. macOS перелічує збережені служби за допомогою scutil --nc list і запускає одну за допомогою scutil --nc start. Linux передає роботу NetworkManager.
rasdial "Office" user *
scutil --nc start "Office"
nmcli connection up id Office
nmcli -t -f GENERAL.STATE connection show OfficeЦі інтерфейси знають лише профілі, що належать ОС, тому не можуть керувати довільним стороннім клієнтом. Якщо профілю немає, створіть його один раз і дайте скрипту перевіряти його, а не створювати заново під час кожного запуску. Зробіть скрипт ідемпотентним: прочитайте поточний стан, підключайтеся лише за розриву, а потім перевірте приватне ім'я, яке задачі справді потрібне.
Шлях другий: постачальник надає командний рядок
Деякі клієнти відкривають достатньо командного рядка, щоб їх можна було обгорнути: Cisco AnyConnect роками має помічник лише для підключення, а OpenConnect говорить протоколами AnyConnect, GlobalProtect і Pulse з одного бінарного файлу. Важлива вимога не список прапорців, а те, звідки береться секрет, бо пароль у списку аргументів може прочитати кожен, хто вміє перелічити процеси.
printf '%s\n' "$VPN_PASS" | openconnect --protocol=anyconnect \
--user "$VPN_USER" --passwd-on-stdin vpn.example.comFortiClient і деякі збірки GlobalProtect взагалі не мають підтримуваного CLI, а спільнотний клієнт або заміна з ліцензією постачальника це рішення про закупівлю, а не обхід. У CI дайте службовому обліковому запису права саме на цей бінарний файл, а не на оболонку, щоб впроваджений аргумент не міг стати командою root.
Шлях третій: автоматизація GUI і чому вона остання
Коли офіційний клієнт не має інтерфейсу, скрипти натискають кнопки через віконні повідомлення або SendKeys. Це крихко щодо версії та мови, може залишити напівпідключений сеанс і тихо збоїть, коли діалог з'являється не тією мовою. Якщо обираєте цей шлях, закріпіть версію клієнта, потім перевірте отриманий стан з'єднання і тримайте документований ручний запасний план поруч зі скриптом.
Та сама обережність стосується примусового відключення клієнта вбивством його процесу. Тунель може пережити процес, або супервізор може перезапустити його, тож убити-й-перезапустити теж не надійне скидання.
Що ламається після підняття тунелю
Успішне підключення доводить автентифікацію і нічого більше. Перевірте ресурс, заради якого існує задача, його власним протоколом і коротким тайм-аутом, і назвіть етап у повідомленні про помилку. Профілі, сертифікати й збережені облікові дані, видимі на вашому робочому столі, можуть бути невидимими для сеансу служби, тому запустіть задачу один раз під власним обліковим записом планувальника, перш ніж їй довіряти.
Обмежте повтори. Цикл, що повторює відхилені облікові дані, блокує облікові записи, а на запит MFA безголова задача не може відповісти без проєкту реєстрації; скриптові повтори проти потоку браузерного SSO лише спалюють спроби. Надавайте перевагу корисному навантаженню VPN, що доставляється через MDM, або профілю конфігурації для парку, де платформа володіє життєвим циклом облікових даних, і тримайте скрипти для клієнтів, якими так керувати не можна.
Записуйте код виходу і перший ресурс, що збійно завершився, а не сам факт запуску скрипту. Саме цей рядок перетворює попередження планувальника на діагностику за п'ять хвилин.