Iniciar uma VPN de Mac guardada a partir do terminal com scutil --nc
Use scutil --nc para iniciar, inspecionar e parar um serviço VPN macOS guardado, mantenha as credenciais fora de argv e prove que o tráfego usa realmente o túnel.
Tem um serviço VPN guardado em Definições do Sistema e quer que o terminal o inicie. No macOS, o caminho suportado é scutil --nc, mas apenas para serviços pertencentes ao próprio gestor de ligações de rede do sistema. A barra de menus não é a API: os clientes de terceiros costumam ter a sua própria automatização, e um perfil enviado por um serviço de gestão pode recusar um início local. Esta é a lista de verificação que sigo: encontre o serviço exato, leia o estado, inicie-o, espere que o estado mude e depois prove que o tráfego usa realmente o túnel. Pare no primeiro passo que não bate certo, porque cada comando seguinte assume que o anterior foi bem-sucedido.
Encontre o serviço antes de tentar iniciá-lo
Comece pelo inventário em vez do nome de perfil de que se lembra:
scutil --nc help
scutil --nc list
Cada linha associa um estado a um identificador de serviço, um tipo e um nome de apresentação. O identificador é o valor sobre o qual se escrevem scripts, porque os nomes de apresentação se repetem e podem ser editados. O manual scutil da Apple documenta o modo de ligação de rede, enquanto o --nc help instalado é a lista autoritativa de subcomandos nesse Mac; não assuma que uma opção de um guia antigo ainda existe na sua versão de macOS.
Uma lista vazia é um resultado, não um erro. Um serviço criado por um cliente de fornecedor ou por um perfil de gestão pode estar ativo enquanto é invisível aqui, ou visível com um tipo que o controlador nativo não consegue conduzir. Nesse caso, use a ferramenta do fornecedor ou a documentação do perfil. Criar um perfil nativo paralelo só para ter algo para iniciar é um mau negócio.
Leia o estado atual e confirme o seletor
Pergunte ao serviço pelo estado antes de o iniciar, para saber o que um início bem-sucedido deve mudar:
scutil --nc status "Office VPN"
Se dois serviços partilham um nome de apresentação, o nome é ambíguo. Passe o identificador em vez disso; o comando aceita qualquer um dos dois, mas só o identificador garante selecionar um único serviço. Verifique que a palavra de estado é uma que reconhece — normalmente Connected, Disconnected, Connecting ou Disconnecting — antes de a analisar num script. Verifique também se o perfil é gerido, porque uma configuração bloqueada pode aceitar o comando e mesmo assim ignorá-lo ou pedir confirmação.
Esta chamada de estado é barata, por isso use-a como guarda na automatização: inicie só quando o estado é Disconnected, e não trate Connecting como uma falha. Se o serviço já está Connected, salte o início em vez de interromper um túnel a funcionar.
Inicie a ligação e espere que o estado assente
O pedido de início é assíncrono. O comando regressa quando o pedido é aceite, não quando a autenticação termina ou as rotas são instaladas. Execute-o e depois inquiria o estado com uma espera limitada e saia se o serviço voltar a 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
Um estado Connecting que nunca se resolve normalmente aponta para credenciais, MFA ou o servidor, não para scutil. O comando não pode fornecer um início de sessão interativo, por isso um perfil que espera um token ou uma chave de hardware fica em Connecting e acaba por recuar. Leia a palavra de estado antes de acrescentar novas tentativas; um ciclo contra um pedido de autenticação não pode ter sucesso.
Não trate o estado de saída da shell como prontidão. O sinal útil é a cadeia de estado, seguida da prova de que o túnel transporta tráfego. Um comando de início que regressa em silêncio ainda pode deixá-lo com uma ligação que nunca se autentica.
Prove que o túnel transporta tráfego, não apenas que diz Connected
Connected descreve a ligação, não a decisão de encaminhamento. Os serviços nativos PPP e IKEv2 criam uma interface ppp ou utun e instalam rotas, enquanto um túnel dividido deixa deliberadamente a rota predefinida intacta. Inspecione as interfaces e ambas as famílias de endereços:
ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns
Encontre a interface que o serviço criou em vez de adivinhar um número, e depois pergunte à tabela de rotas que interface um destino concreto usa: route -n get 10.0.0.10, substituindo-o por um anfitrião interno. Se indicar a interface física, o túnel está ativo mas não transporta esse fluxo. Verifique as rotas do túnel dividido, a ordem dos resolutores e qualquer regra local de firewall que permita a interface do túnel mas não o processo.
A resolução de nomes é o falso negativo habitual. Os nomes internos podem ser resolvidos pelo resolutor errado enquanto o túnel está perfeitamente saudável, o que parece uma falha de VPN e não é. scutil --dns mostra a ordem que o macOS vai usar; após uma mudança de resolutor, limpe a cache com dscacheutil -flushcache e sudo killall -HUP mDNSResponder.
Mantenha as credenciais e os privilégios fora da linha de comandos
Nunca ponha uma palavra-passe, uma chave pré-partilhada ou um token nos argumentos. Os argumentos são visíveis nas listas de processos e ficam no histórico da shell, e uma transcrição de suporte copiada pode divulgá-los. A própria gestão de credenciais do perfil — quer seja um item do Keychain, um pedido do sistema ou o fluxo de autenticação do cliente — é o lugar para os segredos.
Executar o comando com sudo não torna um início de sessão interativo não supervisionado. Muda o utilizador efetivo, não a disponibilidade de um pedido GUI, de um token de hardware ou do Keychain de início de sessão. Um LaunchAgent pode iniciar um serviço depois de o utilizador iniciar sessão e o Keychain estar desbloqueado; um LaunchDaemon normalmente não alcança essas peças da sessão do utilizador. Se uma organização gere o serviço, as suas regras de ciclo de vida prevalecem sobre qualquer script local.
Pare o serviço e verifique que continuou parado
Pare com o mesmo seletor que usou para iniciar e depois volte a ler o estado em vez de assumir que o túnel desapareceu:
scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"
Uma paragem que regressa a Disconnected ainda deixa uma coisa a verificar: se o perfil está configurado para ligar a pedido, o que o pode trazer de volta sem o seu script. Se outro cliente possui rotas no mesmo Mac, essas rotas podem sobreviver a uma paragem nativa. Volte a verificar a rota antes de concluir que a máquina está fora da VPN.
Para um envoltório que executa à mão, mantenha a ordem fixa: lista, estado, início, inquérito, teste de rota, paragem, verificação. Não analise o nome amigável a partir de uma saída de formato livre quando o identificador está disponível, e não trate a saída do comando de início como prontidão. O gestor de ligações relata o estado; a sua prova é o estado mais uma rota que aponta para o túnel.