Стартиране на запазена Mac VPN от терминала със scutil --nc
Използвайте scutil --nc, за да стартирате, прегледате и спрете запазена macOS VPN услуга, дръжте удостоверенията извън argv и докажете, че трафикът наистина минава през тунела.
Имате запазена 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.
За обвивка, която изпълнявате ръчно, дръжте реда фиксиран: списък, състояние, старт, проверка, тест на маршрута, стоп, потвърждение. Не извличайте приятелското име от свободен изход, когато идентификаторът е наличен, и не приемайте изхода на командата за стартиране за готовност. Мениджърът на връзки съобщава състояние; вашето доказателство е състоянието плюс маршрут, който сочи към тунела.