Spustenie uloženého Mac VPN z terminálu pomocou scutil --nc
Pomocou scutil --nc spúšťajte, kontrolujte a zastavujte uloženú službu macOS VPN, držte prihlasovacie údaje mimo argv a dokážte, že prevádzka skutočne ide tunelom.
V Nastaveniach systému máte uloženú službu VPN a chcete, aby ju terminál spustil. V macOS je podporovanou cestou scutil --nc, ale len pre služby, ktoré vlastní správca sieťových pripojení priamo v systéme. Panel ponuky nie je API: klienti tretích strán majú zvyčajne vlastnú automatizáciu a profil nasadený službou správy môže lokálne spustenie odmietnuť. Toto je kontrolný zoznam, ktorý dodržiavam: nájdite presnú službu, prečítajte jej stav, spustite ju, počkajte na zmenu stavu a potom dokážte, že prevádzka skutočne ide tunelom. Zastavte sa pri prvom kroku, ktorý nesedí, pretože každý ďalší príkaz predpokladá, že predchádzajúci uspel.
Nájdite službu skôr, než sa ju pokúsite spustiť
Začnite inventárom, nie názvom profilu, ktorý si pamätáte:
scutil --nc help
scutil --nc list
Každý riadok spája stav s identifikátorom služby, typom a zobrazovaným názvom. Identifikátor je hodnota, proti ktorej sa skriptuje, pretože zobrazované názvy sa opakujú a dajú sa upraviť. Apple manuál scutil dokumentuje režim sieťového pripojenia, zatiaľ čo nainštalovaný --nc help je autoritatívny zoznam podpríkazov na danom Macu; nepredpokladajte, že prepínač zo staršej príručky vo vašej verzii macOS stále existuje.
Prázdny zoznam je výsledok, nie chyba. Služba vytvorená klientskym softvérom dodávateľa alebo profilom správy môže byť aktívna, pričom tu nie je viditeľná, alebo viditeľná s typom, ktorý natívny správca nevie riadiť. V takom prípade použite nástroj dodávateľa alebo dokumentáciu profilu. Vytvárať paralelný natívny profil len preto, aby ste mali čo spúšťať, je zlý obchod.
Prečítajte aktuálny stav a potvrďte selektor
Pred spustením sa opýtajte na stav služby, aby ste vedeli, čo má úspešné spustenie zmeniť:
scutil --nc status "Office VPN"
Ak dve služby zdieľajú zobrazovaný názov, názov je nejednoznačný. Odovzdajte namiesto toho identifikátor; príkaz prijíma oboje, ale len identifikátor zaručene vyberie jednu službu. Overte, že slovo stavu je také, aké poznáte — zvyčajne Connected, Disconnected, Connecting alebo Disconnecting — skôr, než ho začnete parsovať v skripte. Skontrolujte aj, či je profil spravovaný, pretože uzamknutá konfigurácia môže príkaz prijať a napriek tomu ho ignorovať alebo sa opýtať na potvrdenie.
Toto volanie stavu je lacné, preto ho v automatizácii používajte ako poistku: spúšťajte len keď je stav Disconnected a nepovažujte Connecting za zlyhanie. Ak je služba už Connected, spustenie preskočte, namiesto toho aby ste prerušili funkčný tunel.
Spustite pripojenie a počkajte, kým sa stav ustáli
Požiadavka na spustenie je asynchrónna. Príkaz sa vráti, keď je požiadavka prijatá, nie keď sa dokončí overovanie alebo sa nainštalujú trasy. Spustite ho, potom sledujte stav s obmedzeným čakaním a skončite, ak služba spadne späť na 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
Stav Connecting, ktorý sa nikdy nevyrieši, zvyčajne ukazuje na prihlasovacie údaje, MFA alebo server, nie na scutil. Príkaz nemôže zabezpečiť interaktívne prihlásenie, takže profil, ktorý očakáva token alebo hardvérový kľúč, zostane v Connecting a nakoniec sa vráti späť. Prečítajte slovo stavu skôr, než pridáte opakovania; slučka proti výzve na overenie nemôže uspieť.
Nepovažujte návratový kód shellu za pripravenosť. Užitočným signálom je reťazec stavu, nasledovaný dôkazom, že tunel nesie prevádzku. Príkaz spustenia, ktorý sa ticho vráti, vás môže nechať s pripojením, ktoré sa nikdy neoverí.
Dokážte, že tunel nesie prevádzku, nie len že hlási Connected
Connected opisuje pripojenie, nie rozhodnutie o smerovaní. Natívne služby PPP a IKEv2 vytvárajú rozhranie ppp alebo utun a inštalujú trasy, zatiaľ čo rozdelený tunel zámerne necháva predvolenú trasu nedotknutú. Preskúmajte rozhrania a obe rodiny adries:
ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns
Nájdite rozhranie, ktoré služba vytvorila, namiesto hádania čísla, a potom sa smerovacej tabuľky opýtajte, ktoré rozhranie používa konkrétny cieľ: route -n get 10.0.0.10, s dosadením interného hostiteľa. Ak hlási fyzické rozhranie, tunel je zapnutý, ale nenese tento tok. Skontrolujte trasy rozdeleného tunela, poradie resolverov a akékoľvek miestne pravidlo firewallu, ktoré povoľuje rozhranie tunela, ale nie proces.
Preklad názvov je obvyklý falošný negatív. Interné názvy sa môžu prekladať cez nesprávny resolver, kým je tunel úplne zdravý, čo vyzerá ako porucha VPN a nie je. scutil --dns ukazuje poradie, ktoré macOS použije; po zmene resolvera vyprázdnite medzipamäť pomocou dscacheutil -flushcache a sudo killall -HUP mDNSResponder.
Držte prihlasovacie údaje a oprávnenia mimo príkazového riadka
Nikdy nedávajte heslo, vopred zdieľaný kľúč ani token do argumentov. Argumenty sú viditeľné v zoznamoch procesov a končia v histórii shellu a skopírovaný prepis podpory ich môže prezradiť. Vlastná správa prihlasovacích údajov profilu — či už položka Keychain, systémová výzva alebo tok overovania klienta — je miestom pre tajomstvá.
Spustenie príkazu s sudo nerobí z interaktívneho prihlásenia bezobslužné. Mení efektívneho používateľa, nie dostupnosť výzvy GUI, hardvérového tokenu alebo prihlasovacej Keychain. LaunchAgent môže spustiť službu po tom, čo sa používateľ prihlási a Keychain sa odomkne; LaunchDaemon zvyčajne nedosiahne na tieto časti používateľskej relácie. Ak službu spravuje organizácia, jej pravidlá životného cyklu vyhrávajú nad každým miestnym skriptom.
Zastavte službu a overte, že zostala zastavená
Zastavte rovnakým selektorom, ktorým ste ju spustili, a potom stav znova prečítajte, namiesto toho aby ste predpokladali, že tunel zmizol:
scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"
Zastavenie, ktoré sa vráti na Disconnected, predsa necháva jednu vec na kontrolu: či je profil nastavený na pripojenie na požiadanie, čo ho môže vrátiť bez vášho skriptu. Ak má iný klient trasy na tom istom Macu, tie trasy môžu prežiť natívne zastavenie. Pred záverom, že stroj je mimo VPN, znova skontrolujte trasu.
Pri obale, ktorý spúšťate ručne, držte poradie pevné: zoznam, stav, spustenie, sledovanie, test trasy, zastavenie, overenie. Neparsujte priateľský názov z voľného výstupu, keď je identifikátor k dispozícii, a nepovažujte návrat príkazu spustenia za pripravenosť. Správca pripojení hlási stav; vaším dôkazom je stav plus trasa, ktorá ukazuje na tunel.