it-swarm.com.de

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

Ich möchte ein Skript schreiben, das zuerst openvpn und dann ssh aufruft. 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 durch Eingabe in den Hintergrund treten lassen Ctrl+Z gefolgt von einem 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 zu emulieren? Ctrl+Z und bg Schritte in dieser Datei?

Ich habe versucht, einen & an den openvpn -Befehl anzuhängen und Nohup davor zu platzieren. Beides funktioniert nicht.

20
null

TL; DR:Verwenden Sie _Sudo -b_ oder besser _openvpn [...] --daemon_

Da Sie openvpn ausführen (und weniger spezifisch, weil Sie ein Programm als root ​​im Hintergrund ausführen möchten), sind die am häufigsten ausgegebenen Informationen zum Ausführen von Befehlen im Hintergrund für Sie nicht relevant Lage. 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
_

Wenn Sie in der Standardkonfiguration von Sudo Ihr Passwort für Sudo nicht kürzlich im selben Kontext eingegeben haben (für die interaktive Verwendung bedeutet dies normalerweise dasselbe Terminal), werden Sie nach Ihrem Passwort gefragt. Wenn Sie den Befehl jedoch im Hintergrund ausführen, indem Sie _&_ anhängen, wird Ihnen die Zeile _[Sudo] password for user:_ nicht angezeigt, und Sie haben nicht die Möglichkeit, sie einzugeben.

In dieser Situation ist es also sinnvoll, den Befehl auszuführen, das Kennwort einzugeben und es anschließend in den Hintergrund zu senden. für die interaktive Verwendung.

Aber es ist nicht der einzige Weg und wie Sie sagen, werden Sie das nicht wollen in einem Skript.

Way 1: Stellen Sie sicher, dass Sudo einen neuen Zeitstempel hat.

Sie können sicherstellen, dass Sudo einen aktuellen Zeitstempel hat, wenn er zum Ausführen Ihres Befehls verwendet wird, indem Sie zuerst 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) zu vermeiden, wenn Sie einen Befehl mit Sudo im Hintergrund ausführen möchten. Dies gilt insbesondere für Skripte.

Methode 2: Verwenden Sie _Sudo -b_. Im Allgemeinen ist dies normalerweise das, was Sie wollen.

Stattdessen können Sie Sudo selbst im Vordergrund ausführen, aber das Flag _-b_ übergeben, damit Sudo den Befehl im Hintergrund ausführt.

_Sudo -b openvpn ~/my_connection.ovpn
_

Dies ist normalerweise eine bessere Methode, insbesondere wenn Sie den Befehl in ein Skript einfügen. Mit _Sudo -b_ erhalten Sie nicht Auftragssteuerung , sondern in einem Shell-Skript ist die Auftragssteuerung standardmäßig deaktiviert und sollte normalerweise nicht verwendet werden .

As man Sudo erklä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._

Dies funktioniert, weil nichts im Hintergrund ausgeführt wird, bis after Sudo Ihr Kennwort erhalten hat (falls erforderlich) und festgestellt hat, dass Sie berechtigt sind, den Befehl auszuführen.

Way 3: Aber für openvpn solltest du es wahrscheinlich nur mit _--daemon_ ausführen.

openvpn wird automatisch im Hintergrund ausgeführt, wenn Sie die Option _--daemon_ verwenden:

_Sudo openvpn ~/my_connection.ovpn --daemon
_

Übergeben Sie _--daemon_ nach Ihrem _.opvn_ -Dateinamen anstatt zuvor. Das Argument nach _--daemon_ wird, falls vorhanden, als der Name interpretiert, den der daemonisierte Prozess openvpn verwenden soll. (Füge nicht ​​auch _&_ hinzu.)

Ob dies angemessen ist oder nicht, hängt davon ab, ob eine Interaktion stattfinden muss, nachdem openvpn ausgeführt wurde, aber bevor es dämonisiert. Und das hängt zum Teil davon ab, was in _~/my_connection.ovpn_ eingestellt ist. Aber wenn openvpn nicht sofort dämonisieren konnte, werden auch alle anderen Möglichkeiten, es sofort im Hintergrund auszuführen, unterbrochen .

Daher sollten Sie in jeder Situation, in der Sie wissen, dass openvpnstart ​​im Hintergrund ausgeführt werden soll, und Sie wissen, dass Sie ihn nicht wieder in den Vordergrund stellen möchten, die Methode des Aufrufs überlegen mit der Option _--daemon_. Dies gilt speziell für openvpn - die meisten Programme unterstützen keine _--daemon_ -Option, obwohl viele Serverprogramme über eine solche Option verfügen. (Name und Syntax variieren jedoch.)

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 zu _--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 [...]_

Way 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 ausgeführt werden würde nicht ​​als root, und es gibt nie etwas Nützliches, wenn Sie das Skript als root ausführen Benutzer ohne Rootberechtigung, dann sollte der Benutzer des Skripts es wahrscheinlich nur als Root ausführen.

In diesem Fall sollten Sie Sudo aus den Befehlen im Skript entfernen. Wenn das Skript als root ausgeführt wird, ist Sudo nicht erforderlich. (Obwohl der Root-Benutzer standardmäßig jeden Befehl ausführen kann, wie jeder Benutzer, der sich selbst mit Sudo einschließt, und dazu kein Kennwort benötigt. Wenn Sie also do Instanzen von Sudo im Skript belassen, dann es wird wahrscheinlich noch funktionieren.)

Wenn Sie Instanzen von Sudo im Skript haben, die tatsächlich verwendet werden, um Befehle als ein anderer Benutzer als root (mit _-u user_) auszuführen, sollten Sie trotzdem jene Instanzen behalten.

Wenn das gesamte Skript als root ausgeführt wird, gelten die meisten die typischen Methoden zum Ausführen von Befehlen im Hintergrund , einschließlich des Anhängens von _&_ und gegebenenfalls der Verwendung von Nohup (welche Sie wissen bereits über). Zu diesem Zweck sollten Sie jedoch unbedingt openvpn mit der Option _--daemon_ verwenden.

29
Eliah Kagan

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

Die Übergabe des Konfigurationsdateinamens (.ovpn) an den Befehl openvpn funktioniert nur, wenn keine anderen Optionen angegeben sind. Wenn ich die Option --daemon eingebe, versucht openvpn, den Dateinamen als Optionsparameter zu analysieren, und gibt den Fehler Options aus: Ich versuche, "Windscribe.ovpn" als --Option zu analysieren Parameter, aber ich sehe kein führendes '-' .

Antwort:

Um dies zu vermeiden, muss der Dateiname mit der Option --config angegeben werden. Zum Beispiel openvpn --config Windscribe.ovpn --daemon. Schließen Sie dann das Syslog mit tail -f /var/log/syslog zur weiteren Überprüfung ab.

Sie können auch vor und nach der Ausgabe dieses Curl-Befehls curl ifconfig.co prüfen, ob eine VPN-Verbindung besteht.

Hinweis: Dadurch wird der Dämon auch nach dem Abmelden von der SSH-Sitzung weiter ausgeführt.

2
RajaRaviVarma

Sie können einfach kopieren

CONF-Datei in/etc/openvpn /

Bitten Sie dann 'service openvpn @ confName start', alle Dämonisierungs- und Sudo-Vorgänge für Sie durchzuführen.

Siehe https://unix.stackexchange.com/a/366680/198666

0
user18099