Chciałbym napisać skrypt, który openvpn
najpierw 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 bg
kroki w tym pliku?
Próbowałem dołączyć a &
do openvpn
polecenia i umieścić nohup
przed nim. Żaden nie działa.
sudo -b
aby uruchomić następującą po nim komendę w tle--daemon
opcja 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!Odpowiedzi:
TL; DR: użycie
sudo -b
lub 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ś:Twoje polecenie to:
Zgodnie
sudo
z domyślną konfiguracją, jeśli ostatnio nie wprowadziłeś hasłasudo
w 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
sudo
ma nowy znacznik czasu.Możesz upewnić się, że
sudo
ma on bieżący znacznik czasu, gdy jest używany do uruchomienia polecenia, uruchamiając najpierw:Następnie możesz uruchomić:
Jednak zwykle lepiej jest całkowicie unikać
&
(inohup
), 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ć
sudo
się na pierwszym planie, ale przekazać-b
flagę, dziękisudo
czemu polecenie zostanie uruchomione w tle.Jest to zwykle lepszy sposób, szczególnie jeśli wstawiasz polecenie w skrypcie. Gdy
sudo -b
nie masz kontroli zadań , ale w skrypcie powłoki kontrola zadań jest domyślnie wyłączona i zwykle nie powinieneś jej używać .Jak
man sudo
wyjaśnia: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
.openvpn
będzie działał automatycznie w tle, jeśli uruchomisz go z--daemon
opcją:Przechodzić
--daemon
po.opvn
nazwie pliku raczej niż przedtem; argument--daemon
, jeśli występuje, jest interpretowany jako nazwa, którejopenvpn
powinien 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
openvpn
uruchomieniu, ale przed demonizacją. I to zależy częściowo od tego, co jest ustawione~/my_connection.ovpn
. Ale jeśliopenvpn
nie 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--daemon
opcją. Jest to specyficzne dla -openvpn
większość programów nie obsługuje tej--daemon
opcji, 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
openvpn
podręcznika , szczególnie w sekcji na--daemon
. Zawiera wiele użytecznych informacji i cytuję tutaj tylko pierwszy akapit: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ąć
sudo
z poleceń w skrypcie. Gdy skrypt działa jako root, nie ma takiej potrzebysudo
. (Chociaż użytkownik może korzeniowego, domyślnie uruchomić dowolną komendę jako dowolny użytkownik z tym samasudo
i nie potrzebuje hasło, aby to zrobić. Więc jeśli zrobić instancje urlopusudo
w skrypcie następnie to prawdopodobnie będzie nadal działać.)Jeśli masz jakieś
sudo
skrypty, 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życienohup
(o których już wiesz). Do tego jednak, należy rozważyć użycie nadal silnieopenvpn
z--daemon
opcją.źródło
TL; DR Uruchom go w trybie demona:
openvpn --config Windscribe-Japan.ovpn --daemon
Przekazywanie pliku konfiguracyjnego (.ovpn) do
openvpn
komendy działa tylko wtedy, gdy nie określono innych opcji. Jeśli podam--daemon
opcję, 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
--config
opcją. Na przykładopenvpn --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.co
aby upewnić się, że VPN jest podłączony.Uwaga: Dzięki temu demon będzie działał nawet po wylogowaniu z sesji SSH.
źródło
Możesz po prostu skopiować swój
Następnie poproś „service openvpn @ confName start”, aby zajął się wszystkimi demonizacjami i sudo.
Zobacz /unix//a/366680/198666
źródło