El cliente vpn que viene con Cisco AnyConnect se comporta como una conversación: imprime un aviso, espera una línea y luego imprime el siguiente. Si alimentas esa conversación desde un archivo o una tubería, el mismo binario se ejecuta sin supervisión. La técnica es una redirección más una lista ordenada de respuestas, y es la lista, no la redirección, la que decide si el script es fiable.

Dos cosas lo rompen en la práctica. El orden de los avisos cambia cuando la pasarela pide algo extra, y una contraseña almacenada convierte una errata en un bloqueo de cuenta. Trata la secuencia como datos versionados que puedes comparar tras cualquier cambio en la pasarela. Falla de forma ruidosa en lugar de reintentar, porque un bucle es exactamente la forma en que una contraseña mal escrita se convierte en una cuenta bloqueada.

Una secuencia, en el orden en que la pide el cliente

Ejecuta el cliente de forma interactiva una vez y anota cada aviso en el orden en que aparece. Esa transcripción se convierte en el archivo de respuestas. Cuando rediriges el archivo al binario, la primera línea tiene que ser el propio comando de conexión, y por eso la secuencia empieza con un nombre de host en lugar de un nombre de usuario.

connect vpn.example.com
0
<username>
<password>
y
exit

El 0 solo selecciona el primer perfil de conexión cuando la pasarela ofrece una lista; usa el índice que imprima tu pasarela. El y acepta un banner de inicio de sesión, así que borra esa línea si no hay banner e inserta una donde tu pasarela haga una pregunta adicional. El exit final es lo que permite al cliente terminar limpiamente cuando se ha consumido la última respuesta.

/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt

El modo no interactivo aquí no es opcional. Sin -s el cliente puede tomar el terminal e ignorar la entrada redirigida; con él, las respuestas se leen del flujo y el proceso vuelve. Donde el binario necesita privilegios elevados, envuelve la invocación en sudo -n para que el script falle de inmediato en lugar de bloquearse en una petición de contraseña.

Dónde se filtra el archivo de respuestas

Un archivo que contiene una contraseña es una credencial, así que dale los permisos de una: modo 600, propiedad de la cuenta que ejecuta el trabajo y nunca dentro de un directorio compartido o sincronizado. Créalo con el modo ya aplicado en lugar de corregirlo después, porque un archivo es brevemente legible por todos entre la escritura y el chmod.

install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config

La otra mitad es argv. Una contraseña pasada como argumento es visible para cualquier usuario local que liste procesos, y además acaba en el historial del shell. Léela de un descriptor de archivo o de una variable de entorno en su lugar, y entrecomilla la carga útil para que el shell no pueda expandir nada dentro.

printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
  | sudo -n /opt/cisco/anyconnect/bin/vpn -s

Vigila el entrecomillado. Dentro de comillas dobles, una contraseña que contenga ! puede ser expandida por un shell interactivo antes de que el cliente llegue a verla, y el fallo llega como un error genérico event-not-found que parece un problema de protocolo.

Demuestra el túnel y luego ciérralo

Un estado conectado solo demuestra que el cliente cree tener una sesión. Elige un host que solo responda desde dentro de la red corporativa y pruébalo una vez antes de hacer cualquier otra cosa. Un fallo ahí es un problema de enrutamiento o de política, y volver a ejecutar el inicio de sesión no lo cambiará.

/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect

Comprueba la salida de estado antes y después de la desconexión. Un cliente que se queda con una sesión obsoleta puede rechazar la siguiente conexión mientras el script sigue informando de éxito, y ese modo de fallo es invisible si solo miras los códigos de salida. Compara las dos lecturas en lugar de confiar en la segunda por sí sola. Los alias en un perfil de shell bastan para el uso diario, mientras que cualquier cosa programada merece la misma revisión de credenciales e identidad que cualquier otro trabajo sin supervisión.

Cuando una lista fija deja de ser segura

Un archivo de respuestas codifica el orden de avisos de hoy. Un banner cambiado, un cambio de contraseña forzado o un reto de segundo factor lo convierten en un bucle que puede bloquear la cuenta, y por eso el script debe salir ante la primera respuesta inesperada en lugar de reiniciarse.

Captura lo que imprimió el cliente, devuelve un estado distinto de cero y deja que quien llama decida. Donde la pasarela exige un segundo factor, la respuesta honesta es que un inicio de sesión sin supervisión no está disponible para ese perfil, no que la secuencia necesite una línea más.

La rotación pertenece a la misma revisión. Si la credencial se almacena, decide quién puede leerla, cuándo cambia y qué la elimina cuando se reconstruye el host. Un script que funciona durante un año porque nadie tocó la contraseña no es un diseño, sino un accidente que espera una política de rotación.

Perfiles que no son AnyConnect

Dos estilos de credenciales de Cisco más antiguos se confunden con este. Un perfil vpnc pide un IPSec ID, que en realidad es el nombre del grupo, luego un secreto de grupo, luego tus propias credenciales, y los tres vienen de quien administra la pasarela. El Cisco IPsec heredado es un protocolo distinto de AnyConnect, así que vpnc no puede llegar a un servicio solo de AnyConnect; openconnect --protocol=anyconnect es el cliente abierto para esa tarea.

Un archivo .pcf describe el perfil del cliente más antiguo. El host, el nombre del grupo y la contraseña de grupo que contiene se pueden volver a introducir a mano en un cliente que hable Cisco IPsec, aunque el archivo no es una importación universal y cualquier puerto o modo de tunelización no predeterminado suele desaparecer en el traslado.

Empieza por lo que la pasarela ofrece realmente y luego elige el cliente que habla ese protocolo. Copiar un perfil de otro sitio es como la gente acaba depurando credenciales que nunca fueron el problema.

Artículos relacionados