Me gustaría escribir un guión que llame openvpn
primero, 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 bg
pasos en este archivo?
Intenté agregar un comando &
al openvpn
comando y colocarlo nohup
frente a él. Ninguno de los dos funciona.
sudo -b
para ejecutar el comando que lo sigue en segundo plano--daemon
opció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!Respuestas:
TL; DR: uso
sudo -b
o, 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:Tu comando es:
Según
sudo
la configuración predeterminada, si no ha ingresado su contraseña recientementesudo
en 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
sudo
tener una nueva marca de tiempo.Puede asegurarse de que
sudo
tiene una marca de tiempo actual cuando se utiliza para ejecutar su comando, ejecutando primero:Luego, después de eso, puedes ejecutar:
Sin embargo, generalmente es mejor evitar
&
(ynohup
) por completo cuando desea ejecutar un comando en segundo plano consudo
. 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
sudo
en primer plano, pero pasar la-b
banderasudo
hace que el comando se ejecute en segundo plano.Esta suele ser una mejor manera, especialmente si está poniendo el comando en un script. Con
sudo -b
usted 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 sudo
explica: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
.openvpn
se ejecutará en segundo plano automáticamente si lo ejecuta con la--daemon
opción:Pase
--daemon
después de su.opvn
nombre de archivo en lugar de antes; El siguiente argumento--daemon
, si lo hay, se interpreta como el nombre queopenvpn
debe 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
openvpn
se haya ejecutado pero antes de que se demonice. Y eso depende, en parte, de lo que está configurado~/my_connection.ovpn
. Pero siopenvpn
no 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
openvpn
a 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--daemon
opción. Esto es específico para: laopenvpn
mayoría de los programas no admiten una--daemon
opció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
openvpn
página del manual , especialmente en la sección sobre--daemon
. Tiene mucha información útil, y solo estoy citando el primer párrafo aquí: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
sudo
de los comandos en el script. Cuando el script se ejecuta como root, no hay necesidad de hacerlosudo
. (Aunque el usuario puede raíz, de forma predeterminada, ejecutar cualquier comando como cualquier usuario incluido él mismo consudo
y no necesita una contraseña para hacerlo. Así que si haces casos de licencia desudo
en el guión, entonces probablemente va a funcionar todavía.)Si tiene alguna instancia de
sudo
la 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 denohup
(que ya conoce). Para esto, sin embargo, aún debe considerar usaropenvpn
con la--daemon
opción.fuente
TL; DR Ejecutarlo en modo demonio:
openvpn --config Windscribe-Japan.ovpn --daemon
Pasar el nombre de archivo de configuración (.ovpn) al
openvpn
comando solo funciona si no se especifican otras opciones. Si especifico la--daemon
opció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
--config
opción. Por ejemplo,openvpn --config Windscribe.ovpn --daemon
. Luegotail -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.co
para 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.
fuente
Puedes copiar tu
Luego, solicite 'service openvpn @ confName start' para manejar todos los demonios y sudo por usted.
Ver /unix//a/366680/198666
fuente