Quero usar um script bash para iniciar uma conexão openvpn e, depois de estabelecer o túnel, iniciar uma conexão de terminal SSH com um servidor e, depois de fechar a conexão SSH, fechar também a conexão openvpn.
Para começar, tentei implementar a solução proposta emhttps://stackoverflow.com/questions/21001220/bash-sequence-wait-for-output-then-start-next-programcomo um script de shell
#!/bin/bash
exec 3< <(sudo openvpn --config /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server
Eu executo este script como sh ssh-vpn.sh no shell do peixe.
Como script, isso me dá um erro de sintaxe line 2: syntax error near unexpected token '<'
. fora do script, não recebo esse erro.
Além disso, não usando esses comandos como um script, ocasionalmente parecia ter recebido mensagens de erro porque o descritor de arquivo 3 já existia.
Como evitar o erro de sintaxe no script?
Como estender o script para que ele feche automaticamente a conexão openvpn posteriormente?
Como garantir que o descritor de arquivo seja fechado no final do script?
Peço desculpas se isso é demais para uma pergunta - acho que esta é uma das minhas primeiras perguntas sobre scripts em muito tempo e ainda tenho que aprender muito aqui.
Responder1
O problema é que o código é escrito para o bash
shell, mas você o usa explicitamente sh
para executá-lo. Num número crescente de plataformas, estes não são os mesmos.
Em vez de sh ssh-vpn.sh
você ter duas opções melhores
Torne o script executável e deixe a
#!
linha definir o shell a ser usado# just once chmod a+rx ssh-vpn.sh # thereafter ./ssh-vpn.sh
Execute o script com o shell correto
bash ssh-vpn.sh
Responder2
Implementandohttps://unix.stackexchange.com/users/100397/roaimaa resposta de e saber que só tenho uma única conexão openvpn aberta me permite reutilizar o pkill -9 -x $process_name
comando deMelhor maneira de eliminar processos criados pelo script bash?- e isso me leva a esse 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
Então, em suma
gere o script ssh-vpn.sh com o código acima (adicionei algumas
printf
informações sobre o que está acontecendo)#!/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
em casca
# just once chmod a+rx ssh-vpn.sh
executar comando no shell
# thereafter ./ssh-vpn.sh