Crese que un here-document de catro liñas é un inicio de sesión non interactivo completo, e esa crenza aguanta xusto ata que a pasarela ofrece dous grupos, imprime un banner ou pide un token despois do contrasinal. Entón o mesmo script escribe o contrasinal nun menú que esperaba un número. O cliente de liña de ordes en Linux pódese automatizar, pero só se lle entrega o que de verdade espera e non o que o titorial supuxo.

O here-document fixo é un mito

O cliente Linux de Cisco instala un pequeno programa en /opt/cisco/anyconnect/bin/vpn, e Secure Client 5 aínda o inclúe. Co servizo vpnagentd en marcha, o flag -s le as respostas da entrada estándar na orde en que o cliente as pide. Esa orde non é fixa entre servidores.

Un menú de grupos engade unha liña. Un banner de inicio de sesión engade outra. Unha petición de token despois do contrasinal rompe por completo un script de catro liñas, porque a quinta liña nunca ía ser o token. O fallo é silencioso: o cliente recibe a cadea equivocada, o intento de conexión remata e o script non informa de nada útil.

Execute o cliente a man unha vez contra a mesma pasarela e versión, e anote os avisos na orde en que aparecen. Esa transcrición é a especificación que o seu script debe cumprir.

Que espera o cliente

No caso habitual dun só grupo, a secuencia é nome de usuario, contrasinal e ás veces unha confirmación de banner. A primeira liña dun here-document só se converte nun índice de menú cando o servidor presenta realmente un menú, e por iso o mesmo script funciona nun sitio e falla no seguinte.

/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF

Léao como catro respostas a catro preguntas posibles, non como un protocolo fixo. O cero é unha selección de menú, non un contrasinal, e o y final acepta un banner que moitas pasarelas nunca envían.

Use expect cando a orde non é previsible

Cando a orde dos avisos varía, deixe de contar liñas e espere o aviso. Un script expect lanza a orde connect, espera o aviso de nome de usuario, envía, espera o aviso de contrasinal, envía e despois espera o estado conectado. Cada espera ten o seu propio tempo de espera.

Trate un tempo de espera esgotado como un fallo e saia. Un script que segue enviando entrada tras un aviso inesperado escribirá alegremente o contrasinal nun shell, nun menú ou en calquera outra cousa que estea lendo. Así é como un script de inicio de sesión se converte nun incidente.

expect tamén lle dá unha transcrición que pode rexistrar co secreto eliminado, e vale máis que o código de saída cando unha pasarela cambia os seus avisos tras unha actualización.

O secreto ten que vivir nalgún sitio

Todas as versións deste problema comparten unha debilidade: o contrasinal debe existir nunha forma que o cliente poida ler. Pasalo como argumento expono na táboa de procesos. Envialo por unha tubaxe a miúdo déixao no historial do shell. Ambas as cousas son lexibles por outros usuarios locais nun host de salto compartido.

install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net

Un ficheiro con modo 600 propiedade da conta é o mínimo, e segue sendo un secreto en texto plano no disco. secret-tool lookup le do chaveiro de Linux, e en macOS a mesma tarefa fánaa security find-generic-password -w. Onde a organización admite autenticación por certificado ou SAML, prefíraa, porque un contrasinal gardado máis MFA segue sen poder completar un inicio de sesión sen unha persoa.

Confirme o túnel e despois asuma o peche

Non confíe na ausencia de texto de erro. Pregunte ao cliente polo seu estado e comprobe a interface por separado:

/opt/cisco/anyconnect/bin/vpn state
ip -brief address

O estado debería dicir Connected, e unha interface de túnel debería ter un enderezo. Logo solicite un recurso que o túnel deba acadar, porque un estado conectado sen ruta é un resultado real e fácil de pasar por alto.

Desconéctese con vpn disconnect, e deixe que o script que iniciou o túnel se encargue do peche. Un traballo fallido que deixa unha sesión aberta consome unha praza de licenza e parece un problema de autenticación para a seguinte persoa que o intente.

Orde de traballo: confirme vpnagentd, capture a orde real dos avisos, escolla here-document ou expect, manteña o secreto fóra de argv e do historial, verifique o estado e un recurso, e logo desconéctese no mesmo script.

Artigos relacionados