El script termina con cero, el túnel aparece y la siguiente ejecución se rechaza antes de que llegue a pedir una contraseña. O el mismo comando funciona en un terminal y falla desde una tarea programada con un error «evento no encontrado» que no nombra nada útil. Ambas cosas son la conversación de entrada estándar del cliente AnyConnect yendo mal, no una falla de red. Trate el inicio de sesión como una pregunta y respuesta escrita y los fallos se vuelven predecibles y pequeños.

Por qué el mismo comando falla dentro de un script

El cliente lee sus respuestas de la entrada estándar, una línea por aviso, en el orden en que las pide la puerta de enlace. Cualquier cosa que cambie el número de avisos, como un nuevo cartel, un selector de grupo o un desafío de segundo factor, desplaza cada respuesta posterior una línea. Entonces el cliente lee un nombre de usuario donde esperaba una contraseña e informa de un fallo que no señala a ninguno de los dos.

Una contraseña que contiene un signo de exclamación añade un segundo fallo más silencioso. Entre comillas dobles el intérprete la expande mucho antes de que el cliente vea nada.

Ponga la carga entre comillas simples y el carácter viaja intacto. Esa es toda la corrección, y explica toda una clase de informes en los que la misma credencial funciona al escribirse y falla al guardarse. Compruebe qué hizo el intérprete antes de comprobar la puerta de enlace: imprima la carga mediante un envoltorio que muestre los bytes exactos y cuente las líneas. La mayoría de estas investigaciones terminan justo ahí.

Escriba las respuestas en el orden en que el cliente las pide

Ejecute el cliente de forma interactiva una vez y anote cada aviso en orden. Un selector de grupo solo aparece cuando la puerta de enlace publica varios perfiles, y un aviso de cartel solo aparece cuando hay uno configurado. El archivo de respuestas debe coincidir con la puerta de enlace a la que realmente apunta, no con la de la documentación.

Después construya el archivo con esa secuencia exacta, una respuesta por línea. El índice de grupo es el número que el cliente lista, no la posición de un perfil en un documento. Acepte el cartel solo si su puerta de enlace envía uno, y añada una línea por cada pregunta extra que se sepa que hace esa puerta de enlace. Inicie el cliente con el indicador no interactivo para que consuma el archivo en lugar de esperar un terminal.

connect vpn.lab.example
0
username
password
y
exit
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt

La misma secuencia puede llegar por una tubería cuando prefiere no tener un archivo en el disco. Las reglas de entrecomillado siguen decidiendo si sobrevive.

Mantenga la credencial fuera de la lista de procesos

Un argumento en la línea de comandos es legible por cualquier usuario local durante toda la vida del proceso, así que la contraseña pertenece a un archivo o una tubería y nunca a la lista de argumentos. Haga que ese archivo solo sea legible por la cuenta que ejecuta el script, y bórrelo cuando la tarea termine. En macOS el binario suele estar en la misma ruta que en Linux, pero confirme la ubicación instalada en lugar de suponerla. Un envoltorio que prueba ambas rutas es más corto que el informe del incidente.

printf 'username\npassword\ny\n' | /opt/cisco/anyconnect/bin/vpn -s connect vpn.lab.example

Tampoco deje que el script reintente para siempre. Un cartel cambiado o una contraseña que caducó durante la noche convierten un archivo de respuestas fijo en un bucle de reintentos, y ese bucle es lo que bloquea la cuenta.

Falle una vez, imprima el propio texto de error del cliente y salga. Una tarea programada necesita la misma revisión de identidad y disponibilidad de credenciales que cualquier otra tarea sin supervisión, porque una credencial que caduca en silencio es indistinguible de una caída a las tres de la madrugada.

Confirme la sesión antes de confiar en el código de salida

Un estado conectado demuestra que el túnel existe y nada más. Pruebe un recurso que deba ser alcanzable a través de él antes de que el script empiece trabajo real, y trate un fallo allí como una avería distinta de un inicio de sesión fallido. De lo contrario reintentará una conexión perfectamente buena que simplemente no puede llegar a su destino.

Pida al cliente su estado antes y después de la desconexión, porque una sesión obsoleta puede rechazar la siguiente conexión mientras su script informa de éxito.

/opt/cisco/anyconnect/bin/vpn state
/opt/cisco/anyconnect/bin/vpn disconnect

Registre la salida de estado junto al código de salida, ya que un código solo no puede separar un inicio de sesión rechazado de una sesión que nunca se cerró. Cuando la puerta de enlace exige un segundo factor o una aprobación interactiva, deje de programar ese paso y use el mecanismo que admite el cliente. Un archivo de respuestas fijo es una comodidad para una credencial que usted controla, no una forma de saltarse un paso de autenticación que no controla. Mantenga el alcance así de estrecho y esto sigue siendo un script corto.

Cuándo un archivo de respuestas fijo es la herramienta equivocada

Un segundo factor o un aviso de aprobación anulan por completo el patrón, y eso es una frontera de diseño, no un rompecabezas de programación. Use el mecanismo que el cliente admita para ese paso en lugar de adivinar la respuesta de antemano. Un archivo fijo solo funciona para credenciales que se mantienen iguales entre ejecuciones.

Dos estilos de credencial más antiguos también se confunden con AnyConnect. Un perfil vpnc habla un protocolo distinto y quiere el nombre del grupo como identificador IPSec, luego un secreto de grupo compartido y luego los datos de su propia cuenta.

Como los protocolos difieren, vpnc no puede llegar a una puerta de enlace que solo publica perfiles AnyConnect, y la alternativa abierta habitual para ese servicio es openconnect con su protocolo anyconnect seleccionado. Un archivo pcf pertenece al cliente Cisco heredado y, aunque su host, nombre de grupo y contraseña de grupo se pueden volver a introducir en un cliente que aún habla Cisco IPsec, el archivo no se traslada entre clientes. Un puerto inusual o un modo de tunelización no estándar suele perderse en ese traslado. Decida qué protocolo ofrece la puerta de enlace antes de elegir una herramienta.

Artículos relacionados