Come posso eseguire OpenVPN come root in background, in uno script?


22

Vorrei scrivere una sceneggiatura che chiama per openvpnprima, seguita da ssh. Quando si digita il comando

sudo openvpn ~/my_connection.ovpn

nel prompt dei comandi ottengo il seguente output:

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

Questo comando sta bloccando e la shell non viene rilasciata. Per avviare una connessione ssh in seguito, devo inserire il processo openvpn in background digitando Ctrl+ Zseguito da a bg.

Tuttavia, vorrei chiamare automaticamente il passaggio di connessione openvpn e ssh chiamando solo il mio file bash. Come riesco a emulare il Ctrl+ Ze i bgpassaggi in questo file?

Ho cercato di aggiungere un &al openvpndi comando e di porre nohupdi fronte ad essa. Né funziona.


Questo tipo di domanda è stata posta più volte. Se hai bisogno di aiuto, devi davvero pubblicare il tuo script.
Pantera

utilizzare sudo -bper eseguire il comando che lo segue in background
Nick Sillito

1
Mi sembra che questo è davvero non è un duplicato di quella domanda , che difficilmente si estende in esecuzione programmi in background come root, e non lo fa affatto copertura come demonizzare correttamente OpenVPN.
Eliah Kagan,

Quindi dovremmo cambiare di nuovo il titolo per sottolineare che ho provato a eseguire un programma in background come root.
null

@null Ho rieditato il titolo, come richiesto. OpenVPN viene spesso eseguito come root e, nelle situazioni in cui non lo è, l' --daemonopzione può ancora essere utilizzata, ma hai ragione nel dire che la parte relativa all'esecuzione come root è centrale per questa domanda e dovrebbe riflettersi nel suo titolo . Grazie per averlo segnalato!
Eliah Kagan,

Risposte:


35

TL; DR: Usare sudo -bo, meglio, .openvpn [...] --daemon

Poiché stai eseguendo openvpn(e, in particolare, poiché desideri eseguire un programma come root in background), le informazioni più comunemente dispensate su come eseguire i comandi in background non risolvono la tua situazione. Tu hai detto:

Ho provato ad aggiungere a & al comando cpenvpn e a posizionare nohop di fronte. Entrambi non funzionano.

Il tuo comando è:

sudo openvpn ~/my_connection.ovpn

Nella sudoconfigurazione predefinita, se non hai inserito di recente la password sudonello stesso contesto (per uso interattivo, in genere questo significa lo stesso terminale), ti verrà chiesta la password. Ma se esegui il comando in background aggiungendo &, non ti verrà mostrata la riga o ti verrà data la possibilità di digitarlo.[sudo] password for user:

Quindi, in questa situazione, eseguire il comando, inserire la password e inviarla in background in seguito è un modo ragionevole per farlo, per un uso interattivo .

Ma non è l'unico modo e, come dici tu, non vorrai farlo in una sceneggiatura .

Modo 1: assicurati di sudoavere un nuovo timestamp.

Puoi assicurarti che sudoabbia un timestamp corrente quando viene usato per eseguire il tuo comando, eseguendo prima:

sudo -v

Quindi, puoi eseguire:

sudo openvpn ~/my_connection.ovpn &

Tuttavia, in genere è meglio evitare &(e nohup) del tutto quando si desidera eseguire un comando in background con sudo. Questo è particolarmente vero per gli script.

Modo 2: utilizzare sudo -b. In generale, questo è di solito quello che vuoi.

Invece, puoi eseguirlo da sudosolo in primo piano, ma passa la -bbandiera in modo che sudoil comando venga eseguito in background.

sudo -b openvpn ~/my_connection.ovpn

Questo di solito è un modo migliore, specialmente se stai inserendo il comando in uno script. Con sudo -bte non ottieni il controllo del lavoro , ma in uno script di shell il controllo del lavoro è disabilitato di default e di solito non dovresti usarlo .

Come man sudospiega:

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

Questo funziona perché nulla è in esecuzione in background fino a quando sudo non ha ricevuto la tua password (se necessario) e ha stabilito che ti è permesso eseguire il comando.

Modo 3: Ma per openvpn, probabilmente dovresti semplicemente eseguirlo --daemon.

openvpnverrà eseguito automaticamente in background se lo esegui con l' --daemonopzione:

sudo openvpn ~/my_connection.ovpn --daemon

Passa --daemondopo il tuo .opvnnome file anziché prima; l'argomento seguente --daemon, se presente, viene interpretato come il nome che il openvpnprocesso daemonizzato dovrebbe usare. (Do non anche di aggiunta &.)

Se questo è appropriato o meno dipende dal fatto che debba avvenire o meno un'interazione dopo l' openvpnesecuzione, ma prima che venga demonizzata. E ciò dipende, in parte, da ciò che è impostato in ~/my_connection.ovpn. Ma se openvpnnon è possibile eseguire immediatamente il daemonize, anche tutti gli altri modi per eseguirlo immediatamente in background si romperanno .

Pertanto, in ogni situazione in cui si sa che si desidera openvpnper avviare in esecuzione in background, e sai che non si vuole riportarlo in primo piano, si dovrebbe prendere in seria considerazione il metodo di invocare con l' --daemonopzione. Questo è specifico per - la openvpnmaggior parte dei programmi non supporta --daemonun'opzione, sebbene molti programmi server abbiano tale opzione. (Tuttavia, il nome e la sintassi variano.)

Per decidere se utilizzare o meno questa opzione (e come si desidera utilizzarla), ti consiglio di leggere la openvpnpagina del manuale , in particolare nella sezione su --daemon. Ha molte informazioni utili e sto solo citando il primo paragrafo qui:

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

Modo 4 : a volte è ragionevole eseguire l'intero script come root.

Se si dispone di uno script che esegue più azioni come root, non ha alcuna attività significativa che potrebbe ragionevolmente essere eseguita non come root, e non c'è mai nulla di utile da eseguire eseguendo lo script come utente non root, quindi il l'utente dello script dovrebbe probabilmente eseguirlo come root.

In questo caso, è necessario rimuovere sudodai comandi nello script. Quando lo script viene eseguito come root, non è necessario sudo. (Anche se l'utente può radice, per impostazione predefinita, eseguire qualsiasi comando come qualsiasi utente compreso se stesso con sudoe non ha bisogno di una password per farlo. Quindi, se fate le istanze di permesso di sudonello script allora sarà probabilmente ancora il lavoro.)

Se sudonello script sono presenti istanze di effettivamente utilizzate per eseguire comandi come utenti diversi da root (con ), è consigliabile conservare tali istanze.-u user

Se l'intero script viene eseguito come root, si applicano la maggior parte dei modi tipici di eseguire i comandi in background , incluso l'aggiunta &e, se necessario, l'uso di nohup(di cui già si conosce). Per questo, tuttavia, dovresti comunque considerare fortemente l'utilizzo openvpncon l' --daemonopzione.


Una risposta incredibilmente completa e ponderata. Molto bene.
Gwideman,

2

TL; DR Eseguilo in modalità demone:openvpn --config Windscribe-Japan.ovpn --daemon

Il passaggio del nome file di configurazione (.ovpn) al openvpncomando funziona solo se non sono state specificate altre opzioni. Se specifico l' --daemonopzione, allora openvpn prova ad analizzare il nome del file come parametro di opzione e genera un errore di Opzioni: sto cercando di analizzare "Windscribe.ovpn" come parametro --option ma non vedo un '-' iniziale .

Risposta:

Per evitare ciò, il nome del file deve essere specificato con l' --configopzione. Ad esempio openvpn --config Windscribe.ovpn --daemon,. Quindi accodare il syslog con tail -f /var/log/syslog, per ulteriori ispezioni.

Puoi anche controllare l'output prima e dopo di questo comando curl curl ifconfig.coper assicurarti che la VPN sia connessa.

Nota: Ciò manterrà il demone in esecuzione anche dopo il logout dalla sessione SSH.


0

Puoi semplicemente copiare il tuo

File .conf in / etc / openvpn /

Quindi chiedi 'service openvpn @ confName start' per gestire tutto il daemonizing e sudo per te.

Vedi /unix//a/366680/198666

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.