У вас є збережена служба VPN у Системних параметрах, і ви хочете, щоб термінал її запустив. У macOS підтримуваний шлях — scutil --nc, але лише для служб, якими володіє власний менеджер мережевих з’єднань системи. Рядок меню — не API: у сторонніх клієнтів зазвичай є власна автоматизація, а профіль, надісланий службою керування, може відмовити в локальному запуску. Це мій контрольний список: знайти точну службу, прочитати її стан, запустити її, дочекатися зміни стану й потім довести, що трафік справді йде через тунель. Зупиніться на першому кроці, який не збігається, бо кожна наступна команда припускає, що попередня вдалася.

Знайдіть службу, перш ніж намагатися її запустити

Почніть з інвентаризації, а не з імені профілю, яке пам’ятаєте:

scutil --nc help
scutil --nc list

Кожен рядок зіставляє стан з ідентифікатором служби, типом і відображуваним ім’ям. Ідентифікатор — це значення, за яким пишуть скрипти, бо відображувані імена повторюються і можуть бути змінені. Посібник scutil від Apple документує режим мережевого з’єднання, а встановлений --nc help — авторитетний список підкоманд на цьому Mac; не припускайте, що прапорець зі старого посібника ще існує у вашій версії macOS.

Порожній список — це результат, а не помилка. Служба, створена клієнтом постачальника або профілем керування, може бути активною, залишаючись невидимою тут, або видимою з типом, яким власний контролер не може керувати. У такому разі скористайтеся інструментом постачальника або документацією профілю. Створювати паралельний власний профіль лише для того, щоб було що запускати, — погана угода.

Прочитайте поточний стан і підтвердьте селектор

Запитайте стан служби перед запуском, щоб знати, що має змінити успішний запуск:

scutil --nc status "Office VPN"

Якщо дві служби мають однакове відображуване ім’я, ім’я неоднозначне. Передайте натомість ідентифікатор; команда приймає обидва, але лише ідентифікатор гарантує вибір однієї служби. Перевірте, що слово стану вам знайоме, — зазвичай Connected, Disconnected, Connecting або Disconnecting, — перш ніж розбирати його у скрипті. Перевірте також, чи керується профіль, бо заблокована конфігурація може прийняти команду і все одно проігнорувати її або запитати підтвердження.

Цей запит стану дешевий, тож використовуйте його як вартового в автоматизації: запускайте лише коли стан Disconnected, і не вважайте Connecting помилкою. Якщо служба вже Connected, пропустіть запуск, а не переривайте робочий тунель.

Запустіть з’єднання й дочекайтеся стабілізації стану

Запит на запуск асинхронний. Команда повертається, коли запит прийнято, а не коли завершилася автентифікація або встановлено маршрути. Запустіть її, потім опитуйте стан з обмеженим очікуванням і виходьте, якщо служба повертається в Disconnected:

scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
  state=$(scutil --nc status "Office VPN" | head -n 1)
  [ "$state" = "Connected" ] && break
  [ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
  sleep 2
  n=$((n + 1))
done

Стан Connecting, що ніколи не розв’язується, зазвичай указує на облікові дані, MFA або сервер, а не на scutil. Команда не може забезпечити інтерактивний вхід, тож профіль, який очікує токен або апаратний ключ, залишиться в Connecting і зрештою відкотиться. Прочитайте слово стану, перш ніж додавати повторні спроби; цикл проти запиту автентифікації не може досягти успіху.

Не вважайте код виходу оболонки готовністю. Корисний сигнал — рядок стану, за яким іде доказ того, що тунель несе трафік. Команда запуску, що тихо повертається, все ще може залишити вас із з’єднанням, яке ніколи не автентифікується.

Доведіть, що тунель несе трафік, а не просто каже Connected

Connected описує з’єднання, а не рішення про маршрутизацію. Власні служби PPP і IKEv2 створюють інтерфейс ppp або utun і встановлюють маршрути, тоді як розділений тунель навмисно залишає маршрут за замовчуванням недоторканим. Перевірте інтерфейси та обидві родини адрес:

ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns

Знайдіть інтерфейс, створений службою, замість того щоб вгадувати номер, потім запитайте таблицю маршрутизації, який інтерфейс використовує конкретне призначення: route -n get 10.0.0.10, підставивши внутрішній хост. Якщо вона повідомляє фізичний інтерфейс, тунель увімкнено, але він не несе цей потік. Перевірте маршрути розділеного тунелю, порядок резолверів і будь-яке локальне правило міжмережевого екрана, яке дозволяє інтерфейс тунелю, але не процес.

Розв’язання імен — звичайний хибнонегативний результат. Внутрішні імена можуть розв’язуватися через неправильний резолвер, поки тунель цілком здоровий, що виглядає як збій VPN і ним не є. scutil --dns показує порядок, який використовуватиме macOS; після зміни резолвера очистіть кеш за допомогою dscacheutil -flushcache і sudo killall -HUP mDNSResponder.

Тримайте облікові дані та привілеї поза командним рядком

Ніколи не вміщуйте пароль, заздалегідь спільний ключ або токен в аргументи. Аргументи видно у списках процесів і вони потрапляють в історію оболонки, а скопійований запис підтримки може їх розкрити. Власна обробка облікових даних профілю — чи то елемент Keychain, чи системний запит, чи потік автентифікації клієнта — це місце для секретів.

Запуск команди з sudo не робить інтерактивний вхід некерованим. Він змінює дієвого користувача, а не доступність запиту GUI, апаратного токена чи зв’язки ключів входу. LaunchAgent може запустити службу після того, як користувач увійшов і зв’язку ключів розблоковано; LaunchDaemon зазвичай не досягає цих частин сеансу користувача. Якщо організація керує службою, її правила життєвого циклу переважають будь-який локальний скрипт.

Зупиніть службу й перевірте, що вона залишилася зупиненою

Зупиніть тим самим селектором, який використовували для запуску, потім прочитайте стан знову, а не припускайте, що тунель зник:

scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"

Зупинка, що повертається в Disconnected, усе ж залишає одну річ для перевірки: чи налаштований профіль на підключення за потреби, що може повернути його без вашого скрипту. Якщо інший клієнт володіє маршрутами на тому самому Mac, ці маршрути можуть пережити власну зупинку. Перевірте маршрут ще раз, перш ніж зробити висновок, що машина поза VPN.

Для обгортки, яку запускаєте вручну, тримайте порядок фіксованим: список, стан, запуск, опитування, тест маршруту, зупинка, підтвердження. Не розбирайте дружнє ім’я з вільного виводу, коли ідентифікатор доступний, і не вважайте вихід команди запуску готовністю. Менеджер з’єднань повідомляє стан; ваш доказ — це стан плюс маршрут, що вказує на тунель.

Схожі статті