Automatize o início de sessão VPN quando o cliente não tem API nem CLI
Escolha o caminho do script conforme o que o cliente expõe: um perfil detido pelo sistema operativo, uma CLI do fornecedor que lê um segredo do stdin, ou a automatização da GUI como último recurso.
Três perguntas decidem isto, e apenas três. O cliente cria uma entrada de ligação no sistema operativo que sobrevive a um reinício? Fornece uma linha de comandos capaz de obter um segredo de algo diferente da sua lista de argumentos? A sua exigência de identidade obriga uma pessoa a responder a um pedido do navegador? Responda por essa ordem e a escolha deixa de ser uma questão de gosto, porque um trabalho agendado só pode ser tão sem interface quanto o permitir a mais fraca das três respostas.
Faça corresponder o cliente às três camadas programáveis
Um perfil nativo do sistema operativo, uma CLI do fornecedor, um cliente só com GUI e um cliente com SSO do navegador exigem quatro abordagens diferentes. Os dois primeiros sobrevivem a reinícios sem supervisão, e os reinícios sem supervisão são todo o objetivo. Os outros dois exigem uma decisão de projeto antes de exigirem um script.
| What the client exposes | What to script | What still bites |
|---|---|---|
| OS-native connection entry | rasdial, scutil --nc, nmcli | Tunnel is up before DNS and routes settle |
| Vendor CLI reading stdin | CLI wrapped by the scheduler, secret from the credential store | Prompt text changes between releases |
| GUI only | Pinned version plus a state assertion | Locale and DPI break the click targets |
Caminho um: o sistema operativo já é dono do perfil
É o caminho mais barato e aquele que mais gente ignora. No Windows, rasdial "Office" liga e rasdial "Office" /disconnect encerra a ligação; rasphone -d "Office" conduz a mesma entrada através da interface de marcação. O macOS lista os serviços guardados com scutil --nc list e inicia um com scutil --nc start. O Linux entrega a tarefa ao NetworkManager.
rasdial "Office" user *
scutil --nc start "Office"
nmcli connection up id Office
nmcli -t -f GENERAL.STATE connection show OfficeEstas interfaces só conhecem perfis detidos pelo sistema operativo, por isso não conseguem conduzir um cliente de terceiros arbitrário. Quando o perfil falta, crie-o uma vez e deixe o script verificá-lo em vez de o recriar em cada execução. Torne o script idempotente: leia o estado atual, ligue apenas quando estiver desligado e depois teste o nome privado de que a tarefa realmente precisa.
Caminho dois: o fornecedor disponibiliza uma linha de comandos
Alguns clientes expõem linha de comandos suficiente para serem envolvidos: o Cisco AnyConnect teve durante anos um auxiliar apenas de ligação, e o OpenConnect fala os protocolos AnyConnect, GlobalProtect e Pulse a partir de um único binário. O requisito que conta não é a lista de opções mas de onde vem o segredo, porque uma palavra-passe na lista de argumentos pode ser lida por qualquer pessoa que consiga listar processos.
printf '%s\n' "$VPN_PASS" | openconnect --protocol=anyconnect \
--user "$VPN_USER" --passwd-on-stdin vpn.example.comO FortiClient e algumas compilações do GlobalProtect não têm qualquer CLI suportada, e um cliente da comunidade ou um substituto licenciado pelo fornecedor é uma decisão de compra, não um contorno. Em CI, conceda à conta de serviço direitos sobre esse binário exato e não sobre uma shell, para que um argumento injetado não possa tornar-se num comando de root.
Caminho três: automatização da GUI, e porque vem por último
Quando o cliente oficial não tem interface, os scripts clicam botões através de mensagens de janela ou SendKeys. Isso é frágil face à versão e ao idioma, pode deixar uma sessão meio ligada e falha em silêncio quando aparece uma caixa de diálogo no idioma errado. Se seguir esta via, fixe a versão do cliente, verifique depois o estado de ligação resultante e mantenha um plano manual documentado ao lado do script.
A mesma cautela aplica-se a desligar um cliente à força matando o seu processo. O túnel pode sobreviver ao processo, ou um supervisor pode reiniciá-lo, por isso matar-e-reiniciar também não é um reinício fiável.
O que se rompe depois de o túnel estar de pé
Uma marcação bem-sucedida prova a autenticação e nada mais. Teste o recurso para o qual a tarefa existe, com o seu próprio protocolo e um tempo limite curto, e nomeie a fase na mensagem de falha. Perfis, certificados e credenciais guardadas visíveis no seu ambiente de trabalho podem ser invisíveis para a sessão do serviço, por isso execute a tarefa uma vez com a conta do próprio agendador antes de confiar nela.
Limite as tentativas. Um ciclo que repete credenciais rejeitadas bloqueia contas, e um pedido MFA não pode ser respondido por uma tarefa sem interface sem um desenho de inscrição; as tentativas com script contra um fluxo SSO do navegador apenas queimam tentativas. Prefira uma carga VPN entregue por MDM ou um perfil de configuração para uma frota, onde a plataforma detém o ciclo de vida das credenciais, e reserve os scripts para os clientes que não podem ser geridos assim.
Registe o código de saída e o primeiro recurso que falha, não o facto de o script ter corrido. É essa única linha que transforma um alerta do agendador num diagnóstico de cinco minutos.