Wie kann ich OpenVPN als root im Hintergrund in einem Skript ausführen?

22

Ich möchte ein Skript schreiben, das openvpnzuerst 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 bgSchritte in dieser Datei zu emulieren ?

Ich habe versucht, ein &an den openvpnBefehl anzuhängen und nohupdavor zu platzieren. Beides funktioniert nicht.

Null
quelle
Diese Art von Frage wurde mehrmals gestellt. Wenn Sie Hilfe benötigen, müssen Sie Ihr Skript wirklich veröffentlichen.
Panther
Verwenden Sie sudo -b, um den folgenden Befehl im Hintergrund auszuführen
Nick Sillito
1
Es scheint mir, dass dies wirklich kein Duplikat dieser Frage ist , in der es kaum darum geht , Hintergrundprogramme als Root auszuführen und überhaupt nicht darum , wie man OpenVPN ordnungsgemäß dämonisiert.
Eliah Kagan
Dann sollten wir den Titel noch einmal ändern, um darauf hinzuweisen, dass ich versucht habe, ein Hintergrundprogramm als root auszuführen.
null
@null Ich habe den Titel wie gewünscht überarbeitet. OpenVPN wird häufig als root ausgeführt, und in Situationen, in denen dies nicht der --daemonFall 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!
Eliah Kagan

Antworten:

35

TL; DR: Verwenden sudo -boder besser .openvpn [...] --daemon

Da Sie openvpnein 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:

Ich habe versucht, ein & an den Befehl cpenvpn anzuhängen und nohop davor zu platzieren. Beides geht nicht.

Ihr Befehl lautet:

sudo openvpn ~/my_connection.ovpn

Unter sudo‚s Standardkonfiguration, wenn Sie nicht vor kurzem Ihr Passwort für eingegeben haben sudoim 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 sudoeinen neuen Zeitstempel haben.

Sie können sicherstellen, dass sudobei der Ausführung Ihres Befehls ein aktueller Zeitstempel angezeigt wird, indem Sie zunächst Folgendes ausführen:

sudo -v

Danach können Sie Folgendes ausführen:

sudo openvpn ~/my_connection.ovpn &

In der Regel ist es jedoch besser, &(und nohup) ganz zu vermeiden, wenn Sie einen Befehl im Hintergrund mit ausführen möchten sudo. 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 sudoselbst im Vordergrund ausführen , aber das -bFlag übergeben, sodass sudoder Befehl im Hintergrund ausgeführt wird.

sudo -b openvpn ~/my_connection.ovpn

Dies ist normalerweise eine bessere Methode, insbesondere wenn Sie den Befehl in ein Skript einfügen. Mit erhalten sudo -bSie keine Auftragssteuerung , aber in einem Shell-Skript ist die Auftragssteuerung standardmäßig deaktiviert und Sie sollten sie normalerweise nicht verwenden .

Wie man sudoerklärt:

     -b, --background
                 Run the given command in the background.  Note that it is not
                 possible to use shell job control to manipulate background
                 processes started by sudo.  Most interactive commands will
                 fail to work properly in background mode.

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 openvpnsolltest du es wahrscheinlich einfach mit laufen lassen --daemon.

openvpnwird automatisch im Hintergrund ausgeführt, wenn Sie die --daemonOption verwenden:

sudo openvpn ~/my_connection.ovpn --daemon

Übergeben Sie --daemonnach Ihrem .opvnDateinamen und nicht vorher. Das folgende Argument wird --daemon, falls vorhanden, als der Name interpretiert, den der daemonisierte openvpnProzess verwenden soll. (Haben nicht auch append &.)

Ob dies angemessen ist oder nicht, hängt davon ab, ob nach openvpnder 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 wenn openvpnkonnte 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--daemonopenvpn--daemon

Um zu entscheiden, ob Sie diese Option verwenden (und wie Sie sie verwenden möchten), empfehle ich Ihnen, die openvpnHandbuchseite zu lesen , insbesondere im Abschnitt über --daemon. Es enthält viele nützliche Informationen, und ich zitiere hier nur den ersten Absatz:

       --daemon [progname]
              Become  a  daemon  after  all   initialization   functions   are
              completed.   This option will cause all message and error output
              to be sent to  the  syslog  file  (such  as  /var/log/messages),
              except  for  the  output of scripts and ifconfig commands, which
              will go to /dev/null unless otherwise  redirected.   The  syslog
              redirection  occurs  immediately  at  the point that --daemon is
              parsed on the command line even though the  daemonization  point
              occurs  later.   If one of the --log options is present, it will
              supercede syslog redirection.

              The optional progname parameter [...]

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 sudoBefehle aus dem Skript entfernen . Wenn das Skript als root ausgeführt wird, ist dies nicht erforderlich sudo. (Obwohl der Root-Benutzer standardmäßig jeden Befehl ausführen kann, wie jeder Benutzer, der sich selbst mit einschließt, sudound dazu kein Kennwort benötigt. Wenn Sie also Instanzen von sudoim Skript belassen, funktioniert es wahrscheinlich immer noch.)

Wenn Sie Instanzen von sudoim 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 von nohup(die Sie bereits kennen). Zu diesem Zweck sollten Sie jedoch nach wie vor die Verwendung openvpnder --daemonOption in Betracht ziehen .

Eliah Kagan
quelle
Eine unglaublich umfassende und nachdenkliche Antwort. Gut gemacht.
Wideman
2

TL; DR Führen Sie es im Daemon-Modus aus:openvpn --config Windscribe-Japan.ovpn --daemon

Das Übergeben des Konfigurationsdateinamens (.ovpn) an den openvpnBefehl funktioniert nur, wenn keine anderen Optionen angegeben sind. Wenn ich die --daemonOption 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 --configOption angegeben werden. Zum Beispiel openvpn --config Windscribe.ovpn --daemon. Dann schließe das Syslog mit an tail -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.

RajaRaviVarma
quelle
0

Sie können einfach kopieren

CONF-Datei in / etc / openvpn /

Bitten Sie dann 'service openvpn @ confName start', die Dämonisierung und das Sudo für Sie zu erledigen.

Siehe /unix//a/366680/198666

user18099
quelle