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.
¿Cómo evitar el error de sintaxis en el script?
¿Cómo extender el script para que luego cierre automáticamente la conexión openvpn?
¿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 bash
shell pero lo estás utilizando explícitamente sh
para ejecutarlo. En un número cada vez mayor de plataformas esto no es lo mismo.
En lugar de sh ssh-vpn.sh
ti tienes dos mejores opciones.
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
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_name
comando 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
genere el script ssh-vpn.sh con el código anterior (se agregó
printf
informació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
en concha
# just once chmod a+rx ssh-vpn.sh
ejecutar comando en shell
# thereafter ./ssh-vpn.sh