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.
Wie vermeidet man den Syntaxfehler im Skript?
Wie kann man das Skript erweitern, sodass es die OpenVPN-Verbindung anschließend automatisch schließt?
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, bash
Sie sh
ihn aber explizit ausführen. Auf immer mehr Plattformen ist dies nicht dasselbe.
Stattdessen sh ssh-vpn.sh
haben Sie zwei bessere Optionen
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
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_name
Befehl 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
Generieren Sie das Skript ssh-vpn.sh mit dem obigen Code (fügen Sie einige
printf
Informationen 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
in der Schale
# just once chmod a+rx ssh-vpn.sh
Befehl in der Shell ausführen
# thereafter ./ssh-vpn.sh