Стартување зачувана Mac VPN од терминалот со scutil --nc
Користете scutil --nc за да стартувате, проверите и запрете зачувана macOS VPN услуга, држете ги акредитивите надвор од argv и докажете дека сообраќајот навистина го користи тунелот.
Имате зачувана VPN услуга во Системски поставки и сакате терминалот да ја стартува. На macOS поддржаниот пат е scutil --nc, но само за услуги што ги поседува сопствениот менаџер за мрежни врски на системот. Мени-лентата не е API: клиентите од трети страни обично имаат сопствена автоматизација, а профилот што го испраќа услуга за управување може да одбие локално стартување. Ова е контролната листа што ја извршувам: пронајдете ја точната услуга, прочитајте ја нејзината состојба, стартувајте ја, почекајте состојбата да се смени и потоа докажете дека сообраќајот навистина го користи тунелот. Запрете на првиот чекор што не се совпаѓа, бидејќи секоја следна команда претпоставува дека претходната успеала.
Пронајдете ја услугата пред да се обидете да ја стартувате
Започнете со инвентарот, а не со името на профилот што го паметите:
scutil --nc help
scutil --nc list
Секој ред спарува состојба со идентификатор на услуга, тип и прикажано име. Идентификаторот е вредноста против која се пишуваат скрипти, бидејќи прикажаните имиња се повторуваат и можат да се менуваат. Apple-овиот scutil прирачник го документира режимот на мрежно поврзување, додека инсталираната --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 барање, хардверски токен или Keychain за најава. LaunchAgent може да стартува услуга откако корисникот ќе се најави и Keychain ќе се отклучи; LaunchDaemon обично не може да ги достигне тие делови од корисничката сесија. Ако организација ја управува услугата, нејзините правила за животен циклус победуваат над секоја локална скрипта.
Запрете ја услугата и проверете дали останала запрена
Запрете со истиот селектор што го користевте за стартување, потоа прочитајте ја состојбата повторно наместо да претпоставите дека тунелот исчезнал:
scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"
Запирање што се враќа на Disconnected сепак остава една работа за проверка: дали профилот е поставен за поврзување по барање, што може да го врати без вашата скрипта. Ако друг клиент има рути на истиот Mac, тие рути можат да го преживеат родното запирање. Проверете ја рутата повторно пред да заклучите дека машината е надвор од VPN.
За обвивка што ја извршувате рачно, држете го редоследот фиксен: листа, состојба, стартување, проверка, тест на рута, запирање, потврда. Не го анализирајте пријателското име од слободен излез кога идентификаторот е достапен и не третирајте го излезот од командата за стартување како подготвеност. Менаџерот за врски ја известува состојбата; вашиот доказ е состојбата плус рута што покажува на тунелот.