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 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 bg
etapas deste arquivo?
Eu tentei anexar &
a ao openvpn
comando e colocá-lo nohup
na frente dele. Nem funciona.
sudo -b
para executar o comando que se segue em segundo plano--daemon
opçã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!Respostas:
TL; DR: Use
sudo -b
ou, 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:Seu comando é:
Sob
sudo
a configuração padrão, se você não tiver digitado sua senha recentementesudo
no 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
sudo
há um novo carimbo de data / hora.Você pode garantir que
sudo
tenha um registro de data e hora atual quando for usado para executar seu comando, executando primeiro:Depois disso, você pode executar:
No entanto, geralmente é melhor evitar
&
(enohup
) completamente quando você deseja executar um comando em segundo plano comsudo
. 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-
sudo
se em primeiro plano, mas passar o-b
sinalizador parasudo
que o comando seja executado em segundo plano.Geralmente, é uma maneira melhor, especialmente se você estiver colocando o comando em um script. Com
sudo -b
você 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 sudo
explica: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
.openvpn
será executado em segundo plano automaticamente se você o executar com a--daemon
opção:Passe
--daemon
depois do.opvn
nome do arquivo e não antes; o argumento a seguir--daemon
, se houver, é interpretado como o nome que oopenvpn
processo 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
openvpn
execução, mas antes da daemon. E isso depende, em parte, daquilo que está configurado~/my_connection.ovpn
. Mas seopenvpn
nã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
openvpn
para 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--daemon
opção. Isso é específico para aopenvpn
maioria dos programas não suporta uma--daemon
opçã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
openvpn
página de manual , especialmente na seção--daemon
. Tem muitas informações úteis, e estou apenas citando o primeiro parágrafo aqui: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
sudo
dos comandos no script. Quando o script é executado como root, não há necessidadesudo
. (Embora a lata usuário root, por padrão, execute qualquer comando como qualquer usuário, incluindo-se comsudo
e não precisa de uma senha para fazê-lo. Então, se você fazer casos de licença desudo
no script, então ele provavelmente ainda trabalho.)Se houver alguma instância do
sudo
script 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 denohup
(que você já conhece). Para isso, no entanto, você ainda deve considerar fortemente o usoopenvpn
com a--daemon
opçãofonte
TL; DR Execute-o no modo daemon:
openvpn --config Windscribe-Japan.ovpn --daemon
Passar o nome do arquivo de configuração (.ovpn) para o
openvpn
comando funcionará apenas se nenhuma outra opção for especificada. Se eu especificar a--daemon
opçã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
--config
opção Por exemploopenvpn --config Windscribe.ovpn --daemon
,. Depois, siga o syslog comtail -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.co
para garantir que a VPN esteja conectada.Nota: Isso manterá o daemon em execução, mesmo após o logout da sessão SSH.
fonte
Você pode apenas copiar o seu
Em seguida, peça 'service openvpn @ confName start' para lidar com todos os daemonizing e sudo para você.
Consulte /unix//a/366680/198666
fonte