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 exposesWhat to scriptWhat still bites
OS-native connection entryrasdial, scutil --nc, nmcliTunnel is up before DNS and routes settle
Vendor CLI reading stdinCLI wrapped by the scheduler, secret from the credential storePrompt text changes between releases
GUI onlyPinned version plus a state assertionLocale 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 Office

Estas 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.com

O 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.

Artigos relacionados