script bash openvpn, aguarde a saída, servidor ssh, finalize openvpn

script bash openvpn, aguarde a saída, servidor ssh, finalize openvpn

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.

  1. Como evitar o erro de sintaxe no script?

  2. Como estender o script para que ele feche automaticamente a conexão openvpn posteriormente?

  3. 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 bashshell, mas você o usa explicitamente shpara executá-lo. Num número crescente de plataformas, estes não são os mesmos.

Em vez de sh ssh-vpn.shvocê ter duas opções melhores

  1. 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
    
  2. 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_namecomando 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

  1. gere o script ssh-vpn.sh com o código acima (adicionei algumas printfinformaçõ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
    
  2. em casca

    # just once
    chmod a+rx ssh-vpn.sh
    
  3. executar comando no shell

    # thereafter
    ./ssh-vpn.sh
    

informação relacionada