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

22

Eu gostaria de escrever um script que chame openvpnprimeiro, 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 depois, preciso enviar o processo openvpn para o segundo plano digitando Ctrl+ Zseguido de a bg.

No entanto, gostaria de chamar a etapa de conexão openvpn e o ssh automaticamente chamando apenas o meu arquivo bash. Como faço para emular o Ctrl+ Ze as bgetapas deste arquivo?

Eu tentei anexar &a ao openvpncomando e colocá-lo nohupna frente dele. Nem funciona.

nulo
fonte
Este tipo de pergunta foi feita várias vezes. Se você precisar de ajuda, realmente precisará postar seu script.
Pantera
use sudo -bpara executar o comando que se segue em segundo plano
Nick Sillito
11
Parece-me que isso realmente não é uma duplicata dessa pergunta , que dificilmente cobre a execução de programas em segundo plano como root e nem sequer cobre como daemonizar adequadamente o OpenVPN.
Eliah Kagan
Em seguida, devemos mudar o título novamente para apontar que tentei executar um programa em segundo plano como root.
null
@ null Reeditei o título, conforme solicitado. O OpenVPN é geralmente executado como root e, nas situações em que não é, a --daemonopção ainda pode ser usada, mas você está certo de que a parte de executá-lo como root é central para esta pergunta e deve refletir-se em seu título . Obrigado por apontar isso!
Eliah Kagan

Respostas:

35

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

Como você está executando openvpn(e, menos especificamente, porque deseja executar um programa como raiz em segundo plano), as informações mais comuns sobre como executar comandos em segundo plano não tratam da sua situação. Você disse:

Eu tentei anexar um & ao comando cpenvpn e colocar nohop na frente dele. Ambos não funcionam.

Seu comando é:

sudo openvpn ~/my_connection.ovpn

Sob sudoa configuração padrão, se você não tiver digitado sua senha recentemente sudono mesmo contexto (para uso interativo, normalmente significa o mesmo terminal), será solicitada sua senha. Mas se você executar o comando em segundo plano anexando &, não será mostrada a linha ou terá a oportunidade de digitá-la.[sudo] password for user:

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

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

Caminho 1: verifique se sudohá um novo carimbo de data / hora.

Você pode garantir que sudotenha 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) completamente quando você deseja executar um comando em segundo plano com sudo. Este é especialmente o caso dos scripts.

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

Em vez disso, você pode executar- sudose em primeiro plano, mas passar o -bsinalizador para sudoque o comando seja executado em segundo plano.

sudo -b openvpn ~/my_connection.ovpn

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

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.

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

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

openvpnserá executado em segundo plano automaticamente se você o executar com a --daemonopção:

sudo openvpn ~/my_connection.ovpn --daemon

Passe --daemondepois do .opvnnome do arquivo e não antes; o argumento a seguir --daemon, se houver, é interpretado como o nome que o openvpnprocesso daemonized deve usar. (Do não também acrescentar &.)

Se isso é apropriado ou não, depende se alguma interação deve ou não ocorrer após a openvpnexecução, mas antes da daemon. E isso depende, em parte, daquilo que está configurado ~/my_connection.ovpn. Mas se openvpnnão pudermos daemonizar imediatamente, todas as outras maneiras de executá-lo imediatamente em segundo plano também serão interrompidas .

Portanto, em qualquer situação onde você sabe que você quer openvpnpara começar a correr em segundo plano, e você sabe que você não vai querer trazê-lo de volta para o primeiro plano, você deve considerar fortemente o método de invocá-lo com a --daemonopção. Isso é específico para a openvpnmaioria dos programas não suporta uma --daemonopção, embora muitos programas de servidor possuam essa opção. (O nome e a sintaxe variam, no entanto.)

Para decidir se deve ou não usar esta opção (e como você deseja usá-la), recomendo que você leia a openvpnpágina de manual , especialmente na seção --daemon. Tem muitas informações úteis, 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 [...]

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

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

Se for esse o caso, você deve remover sudodos comandos no script. Quando o script é executado como root, não há necessidade sudo. (Embora a lata usuário root, por padrão, execute qualquer comando como qualquer usuário, incluindo-se com sudoe não precisa de uma senha para fazê-lo. Então, se você fazer casos de licença de sudono script, então ele provavelmente ainda trabalho.)

Se houver alguma instância do sudoscript que seja realmente usada para executar comandos como outro usuário que não seja root (with ), você ainda deverá manter essas instâncias.-u user

Se todo o script estiver sendo executado como raiz, aplica - se a maioria das maneiras típicas de executar comandos em segundo plano , incluindo anexar &e, quando necessário, o uso de nohup(que você já conhece). Para isso, no entanto, você ainda deve considerar fortemente o uso openvpncom a --daemonopção

Eliah Kagan
fonte
Uma resposta incrivelmente abrangente e atenciosa. Bem feito.
gwideman
2

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

Passar o nome do arquivo de configuração (.ovpn) para o openvpncomando funcionará apenas se nenhuma outra opção for especificada. Se eu especificar a --daemonopção, o openvpn tentará analisar o nome do arquivo como um parâmetro de opções e lançará o erro Opções: Estou tentando analisar "Windscribe.ovpn" como um parâmetro --option, mas não vejo um '-' inicial .

Responda:

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

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

Nota: Isso manterá o daemon em execução, mesmo após o logout da sessão SSH.

RajaRaviVarma
fonte
0

Você pode apenas copiar o seu

arquivo .conf em / etc / openvpn /

Em seguida, peça 'service openvpn @ confName start' para lidar com todos os daemonizing e sudo para você.

Consulte /unix//a/366680/198666

user18099
fonte