¿Cómo puedo ejecutar OpenVPN como root en segundo plano, en un script?


22

Me gustaría escribir un guión que llame openvpnprimero, seguido de ssh. Al escribir el comando

sudo openvpn ~/my_connection.ovpn

en el símbolo del sistema obtengo el siguiente resultado:

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

Este comando está bloqueando y no se libera el shell. Para iniciar una conexión ssh después, necesito empujar el proceso openvpn a un segundo plano escribiendo Ctrl+ Zseguido de a bg.

Sin embargo, me gustaría llamar al paso de conexión openvpn y al ssh automáticamente llamando solo a mi archivo bash. ¿Cómo logro emular los Ctrl+ Zy los bgpasos en este archivo?

Intenté agregar un comando &al openvpncomando y colocarlo nohupfrente a él. Ninguno de los dos funciona.


Este tipo de pregunta se ha hecho varias veces. Si necesita ayuda, realmente necesita publicar su script.
Panther

utilizar sudo -bpara ejecutar el comando que lo sigue en segundo plano
Nick Sillito

1
Me parece que esto realmente no es un duplicado de esa pregunta , que apenas cubre la ejecución de programas en segundo plano como root, y no cubre en absoluto cómo demonizar adecuadamente OpenVPN.
Eliah Kagan

Entonces deberíamos cambiar el título nuevamente para señalar que intenté ejecutar un programa en segundo plano como root.
nulo

@null He reeditado el título, según lo solicitado. OpenVPN a menudo se ejecuta como root y, en las situaciones en las que no lo es, la --daemonopción aún se puede usar, pero tiene razón en que la parte de ejecutarlo como root es fundamental para esta pregunta y debe reflejarse en su título . ¡Gracias por señalar esto!
Eliah Kagan

Respuestas:


35

TL; DR: uso sudo -bo, mejor ,.openvpn [...] --daemon

Dado que está ejecutando openvpn(y, menos específicamente, ya que desea ejecutar un programa como raíz en segundo plano), la información más comúnmente distribuida sobre cómo ejecutar comandos en segundo plano no aborda su situación. Tu dijiste:

Intenté agregar un & al comando cpenvpn y colocar nohop delante de él. Ambos no funcionan.

Tu comando es:

sudo openvpn ~/my_connection.ovpn

Según sudola configuración predeterminada, si no ha ingresado su contraseña recientemente sudoen el mismo contexto (para uso interactivo, generalmente esto significa el mismo terminal), le pedirá su contraseña. Pero si ejecuta el comando en segundo plano al agregarlo &, no se le mostrará la línea ni tendrá la oportunidad de escribirlo.[sudo] password for user:

Entonces, en esta situación, ejecutar el comando, ingresar su contraseña y enviarla a un segundo plano es una forma razonable de hacerlo, para uso interactivo .

Pero no es la única forma y, como usted dice, no querrá hacerlo en un guión .

Forma 1: asegúrese de sudotener una nueva marca de tiempo.

Puede asegurarse de que sudotiene una marca de tiempo actual cuando se utiliza para ejecutar su comando, ejecutando primero:

sudo -v

Luego, después de eso, puedes ejecutar:

sudo openvpn ~/my_connection.ovpn &

Sin embargo, generalmente es mejor evitar &(y nohup) por completo cuando desea ejecutar un comando en segundo plano con sudo. Este es especialmente el caso de las secuencias de comandos.

Camino 2: uso sudo -b. En general, esto suele ser lo que quieres.

En cambio, puede ejecutarse sudoen primer plano, pero pasar la -bbandera sudohace que el comando se ejecute en segundo plano.

sudo -b openvpn ~/my_connection.ovpn

Esta suele ser una mejor manera, especialmente si está poniendo el comando en un script. Con sudo -busted no obtiene el control del trabajo , pero en un script de shell, el control del trabajo está deshabilitado de forma predeterminada y, por lo general, no debería usarlo .

Como man sudoexplica:

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

Esto funciona porque no se está ejecutando en segundo plano hasta después sudo ha recibido su contraseña (si es necesario) y se determina que está autorizado para ejecutar el comando.

Forma 3: Pero openvpn, probablemente, solo deberías ejecutarlo --daemon.

openvpnse ejecutará en segundo plano automáticamente si lo ejecuta con la --daemonopción:

sudo openvpn ~/my_connection.ovpn --daemon

Pase --daemondespués de su .opvnnombre de archivo en lugar de antes; El siguiente argumento --daemon, si lo hay, se interpreta como el nombre que openvpndebe usar el proceso demonizado . (Do no también append &.)

Si esto es apropiado o no depende de si debe producirse alguna interacción después de que openvpnse haya ejecutado pero antes de que se demonice. Y eso depende, en parte, de lo que está configurado ~/my_connection.ovpn. Pero si openvpnno se puede demonizar de inmediato, también se romperán todas las otras formas de ejecutarlo inmediatamente en segundo plano .

Por lo tanto, en cualquier situación donde se sabe que quiere openvpna empezar ejecuta en segundo plano, y usted sabe que no va a querer traer de vuelta al primer plano, usted debe considerar seriamente el método de invocar con la --daemonopción. Esto es específico para: la openvpnmayoría de los programas no admiten una --daemonopción, aunque muchos programas de servidor sí tienen alguna opción. (Sin embargo, el nombre y la sintaxis varían).

Para decidir si usar o no esta opción (y cómo desea usarla), le recomiendo que lea la openvpnpágina del manual , especialmente en la sección sobre --daemon. Tiene mucha información útil, y solo estoy citando el primer párrafo aquí:

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

Forma 4 : a veces es razonable ejecutar todo el script como root.

Si tiene un script que lleva a cabo múltiples acciones como root, no tiene ninguna actividad significativa que razonablemente se ejecute no como root, y nunca hay nada útil de ejecutar el script como un usuario no root, entonces el El usuario de la secuencia de comandos probablemente debería simplemente ejecutarlo como root.

Si este es el caso, entonces debe eliminar sudode los comandos en el script. Cuando el script se ejecuta como root, no hay necesidad de hacerlo sudo. (Aunque el usuario puede raíz, de forma predeterminada, ejecutar cualquier comando como cualquier usuario incluido él mismo con sudoy no necesita una contraseña para hacerlo. Así que si haces casos de licencia de sudoen el guión, entonces probablemente va a funcionar todavía.)

Si tiene alguna instancia de sudola secuencia de comandos que realmente se utiliza para ejecutar comandos como otro usuario que no sea root (con ), entonces aún debe mantener esas instancias.-u user

Si todo el script se ejecuta como root, entonces se aplican la mayoría de las formas típicas de ejecutar comandos en segundo plano , incluyendo la adición &y, cuando sea necesario, el uso de nohup(que ya conoce). Para esto, sin embargo, aún debe considerar usar openvpncon la --daemonopción.


Una respuesta asombrosamente completa y reflexiva. Bien hecho.
gwideman

2

TL; DR Ejecutarlo en modo demonio:openvpn --config Windscribe-Japan.ovpn --daemon

Pasar el nombre de archivo de configuración (.ovpn) al openvpncomando solo funciona si no se especifican otras opciones. Si especifico la --daemonopción, entonces openvpn intenta analizar el nombre de archivo como un parámetro de opciones y arroja Error de opciones: estoy tratando de analizar "Windscribe.ovpn" como un parámetro --option pero no veo un '-' inicial .

Responder:

Para evitar esto, el nombre del archivo debe especificarse con la --configopción. Por ejemplo, openvpn --config Windscribe.ovpn --daemon. Luego tail -f /var/log/syslog, siga el syslog con , para una mayor inspección.

También puede verificar el resultado antes y después de este comando curl curl ifconfig.copara asegurarse de que la VPN esté conectada.

Nota: Esto mantendrá el demonio ejecutándose incluso después de cerrar sesión en la sesión SSH.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.