Spuštění uložené Mac VPN z terminálu pomocí scutil --nc
Pomocí scutil --nc spouštějte, kontrolujte a zastavujte uloženou službu macOS VPN, držte přihlašovací údaje mimo argv a dokažte, že provoz skutečně jde tunelem.
V Nastavení systému máte uloženou službu VPN a chcete, aby ji terminál spustil. Na macOS je podporovanou cestou scutil --nc, ale jen pro služby, které vlastní správce síťových připojení přímo v systému. Panel nabídek není API: klienti třetích stran mívají vlastní automatizaci a profil nasazený službou správy může místní spuštění odmítnout. Toto je kontrolní seznam, který dodržuji: najděte přesnou službu, přečtěte její stav, spusťte ji, počkejte na změnu stavu a poté dokažte, že provoz skutečně jde tunelem. Zastavte se u prvního kroku, který nesedí, protože každý další příkaz předpokládá, že předchozí uspěl.
Najděte službu, než se ji pokusíte spustit
Začněte inventářem, ne názvem profilu, který si pamatujete:
scutil --nc help
scutil --nc list
Každý řádek spojuje stav s identifikátorem služby, typem a zobrazovaným názvem. Identifikátor je hodnota, proti které se skriptuje, protože zobrazované názvy se opakují a lze je upravit. Apple manuál scutil dokumentuje režim síťového připojení, zatímco nainstalovaný --nc help je autoritativní seznam podpříkazů na daném Macu; nepředpokládejte, že přepínač ze starší příručky ve vaší verzi macOS stále existuje.
Prázdný seznam je výsledek, ne chyba. Služba vytvořená klientským softwarem dodavatele nebo profilem správy může být aktivní, přitom zde neviditelná, nebo viditelná s typem, který nativní správce neumí řídit. V takovém případě použijte nástroj dodavatele nebo dokumentaci profilu. Vytvářet paralelní nativní profil jen proto, abyste měli co spouštět, je špatný obchod.
Přečtěte aktuální stav a potvrďte selektor
Před spuštěním se zeptejte na stav služby, abyste věděli, co má úspěšné spuštění změnit:
scutil --nc status "Office VPN"
Pokud dvě služby sdílejí zobrazovaný název, je název nejednoznačný. Předejte místo toho identifikátor; příkaz přijímá obojí, ale jen identifikátor zaručeně vybere jednu službu. Ověřte, že slovo stavu je takové, jaké znáte — obvykle Connected, Disconnected, Connecting nebo Disconnecting — než ho začnete parsovat ve skriptu. Zkontrolujte také, zda je profil spravovaný, protože uzamčená konfigurace může příkaz přijmout a přesto ho ignorovat nebo se zeptat na potvrzení.
Toto volání stavu je levné, takže ho v automatizaci používejte jako pojistku: spouštějte jen když je stav Disconnected a nepovažujte Connecting za selhání. Pokud je služba už Connected, spuštění přeskočte, místo abyste přerušili funkční tunel.
Spusťte připojení a počkejte, až se stav ustálí
Požadavek na spuštění je asynchronní. Příkaz se vrátí, když je požadavek přijat, ne když dokončí ověřování nebo se nainstalují trasy. Spusťte ho, poté sledujte stav s omezeným čekáním a skončete, pokud služba spadne zpět 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, který se nikdy nevyřeší, obvykle ukazuje na přihlašovací údaje, MFA nebo server, ne na scutil. Příkaz nemůže zajistit interaktivní přihlášení, takže profil, který očekává token nebo hardwarový klíč, zůstane v Connecting a nakonec se vrátí zpět. Přečtěte slovo stavu, než přidáte opakování; smyčka proti výzvě k ověření nemůže uspět.
Nepovažujte návratový kód shellu za připravenost. Užitečným signálem je řetězec stavu, následovaný důkazem, že tunel nese provoz. Příkaz spuštění, který se tiše vrátí, vás může nechat s připojením, které se nikdy neověří.
Dokažte, že tunel nese provoz, ne jen že hlásí Connected
Connected popisuje připojení, ne rozhodnutí o směrování. Nativní služby PPP a IKEv2 vytvářejí rozhraní ppp nebo utun a instalují trasy, zatímco rozdělený tunel záměrně nechává výchozí trasu být. Prohlédněte rozhraní a obě rodiny adres:
ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns
Najděte rozhraní, které služba vytvořila, místo hádání čísla, a poté se směrovací tabulky zeptejte, které rozhraní používá konkrétní cíl: route -n get 10.0.0.10, s dosazením interního hostitele. Pokud hlásí fyzické rozhraní, tunel je zapnutý, ale nenese tento tok. Zkontrolujte trasy rozděleného tunelu, pořadí resolverů a jakékoli místní pravidlo firewallu, které povoluje rozhraní tunelu, ale ne proces.
Překlad názvů je obvyklý falešný negativ. Interní názvy se mohou překládat přes špatný resolver, zatímco tunel je zcela zdravý, což vypadá jako závada VPN a není. scutil --dns ukazuje pořadí, které macOS použije; po změně resolveru vyprázdněte mezipaměť pomocí dscacheutil -flushcache a sudo killall -HUP mDNSResponder.
Držte přihlašovací údaje a oprávnění mimo příkazový řádek
Nikdy nedávejte heslo, předem sdílený klíč ani token do argumentů. Argumenty jsou viditelné v seznamech procesů a končí v historii shellu a zkopírovaný přepis podpory je může vyzradit. Vlastní správa přihlašovacích údajů profilu — ať už položka Keychain, systémová výzva nebo tok ověřování klienta — je místem pro tajemství.
Spuštění příkazu s sudo neudělá z interaktivního přihlášení bezobslužné. Mění efektivního uživatele, ne dostupnost výzvy GUI, hardwarového tokenu nebo přihlašovacího Keychain. LaunchAgent může spustit službu poté, co se uživatel přihlásí a Keychain je odemčen; LaunchDaemon obvykle nedosáhne na tyto části uživatelské relace. Pokud službu spravuje organizace, její pravidla životního cyklu vyhrávají nad každým místním skriptem.
Zastavte službu a ověřte, že zůstala zastavená
Zastavte stejným selektorem, kterým jste ji spustili, a poté stav znovu přečtěte, místo abyste předpokládali, že tunel zmizel:
scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"
Zastavení, které se vrátí na Disconnected, přesto nechává jednu věc ke kontrole: zda je profil nastaven na připojení na vyžádání, což ho může vrátit bez vašeho skriptu. Pokud vlastní trasy na stejném Macu jiný klient, tyto trasy mohou nativní zastavení přežít. Před závěrem, že stroj je mimo VPN, znovu zkontrolujte trasu.
U obalu, který spouštíte ručně, držte pořadí pevné: seznam, stav, spuštění, sledování, test trasy, zastavení, ověření. Neparsujte přátelský název z volného výstupu, když je identifikátor k dispozici, a nepovažujte návrat příkazu spuštění za připravenost. Správce připojení hlásí stav; vaším důkazem je stav plus trasa, která ukazuje na tunel.