Automatiza el inicio de sesión de VPN cuando el cliente no tiene API ni CLI
Elige la ruta del script según lo que exponga el cliente: un perfil propiedad del sistema operativo, una CLI del fabricante que lea un secreto por stdin, o la automatización de GUI como último recurso.
Tres preguntas lo deciden, y solo tres. ¿Crea el cliente una entrada de conexión en el sistema operativo que sobrevive a un reinicio? ¿Incluye una línea de comandos que pueda tomar un secreto de algo distinto de su lista de argumentos? ¿Su requisito de identidad obliga a una persona a responder un aviso del navegador? Respóndelas en ese orden y la elección deja de ser cuestión de gusto, porque un trabajo programado solo puede ser tan sin interfaz como permita la más débil de las tres respuestas.
Empareja el cliente con las tres capas programables
Un perfil nativo del sistema operativo, una CLI del fabricante, un cliente solo con GUI y un cliente con SSO del navegador necesitan cuatro enfoques distintos. Los dos primeros sobreviven a reinicios sin supervisión, y los reinicios sin supervisión son todo el objetivo. Los otros dos necesitan una decisión de diseño antes que un 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 |
Ruta uno: el sistema operativo ya es dueño del perfil
Es la ruta más barata y la que más gente pasa por alto. En Windows, rasdial "Office" conecta y rasdial "Office" /disconnect lo cierra; rasphone -d "Office" conduce la misma entrada por la interfaz de marcación. macOS lista los servicios guardados con scutil --nc list e inicia uno con scutil --nc start. Linux entrega el trabajo a NetworkManager.
rasdial "Office" user *
scutil --nc start "Office"
nmcli connection up id Office
nmcli -t -f GENERAL.STATE connection show OfficeEstas interfaces solo conocen perfiles propiedad del sistema operativo, así que no pueden conducir un cliente de terceros arbitrario. Cuando falta el perfil, créalo una vez y deja que el script lo compruebe en lugar de recrearlo en cada ejecución. Haz el script idempotente: lee el estado actual, conecta solo cuando esté desconectado y luego prueba el nombre privado que el trabajo necesita de verdad.
Ruta dos: el fabricante incluye una línea de comandos
Algunos clientes exponen suficiente línea de comandos para poder envolverlos: Cisco AnyConnect tuvo durante años un ayudante solo de conexión, y OpenConnect habla los protocolos AnyConnect, GlobalProtect y Pulse desde un solo binario. El requisito que importa no es la lista de indicadores sino de dónde sale el secreto, porque una contraseña en la lista de argumentos puede leerla cualquiera que pueda listar procesos.
printf '%s\n' "$VPN_PASS" | openconnect --protocol=anyconnect \
--user "$VPN_USER" --passwd-on-stdin vpn.example.comFortiClient y algunas compilaciones de GlobalProtect no tienen ninguna CLI soportada, y un cliente comunitario o un sustituto licenciado por el fabricante es una decisión de compra, no una solución. En CI, concede a la cuenta de servicio derechos sobre ese binario exacto y no sobre un shell, para que un argumento inyectado no pueda convertirse en una orden de root.
Ruta tres: automatización de GUI, y por qué va al final
Cuando el cliente oficial no tiene interfaz, los scripts pulsan botones mediante mensajes de ventana o SendKeys. Eso es frágil frente a la versión y el idioma, puede dejar una sesión a medio conectar y falla en silencio cuando aparece un diálogo en el idioma equivocado. Si tomas esta ruta, fija la versión del cliente, verifica después el estado de conexión resultante y mantén un plan manual documentado junto al script.
La misma precaución se aplica a desconectar un cliente a la fuerza matando su proceso. El túnel puede sobrevivir al proceso, o un supervisor puede reiniciarlo, así que matar y reiniciar tampoco es un restablecimiento fiable.
Qué se rompe después de que el túnel está levantado
Una marcación correcta demuestra autenticación y nada más. Prueba el recurso para el que existe el trabajo, con su propio protocolo y un tiempo de espera corto, y nombra la etapa en el mensaje de fallo. Los perfiles, certificados y credenciales guardadas visibles en tu escritorio pueden ser invisibles para la sesión del servicio, así que ejecuta el trabajo una vez con la cuenta propia del planificador antes de confiar en él.
Limita los reintentos. Un bucle que repite una credencial rechazada bloquea cuentas, y un aviso de MFA no lo puede responder un trabajo sin interfaz sin un diseño de alta; los reintentos con script contra un flujo SSO del navegador solo queman intentos. Prefiere una carga de VPN entregada por MDM o un perfil de configuración para una flota, donde la plataforma es dueña del ciclo de vida de las credenciales, y reserva los scripts para los clientes que no se pueden gestionar así.
Registra el código de salida y el primer recurso que falla, no el hecho de que el script se ejecutara. Esa sola línea es la que convierte una alerta del planificador en un diagnóstico de cinco minutos.