automatizar el script de shell para iniciar sesión vpn pasando sudo -S

Tengo que volver a iniciar sesión en mi VPN cada vez que salgo de mi escritorio, y es tedioso. Estoy tratando de pasarle la información a la shell, pero no la consigo en el orden correcto. El orden es “intente establecer una conexión, ingrese sudo pw si es necesario, luego nombre de usuario, luego contraseña”. pexpect sería bueno, ya que puede saber si necesita su contraseña de sudo o no, pero no funciona:

 #!/usr/bin/env python # coding: utf-8 import os, sys, subprocess, time, re, pexpect from my_scripting_library import * child = pexpect.spawn('sudo openconnect vpn.com') # send sudo pw child.expect('.*') child.sendline(sudopw) # send sn child.expect('.*') child.sendline('cchilders') # send work pw child.expect('.*') child.sendline(vpnpw) time.sleep(150) 

Esto es lo que parece cuando realizo estos pasos manualmente:

 cchilders:~/scripts/work_scripts [master]$ sudo openconnect vpn.com [sudo] password for cchilders: POST https://vpn.com Attempting to connect to server 555.555.55.55:555 Please enter your username and password. Username: Password: 

Cuando trato de introducir mi contraseña de sudo por shell como lo he hecho antes, la VPN se agota y dice:

Negociación SSL con vpn.com

La verificación del certificado del servidor falló: el certificado no coincide con el nombre de host

yo suelo

 alias vpn='echo $MYPW | sudo -S openconnect vpn.com' 

¿Cómo puedo enviar mi contraseña de sudo , luego mi nombre de usuario, luego mi contraseña de VPN en una fila desde un script de shell / python? Gracias

Tanto openconnect como sudo pueden tomar la contraseña en una entrada estándar. Entonces, ¿cómo hacer ambas cosas? Crear un script:

 #!/bin/sh password=$(cat /my/very/secure/vpn/password.txt) echo "$password" | /usr/sbin/openconnect --user codyc4321 --passwd-on-stdin 

Ahora, llama al script con sudo :

 pw=$(cat /my/very/secure/sudo/password.txt) echo "$pw" | sudo -S vpn.sh 

No hace falta decir que las contraseñas almacenadas en archivos de texto son peligrosas y deben protegerse con la propiedad y los permisos adecuados. Eliminar el requisito de contraseña de sudo como se menciona en los comentarios mitigaría la mitad del riesgo, y la posibilidad de conectarse a la VPN con un certificado eliminaría el rest.

Edite para agregar que está haciendo pexpect mal uso de pexpect al decirle que espere .* Para todas las situaciones. ¿Cómo sabrá si el indicador es de sudo o openconnect ? Tengo cero experiencia con Python, pero he usado expect antes. Hay algunos buenos ejemplos de cómo funciona en Python.

Una última edición para mencionar que su error de certificado no tiene nada que ver con esto, y se está produciendo porque no tiene el certificado de su servidor VPN almacenado en sus certificados de confianza. Guarde el certificado del servidor en su disco local y haga referencia a él con el argumento openconnect para openconnect