Jak mogę uruchomić OpenVPN jako root w tle, w skrypcie?

22

Chciałbym napisać skrypt, który openvpnnajpierw wywołuje , a następnie ssh. Podczas wpisywania polecenia

sudo openvpn ~/my_connection.ovpn

w wierszu polecenia otrzymuję następujące dane wyjściowe:

...
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

To polecenie blokuje i powłoka nie jest zwolniona. Aby później nawiązać połączenie ssh, muszę wcisnąć proces openvpn w tło, wpisując Ctrl+, Za następnie a bg.

Chciałbym jednak wywołać krok połączenia openvpn i ssh automatycznie, wywołując tylko mój plik bash. Jak mogę emulować Ctrl+ Zi bgkroki w tym pliku?

Próbowałem dołączyć a &do openvpnpolecenia i umieścić nohupprzed nim. Żaden nie działa.

zero
źródło
Tego rodzaju pytanie zadawano wiele razy. Jeśli potrzebujesz pomocy, naprawdę musisz opublikować swój skrypt.
Panther
użyj, sudo -baby uruchomić następującą po nim komendę w tle
Nick Sillito
1
Wydaje mi się, że tak naprawdę nie jest to duplikat tego pytania , które z trudem obejmuje programy działające w tle jako root, i wcale nie obejmuje, jak poprawnie demonizować OpenVPN.
Eliah Kagan
Następnie powinniśmy ponownie zmienić tytuł, aby wskazać, że próbowałem uruchomić program działający w tle jako root.
zerowy
@ null Ponownie zredagowałem tytuł, zgodnie z prośbą. OpenVPN jest często uruchamiany jako root , aw sytuacjach, w których go nie ma, --daemonopcja może być nadal używana, ale masz rację, że część dotycząca uruchamiania jako root ma zasadnicze znaczenie dla tego pytania i powinna zostać odzwierciedlona w tytule . Dzięki za zwrócenie na to uwagi!
Eliah Kagan

Odpowiedzi:

35

TL; DR: użycie sudo -blub lepiej .openvpn [...] --daemon

Ponieważ działasz openvpn(a dokładniej, ponieważ chcesz uruchomić program jako root w tle), najczęściej wydawane informacje o tym, jak uruchamiać polecenia w tle, nie dotyczą twojej sytuacji. Powiedziałeś:

Próbowałem dołączyć polecenie & do polecenia cpenvpn i umieścić przed nim nohop. Oba nie działają.

Twoje polecenie to:

sudo openvpn ~/my_connection.ovpn

Zgodnie sudoz domyślną konfiguracją, jeśli ostatnio nie wprowadziłeś hasła sudow tym samym kontekście (do użytku interaktywnego, zwykle oznacza to ten sam terminal), wówczas poprosi o podanie hasła. Ale jeśli uruchomisz polecenie w tle, dołączając &, nie zobaczysz wiersza ani nie będziesz mógł go wpisać.[sudo] password for user:

Tak więc w tej sytuacji uruchomienie polecenia, wpisanie hasła i wysłanie go w tle jest rozsądnym sposobem na zrobienie tego, do użytku interaktywnego .

Ale to nie jedyny sposób i, jak mówisz, nie będziesz chciał tego robić w skrypcie .

Sposób 1: Upewnij się, że sudoma nowy znacznik czasu.

Możesz upewnić się, że sudoma on bieżący znacznik czasu, gdy jest używany do uruchomienia polecenia, uruchamiając najpierw:

sudo -v

Następnie możesz uruchomić:

sudo openvpn ~/my_connection.ovpn &

Jednak zwykle lepiej jest całkowicie unikać &(i nohup), jeśli chcesz uruchomić polecenie w tle za pomocą sudo. Dotyczy to zwłaszcza skryptów.

Sposób 2: Użyj sudo -b. Zasadniczo tego właśnie chcesz.

Zamiast tego możesz uruchamiać sudosię na pierwszym planie, ale przekazać -bflagę, dzięki sudoczemu polecenie zostanie uruchomione w tle.

sudo -b openvpn ~/my_connection.ovpn

Jest to zwykle lepszy sposób, szczególnie jeśli wstawiasz polecenie w skrypcie. Gdy sudo -bnie masz kontroli zadań , ale w skrypcie powłoki kontrola zadań jest domyślnie wyłączona i zwykle nie powinieneś jej używać .

Jak man sudowyjaśnia:

     -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.

To działa, ponieważ nic nie jest uruchomiony w tle, aż po sudo nie otrzymałem hasła (jeśli to konieczne) i stwierdziliśmy, że dopuszcza się, aby uruchomić polecenie.

Sposób 3: Ale po openvpn, prawdopodobnie powinieneś po prostu to uruchomić --daemon.

openvpnbędzie działał automatycznie w tle, jeśli uruchomisz go z --daemonopcją:

sudo openvpn ~/my_connection.ovpn --daemon

Przechodzić --daemonpo .opvnnazwie pliku raczej niż przedtem; argument --daemon, jeśli występuje, jest interpretowany jako nazwa, której openvpnpowinien użyć demonizowany proces. (Czy nie również append &).

To, czy jest to właściwe, zależy od tego, czy jakakolwiek interakcja musi nastąpić po openvpnuruchomieniu, ale przed demonizacją. I to zależy częściowo od tego, co jest ustawione ~/my_connection.ovpn. Ale jeśli openvpnnie da się natychmiast demonizować, wtedy wszystkie inne sposoby natychmiastowego uruchomienia go w tle również się zepsują .

Dlatego w każdej sytuacji, gdy wiesz, że chcesz openvpn, aby zacząć działać w tle, a wiesz, że nie będzie chciał go przywrócić na pierwszy plan, należy poważnie rozważyć metodę wywoływania go z --daemonopcją. Jest to specyficzne dla - openvpnwiększość programów nie obsługuje tej --daemonopcji, chociaż wiele programów serwerowych ma taką opcję. (Nazwa i składnia są jednak różne).

Aby zdecydować, czy skorzystać z tej opcji (i jak chcesz z niej skorzystać), zalecamy przeczytanie strony openvpnpodręcznika , szczególnie w sekcji na --daemon. Zawiera wiele użytecznych informacji i cytuję tutaj tylko pierwszy akapit:

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

Sposób 4 : Czasami rozsądnie jest uruchomić cały skrypt jako root.

Jeśli masz skrypt, który wykonuje wiele działań jako root, nie ma on żadnej znaczącej aktywności, która byłaby rozsądnie uruchomiona nie jako root, i nigdy nie ma nic użytecznego po uruchomieniu skryptu jako użytkownik inny niż root. użytkownik skryptu powinien prawdopodobnie po prostu uruchomić go jako root.

W takim przypadku należy usunąć sudoz poleceń w skrypcie. Gdy skrypt działa jako root, nie ma takiej potrzeby sudo. (Chociaż użytkownik może korzeniowego, domyślnie uruchomić dowolną komendę jako dowolny użytkownik z tym sama sudoi nie potrzebuje hasło, aby to zrobić. Więc jeśli zrobić instancje urlopu sudow skrypcie następnie to prawdopodobnie będzie nadal działać.)

Jeśli masz jakieś sudoskrypty, które są faktycznie używane do uruchamiania komend jako użytkownik inny niż root (with ), powinieneś zachować te instancje.-u user

Jeśli cały skrypt jest uruchamiany jako root, wówczas stosuje się większość typowych sposobów uruchamiania poleceń w tle , w tym dołączanie &i, w razie potrzeby, użycie nohup(o których już wiesz). Do tego jednak, należy rozważyć użycie nadal silnie openvpnz --daemonopcją.

Eliah Kagan
źródło
Niezwykle kompleksowa i przemyślana odpowiedź. Dobra robota.
gwideman
2

TL; DR Uruchom go w trybie demona:openvpn --config Windscribe-Japan.ovpn --daemon

Przekazywanie pliku konfiguracyjnego (.ovpn) do openvpnkomendy działa tylko wtedy, gdy nie określono innych opcji. Jeśli podam --daemonopcję, openvpn próbuje parsować nazwę pliku jako parametr opcji i zgłasza błąd opcji: Próbuję parsować „Windscribe.ovpn” jako parametr --option, ale nie widzę wiodącego „-” .

Odpowiedź:

Aby tego uniknąć, nazwę pliku należy podać z --configopcją. Na przykład openvpn --config Windscribe.ovpn --daemon. Następnie ogonuj syslog za pomocą tail -f /var/log/syslog, aby dalej sprawdzać.

Możesz także sprawdzić przed i po wyjściu tego polecenia curl, curl ifconfig.coaby upewnić się, że VPN jest podłączony.

Uwaga: Dzięki temu demon będzie działał nawet po wylogowaniu z sesji SSH.

RajaRaviVarma
źródło
0

Możesz po prostu skopiować swój

plik .conf do / etc / openvpn /

Następnie poproś „service openvpn @ confName start”, aby zajął się wszystkimi demonizacjami i sudo.

Zobacz /unix//a/366680/198666

użytkownik18099
źródło