script bash openvpn, esperar salida, servidor ssh, finalizar openvpn

script bash openvpn, esperar salida, servidor ssh, finalizar openvpn

Quiero usar un script bash para iniciar una conexión openvpn y una vez que haya establecido el túnel, iniciar una conexión de terminal SSH a un servidor y una vez que cierro la conexión SSH también cierro la conexión openvpn.

Para empezar, intenté implementar la solución propuesta enhttps://stackoverflow.com/questions/21001220/bash-sequence-wait-for-output-then-start-next-programcomo un script de shell

#!/bin/bash
exec 3< <(sudo openvpn --config  /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server

Ejecuto este script como sh ssh-vpn.sh en el caparazón de pescado.

Como script, esto me da un error de sintaxis line 2: syntax error near unexpected token '<'. fuera del script, no aparece este error.

Además, al no utilizar estos comandos como script, ocasionalmente parecía haber recibido mensajes de error porque el descriptor de archivo 3 ya existía.

  1. ¿Cómo evitar el error de sintaxis en el script?

  2. ¿Cómo extender el script para que luego cierre automáticamente la conexión openvpn?

  3. ¿Cómo garantizar que el descriptor del archivo se cierre al final del script?

Pido disculpas si esto es demasiado para una sola pregunta. Supongo que esta es una de mis primeras preguntas sobre secuencias de comandos en mucho tiempo y todavía tengo mucho que aprender aquí.

Respuesta1

El problema es que el código está escrito para el bashshell pero lo estás utilizando explícitamente shpara ejecutarlo. En un número cada vez mayor de plataformas esto no es lo mismo.

En lugar de sh ssh-vpn.shti tienes dos mejores opciones.

  1. Haga que el script sea ejecutable y deje que la #!línea defina el shell que se utilizará

    # just once
    chmod a+rx ssh-vpn.sh
    
    # thereafter
    ./ssh-vpn.sh
    
  2. Ejecute el script con el shell correcto

    bash ssh-vpn.sh
    

Respuesta2

Implementarhttps://unix.stackexchange.com/users/100397/roaimaLa respuesta y saber que solo tengo una única conexión openvpn abierta me permite reutilizar el pkill -9 -x $process_namecomando desde¿La mejor manera de eliminar procesos creados por un script bash?- y eso me lleva a este código

#!/bin/bash
exec 3< <(sudo openvpn --config  /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server
sudo pkill -9 -x openvpn 

Entonces, en suma

  1. genere el script ssh-vpn.sh con el código anterior (se agregó printfinformación sobre lo que está sucediendo)

    #!/bin/bash
    printf "Script to initialise openvpn connection to XYZ and open ssh channel into XYZ Server.\n"
    printf "Starting openvpn to YXZ...\n\n"
    exec 3< <(sudo openvpn --config  /etc/openvpn/server.ovpn)
    sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
    printf "VPN now initialised.\nstarting ssh connection to XYZ...\n"
    ssh server
    printf "\nKilling openvpn connection...\n"
    sudo pkill -9 -x openvpn 
    # end of script
    
  2. en concha

    # just once
    chmod a+rx ssh-vpn.sh
    
  3. ejecutar comando en shell

    # thereafter
    ./ssh-vpn.sh
    

información relacionada