Bash-Skript OpenVPN, auf Ausgabe warten, SSH-Server, OpenVPN beenden

Bash-Skript OpenVPN, auf Ausgabe warten, SSH-Server, OpenVPN beenden

Ich möchte ein Bash-Skript verwenden, um eine OpenVPN-Verbindung zu starten. Sobald der Tunnel hergestellt ist, möchte ich eine SSH-Terminalverbindung zu einem Server starten und sobald ich die SSH-Verbindung schließe, auch die OpenVPN-Verbindung schließen.

Für den Anfang habe ich versucht, die Lösung umzusetzen, die unterhttps://stackoverflow.com/questions/21001220/bash-sequence-wait-for-output-then-start-next-programals Shell-Skript

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

Ich führe dieses Skript als sh ssh-vpn.sh in der Fish-Shell aus.

Als Skript erhalte ich dadurch einen Syntaxfehler line 2: syntax error near unexpected token '<'. Außerhalb des Skripts erhalte ich diesen Fehler nicht.

Wenn ich diesen Befehl nicht als Skript verwendete, erhielt ich gelegentlich anscheinend Fehlermeldungen, weil der Dateideskriptor 3 bereits vorhanden war.

  1. Wie vermeidet man den Syntaxfehler im Skript?

  2. Wie kann man das Skript erweitern, sodass es die OpenVPN-Verbindung anschließend automatisch schließt?

  3. Wie stellt man sicher, dass der Dateideskriptor am Ende des Skripts geschlossen wird?

Ich entschuldige mich, wenn das zu viel für eine Frage ist – ich schätze, das ist eine meiner ersten Skripting-Fragen seit langer Zeit und ich muss hier noch viel lernen.

Antwort1

Das Problem besteht darin, dass der Code für die Shell geschrieben ist, bashSie shihn aber explizit ausführen. Auf immer mehr Plattformen ist dies nicht dasselbe.

Stattdessen sh ssh-vpn.shhaben Sie zwei bessere Optionen

  1. Machen Sie das Skript ausführbar und lassen Sie die #!Zeile die zu verwendende Shell definieren

    # just once
    chmod a+rx ssh-vpn.sh
    
    # thereafter
    ./ssh-vpn.sh
    
  2. Führen Sie das Skript mit der richtigen Shell aus

    bash ssh-vpn.sh
    

Antwort2

Umsetzunghttps://unix.stackexchange.com/users/100397/roaima's Antwort und das Wissen, dass ich nur eine einzige OpenVPN-Verbindung offen habe, ermöglicht es mir, den pkill -9 -x $process_nameBefehl von wiederzuverwendenBeste Möglichkeit, durch Bash-Skripte erstellte Prozesse zu beenden?- und das bringt mich zu diesem Code

#!/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 

Zusammenfassend

  1. Generieren Sie das Skript ssh-vpn.sh mit dem obigen Code (fügen Sie einige printfInformationen darüber hinzu, was passiert)

    #!/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. in der Schale

    # just once
    chmod a+rx ssh-vpn.sh
    
  3. Befehl in der Shell ausführen

    # thereafter
    ./ssh-vpn.sh
    

verwandte Informationen