Ich möchte ein Skript schreiben, das openvpn
zuerst aufgerufen wird , gefolgt von ssh
. Bei der Eingabe des Befehls
sudo openvpn ~/my_connection.ovpn
In der Eingabeaufforderung erhalte ich die folgende Ausgabe:
...
Wed Jan 4 21:04:35 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Jan 4 21:04:35 2017 /sbin/ip link set dev tun0 up mtu 1500
Wed Jan 4 21:04:35 2017 /sbin/ip addr add dev tun0 local IP_FOO peer IP_FOO
Wed Jan 4 21:04:35 2017 Initialization Sequence Completed
Dieser Befehl blockiert und die Shell wird nicht freigegeben. Um danach eine SSH-Verbindung herzustellen, muss ich den OpenVPN-Prozess in den Hintergrund treten lassen, indem ich Ctrl+ Zgefolgt von a eingebe bg
.
Ich möchte jedoch den openvpn-Verbindungsschritt und das ssh automatisch aufrufen, indem ich nur meine bash-Datei aufrufe. Wie schaffe ich es, das Ctrl+ Zund die bg
Schritte in dieser Datei zu emulieren ?
Ich habe versucht, ein &
an den openvpn
Befehl anzuhängen und nohup
davor zu platzieren. Beides funktioniert nicht.
sudo -b
, um den folgenden Befehl im Hintergrund auszuführen--daemon
Fall ist, kann die Option weiterhin verwendet werden. Sie haben jedoch Recht, dass der Teil, in dem es als root ausgeführt wird, für diese Frage von zentraler Bedeutung ist und sich im Titel widerspiegeln sollte . Vielen Dank für den Hinweis!Antworten:
TL; DR: Verwenden
sudo -b
oder besser .openvpn [...] --daemon
Da Sie
openvpn
ein Programm ausführen (und insbesondere ein Programm als Root im Hintergrund ausführen möchten ), sind die am häufigsten angegebenen Informationen zum Ausführen von Befehlen im Hintergrund nicht für Ihre Situation relevant. Du sagtest:Ihr Befehl lautet:
Unter
sudo
‚s Standardkonfiguration, wenn Sie nicht vor kurzem Ihr Passwort für eingegeben habensudo
im gleichen Kontext (für interaktive Nutzung, in der Regel diese Mittel das gleiche Terminal) dann wird es nach Ihrem Passwort fragen. Wenn Sie den Befehl jedoch im Hintergrund ausführen, indem&
Sie ihn anhängen, wird Ihnen die Zeile nicht angezeigt und Sie haben nicht die Möglichkeit, sie einzugeben.[sudo] password for user:
In dieser Situation ist es daher sinnvoll, den Befehl auszuführen, das Kennwort einzugeben und es anschließend für die interaktive Verwendung in den Hintergrund zu senden .
Aber es ist nicht der einzige Weg und wie Sie sagen, werden Sie das nicht in einem Skript tun wollen .
Möglichkeit 1: Stellen Sie sicher, dass Sie
sudo
einen neuen Zeitstempel haben.Sie können sicherstellen, dass
sudo
bei der Ausführung Ihres Befehls ein aktueller Zeitstempel angezeigt wird, indem Sie zunächst Folgendes ausführen:Danach können Sie Folgendes ausführen:
In der Regel ist es jedoch besser,
&
(undnohup
) ganz zu vermeiden, wenn Sie einen Befehl im Hintergrund mit ausführen möchtensudo
. Dies gilt insbesondere für Skripte.Weg 2: Verwenden
sudo -b
. Im Allgemeinen ist dies normalerweise das, was Sie wollen.Stattdessen können Sie sich
sudo
selbst im Vordergrund ausführen , aber das-b
Flag übergeben, sodasssudo
der Befehl im Hintergrund ausgeführt wird.Dies ist normalerweise eine bessere Methode, insbesondere wenn Sie den Befehl in ein Skript einfügen. Mit erhalten
sudo -b
Sie keine Auftragssteuerung , aber in einem Shell-Skript ist die Auftragssteuerung standardmäßig deaktiviert und Sie sollten sie normalerweise nicht verwenden .Wie
man sudo
erklärt:Das funktioniert , weil nichts im Hintergrund ausgeführt wird, bis nach sudo hat Ihr Passwort empfangen (falls erforderlich) und festgestellt , dass Sie den Befehl auszuführen sind zulässig.
Weg 3: Aber dafür
openvpn
solltest du es wahrscheinlich einfach mit laufen lassen--daemon
.openvpn
wird automatisch im Hintergrund ausgeführt, wenn Sie die--daemon
Option verwenden:Übergeben Sie
--daemon
nach Ihrem.opvn
Dateinamen und nicht vorher. Das folgende Argument wird--daemon
, falls vorhanden, als der Name interpretiert, den der daemonisierteopenvpn
Prozess verwenden soll. (Haben nicht auch append&
.)Ob dies angemessen ist oder nicht, hängt davon ab, ob nach
openvpn
der Ausführung, jedoch vor der Dämonisierung, eine Interaktion stattfinden muss . Und das hängt zum Teil davon ab, was in eingerichtet ist~/my_connection.ovpn
. Aber wennopenvpn
konnte nicht sofort daemonize, dann alle anderen Möglichkeiten, diese sofort im Hintergrund laufen bricht auch .Daher ist in jeder Situation , wo Sie wissen , dass Sie starten im Hintergrund ausgeführt wird , und Sie wissen , dass Sie nicht wieder in den Vordergrund bringen wollen, sollten Sie in der Methode des Aufrufs mit der betrachten Option. Dies ist spezifisch für die meisten Programme, die keine Option unterstützen, obwohl viele Serverprogramme über eine solche Option verfügen. (Name und Syntax variieren jedoch.)
openvpn
--daemon
openvpn
--daemon
Um zu entscheiden, ob Sie diese Option verwenden (und wie Sie sie verwenden möchten), empfehle ich Ihnen, die
openvpn
Handbuchseite zu lesen , insbesondere im Abschnitt über--daemon
. Es enthält viele nützliche Informationen, und ich zitiere hier nur den ersten Absatz:Möglichkeit 4 : Manchmal ist es sinnvoll, das gesamte Skript als Root auszuführen.
Wenn Sie ein Skript haben, das mehrere Aktionen als root ausführt, hat es keine signifikante Aktivität, die vernünftigerweise nicht als root ausgeführt werden würde, und es ist nie sinnvoll, das Skript als Benutzer ohne root auszuführen Benutzer des Skripts sollten es wahrscheinlich nur als root ausführen.
In diesem Fall sollten Sie
sudo
Befehle aus dem Skript entfernen . Wenn das Skript als root ausgeführt wird, ist dies nicht erforderlichsudo
. (Obwohl der Root-Benutzer standardmäßig jeden Befehl ausführen kann, wie jeder Benutzer, der sich selbst mit einschließt,sudo
und dazu kein Kennwort benötigt. Wenn Sie also Instanzen vonsudo
im Skript belassen, funktioniert es wahrscheinlich immer noch.)Wenn Sie Instanzen von
sudo
im Skript haben, die tatsächlich zum Ausführen von Befehlen als ein anderer Benutzer als root (mit ) verwendet werden, sollten Sie diese Instanzen trotzdem beibehalten.-u user
Wenn das gesamte Skript als root ausgeführt wird, gelten die meisten typischen Methoden, um Befehle im Hintergrund auszuführen , einschließlich des Anhängens
&
und gegebenenfalls der Verwendung vonnohup
(die Sie bereits kennen). Zu diesem Zweck sollten Sie jedoch nach wie vor die Verwendungopenvpn
der--daemon
Option in Betracht ziehen .quelle
TL; DR Führen Sie es im Daemon-Modus aus:
openvpn --config Windscribe-Japan.ovpn --daemon
Das Übergeben des Konfigurationsdateinamens (.ovpn) an den
openvpn
Befehl funktioniert nur, wenn keine anderen Optionen angegeben sind. Wenn ich die--daemon
Option spezifiziere, versucht openvpn, den Dateinamen als Optionsparameter zu analysieren , und löst den Optionsfehler aus : Ich versuche, "Windscribe.ovpn" als --option-Parameter zu analysieren, sehe aber kein führendes '-' .Antworten:
Um dies zu vermeiden, muss der Dateiname mit der
--config
Option angegeben werden. Zum Beispielopenvpn --config Windscribe.ovpn --daemon
. Dann schließe das Syslog mit antail -f /var/log/syslog
, um es weiter zu untersuchen.Sie können auch vor und nach der Ausgabe dieses Befehls überprüfen
curl ifconfig.co
, ob eine VPN-Verbindung besteht.Hinweis: Dadurch wird der Dämon auch nach dem Abmelden von der SSH-Sitzung weiter ausgeführt.
quelle
Sie können einfach kopieren
Bitten Sie dann 'service openvpn @ confName start', die Dämonisierung und das Sudo für Sie zu erledigen.
Siehe /unix//a/366680/198666
quelle