Qual é a melhor maneira de executar um comando ssh remoto em segundo plano, mas ainda sendo exibido?

14

Preciso executar comandos SSH remotamente com a saída exibida localmente. Mas se a conexão quebrar, quero que o comando ainda seja executado.

Não estou falando muito sobre fazer login e executar, mas fazer ssh user @ remotehost 'command && command etc'

Como posso garantir que o comando seja executado mesmo se a conexão for interrompida?

vfclists
fonte

Respostas:

26

A melhor maneira de fazer isso é usar a tela, que mantém a sessão aberta de maneira persistente, mesmo que a conexão acabe (e se você quiser começar a usá-la novamente, poderá fazer um screen -re a abrirá novamente).

Prefixar o comando com o qual você deseja executar screen(por exemplo ssh -t user@host screen command) deve fazer o trabalho.

Se você deseja que ele seja executado no plano de fundo do shell, também pode anexar um &à coisa toda.

Falcon Momot
fonte
Você provavelmente precisará usar ssh -t para alocar um terminal para que o comando seja executado. Caso contrário, o erro é "Deve estar conectado a um terminal".
bonsaiviking
11

Você deseja ter uma sessão persistente que possa retomar ou apenas para impedir que uma desconexão interrompa a exceção?

Para o primeiro, use screen, para o último nohup,.

Shane Madden
fonte
7

Como mencionado anteriormente, screenpode fazer todo o truque. Mas não é só o que você precisa. Eu uso a tela há anos e agora sempre que faço login nos sistemas. Tente instalar screene criar ~/.screenrccom essa configuração:

sessionname     vcflists
startup_message off
deflogin        off
vbell           off
msgminwait      0
msgwait         10
log             off
backtick        1 0 0 hostname
caption splitonly "%?%F%{= yk}%:%{= Kk}%? %n %t%="
hardstatus alwayslastline "%{= rY}  %1`  %{= kg} %0c %{= bY}  %-w%{= Yk} %n %t %{-}%+w %=%{g}%l "

Então corra screen -Rd vcf. Essa é a invocação preferencial da tela. Você se reconectará à sessão criada anteriormente com o nome vcf * (ou será avisado se for ambíguo) ou, se a sessão ainda não estiver aberta, ela será criada. CTRL+ Aé uma meta-chave que faz tudo. CTRL+A C( CTRL+ A, então C) cria uma nova janela (tela) dentro da sessão. CTRL+A SPACEmova o foco para a próxima janela em uma rodada. CTRL+A Ddesanexe a sessão atual, mantendo todas as janelas funcionais entre as conexões. Se você iniciou uma tarefa muito longa, pode desconectar da tela e reconectá-la mais tarde para ver o que acontece. O mesmo acontece se a sua sessão ssh for perdida - a tela permanece ativa com todas as janelas abertas e todas as tarefas iniciadas.

Se você quiser fechar alguma janela dentro da tela - apenas a exitpartir da casca. Se você deseja fechar todas as conchas / tarefas em todas as janelas e sair da tela - basta pressionar CTRL+A CTRL+\e pressionar "Y" quando solicitado.

Para todo o resto, veja a tela do homem.

Kondybas
fonte
2

Eu já vi essa alternativa para uma conexão ssh "like" confiável:

http://mosh.mit.edu/

Rodrigo Prior Bechelli
fonte
No site, o mosh (shell móvel) parece uma nova ferramenta promissora. É muito novo, no entanto.
precisa saber é o seguinte
1

Eu normalmente faria:

nohup mycommand &

tail -f nohup.out
Gyin
fonte