Como posso executar o OpenVPN como root em segundo plano, em um script?

8

Eu gostaria de escrever um script que chame openvpn primeiro, seguido por ssh . Ao digitar o comando

sudo openvpn ~/my_connection.ovpn

no prompt de comando, recebo a seguinte saída:

...
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 e o shell não é liberado. Para iniciar uma conexão ssh, eu preciso empurrar o processo openvpn para o background digitando Ctrl + Z seguido por bg .

No entanto, eu gostaria de chamar a etapa de conexão openvpn e o ssh automaticamente chamando apenas meu arquivo bash. Como faço para emular as etapas Ctrl + Z e bg neste arquivo?

Eu tentei anexar um & ao comando openvpn e colocar nohup na frente dele. Nem funciona.

    
por null 04.01.2017 / 21:14

2 respostas

15

TL; DR: Use sudo -b ou melhor, openvpn [...] --daemon .

Como você está executando openvpn (e, menos especificamente, desde que deseja executar um programa como root em segundo plano), as informações mais comumente fornecidas sobre como executar comandos no o fundo não resolve sua situação. Você disse:

  

Eu tentei anexar um & amp; para o comando cpenvpn e colocar nohop em   frente dela. Ambos não funcionam.

Seu comando é:

sudo openvpn ~/my_connection.ovpn

Abaixo da configuração padrão de sudo , se você não tiver digitado sua senha recentemente para sudo no mesmo contexto (para uso interativo, normalmente isso significa o mesmo terminal), ela solicitará sua senha. Mas se você executar o comando em segundo plano adicionando & , você não verá a linha [sudo] password for user: ou terá a oportunidade de digitá-la.

Então, nessa situação, executar o comando, digitar sua senha e enviá-lo para o segundo plano depois é uma maneira razoável de fazê-lo, para uso interativo .

Mas não é a única maneira e, como você diz, você não vai querer fazer isso em um script .

Caminho 1: Verifique se sudo tem um novo registro de data e hora.

Você pode garantir que sudo tenha um registro de data e hora atual quando for usado para executar seu comando, executando primeiro:

sudo -v

Depois disso, você pode executar:

sudo openvpn ~/my_connection.ovpn &

No entanto, geralmente é melhor evitar & (e nohup ) quando você deseja executar um comando em segundo plano com sudo . Este é especialmente o caso dos scripts.

Caminho 2: Use sudo -b . Em geral, geralmente é isso que você quer.

Em vez disso, você pode executar sudo em si mesmo em primeiro plano, mas passar o -b flag, então sudo faz com que o comando seja executado em segundo plano.

sudo -b openvpn ~/my_connection.ovpn

Esta é geralmente uma maneira melhor, especialmente se você estiver colocando o comando em um script. Com sudo -b você não obtém controle de trabalho , mas em um controle de trabalho shell script está desabilitado por padrão e você não deve usá-lo normalmente .

Como man sudo explica:

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

Isso funciona porque nada está sendo executado em segundo plano até que após sudo tenha recebido sua senha (se necessário) e determinado que você tenha permissão para executar o comando.

Way 3: Mas para openvpn , provavelmente você deve apenas executá-lo com --daemon .

openvpn será executado em segundo plano automaticamente se você executá-lo com a opção --daemon :

sudo openvpn ~/my_connection.ovpn --daemon

Passe --daemon após o nome do arquivo .opvn em vez de antes; o argumento após --daemon , se houver, é interpretado como o nome que o processo daemonized openvpn deve usar. (Não também acrescenta & .)

O fato de isso ser apropriado ou não depende de se alguma interação deve ou não ocorrer depois que openvpn foi executado, mas antes de ser daemonizado. E isso depende, em parte, do que está configurado em ~/my_connection.ovpn . Mas, se se openvpn não puder ser imediatamente daemonizado, todas as outras formas de executá-lo imediatamente em segundo plano também serão quebradas .

Portanto, em qualquer situação em que você saiba que deseja que openvpn inicie em execução em segundo plano, e você sabe que não vai querer trazê-lo de volta ao primeiro plano, deve considerar o método de invocá-lo com a opção --daemon . Isso é específico para openvpn - a maioria dos programas não oferece suporte à opção --daemon , embora muitos programas de servidor tenham essa opção. (O nome e a sintaxe variam, no entanto.)

Para decidir se deve ou não usar essa opção (e como você deseja usá-la), recomendo que você leia a página de manual openvpn , especialmente na seção --daemon . Tem muita informação útil, e estou apenas citando o primeiro parágrafo aqui:

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

Way 4 : Às vezes é razoável executar o script inteiro como root.

Se você tem um script que realiza várias ações como root, ele não tem nenhuma atividade significativa que seria razoavelmente executada não como root, e nunca há nada útil em executar o script como um usuário não-root, o usuário do script provavelmente deve apenas executá-lo como root.

Se este for o caso, você deve remover sudo dos comandos no script. Quando o script é executado como root, não há necessidade de sudo . (Embora o usuário root possa, por padrão, executar qualquer comando como qualquer usuário, incluindo-se com sudo e não precise de uma senha para fazê-lo. Então, se fizer , deixar instâncias de sudo no script, provavelmente ainda funcionará.)

Se você tiver instâncias de sudo no script que são realmente usadas para executar comandos como algum outro usuário além da raiz (com -u user ), você ainda deve manter essas instâncias.

Se todo o script estiver sendo executado como root, a maioria dos os típicos as formas de executar comandos em segundo plano se aplicam, incluindo o acréscimo de & e, quando necessário, o uso de nohup (que você já conhece). Para isso, no entanto, você deve considerar ainda usar openvpn com a opção --daemon .

    
por Eliah Kagan 04.01.2017 / 23:30
1

TL; DR Execute-o no modo daemon: openvpn --config Windscribe-Japan.ovpn --daemon

A passagem do nome do arquivo de configuração (.ovpn) para o comando openvpn funciona somente se nenhuma outra opção for especificada. Se eu especificar a opção --daemon , o openvpn tentará analisar o nome do arquivo como um parâmetro options e lançará o erro Options: Estou tentando analisar o Windscribe.ovpn como um parâmetro --option, mas não vejo levando '-' .

Resposta:

Para evitar isso, o nome do arquivo deve ser especificado com a opção --config . Por exemplo, openvpn --config Windscribe.ovpn --daemon . Em seguida, siga o syslog com tail -f /var/log/syslog , para uma inspeção mais detalhada.

Você também pode verificar a saída antes e depois deste comando curl curl ifconfig.co para garantir que a VPN esteja conectada.

Nota: Isso manterá o daemon em execução mesmo depois que você sair da sessão SSH.

    
por RajaRaviVarma 18.08.2017 / 23:24