Como reconectar-se a uma sessão ssh desconectada

157

Existe uma maneira de conectar-se a uma sessão ssh que foi desconectada? Estamos tendo problemas com nossa conexão de rede com um site remoto em que estamos trabalhando separadamente; entretanto, nesse meio tempo, experimentamos um grande número de desconexões devido a pacotes perdidos enquanto conectados a servidores no local remoto. Muitas vezes a sessão permanece ativa por um tempo e, às vezes, acontece no meio de alguma ação (edição de arquivo, execução de algum processo, etc ...) que eu preciso voltar ao invés de reiniciar, se possível.

cavalo pálido
fonte
10
Eu não posso acreditar que ninguém tenha mencionado mosh.mit.edu
jwbensley
@ Javano: Eu nunca ouvi falar disso. Adicione isso como resposta!
Kbyrd
@kbyrd já fez;)
jwbensley
uma pergunta semelhante foi perguntado em unix.stackexchange.com/questions/105001/... com algumas dicas de como contornar as desconexões em primeiro lugar ...
anarcat

Respostas:

136

UPDATE: Para obter uma resposta real, consulte a resposta de zero_r abaixo

Esta não é uma resposta, mas uma solução alternativa. Use a tela .

Quando você faz login pela primeira vez, execute a tela. Você obtém outro shell, executa comandos nisso. Se você estiver desconectado, o processo de tela mantém o terminal ativo para que seu shell e os processos em execução não caiam. Quando você se reconectar, execute 'screen -r' para continuar.

Há muito mais para configurar e usar a tela, mas as opções acima devem solucionar o seu problema.

kbyrd
fonte
18
Ou use o tmux - uma tela 'mais fria', eu usei os dois e prefiro o tmux porque você pode dividir bem o termo.
John Hunt
3
Fiquei feliz de encontrar screenjá estava instalado no meu Ubuntu 12.x isso, se você não tem certeza apenas tentar este comando, ele se reconectar e retomar o do-release-upgrade processo: Tela sudo -D -r
bjm88
1
@ bjm88, sudodeve ser usado apenas se a sessão de tela original tiver sido iniciada com sudo. Caso contrário, ele retornará como se não houvesse sessão de tela:There is no screen to be detached
Noam Manos
+1 Sei que essa não é a resposta real; no entanto, screen -rera exatamente o que eu estava procurando.
Eric Nelson
130

Tente definir ClientAliveInterval (por exemplo, 60) e TCPKeepAlive (yes ou no) como valores apropriados no servidor sshd.conf.

Isso deve manter sua sessão ativa, mesmo que a conexão se perca por alguns minutos.

zero_r
fonte
24
Até agora, você parece ser o único a responder à pergunta em vez de sugerir a tela como uma solução alternativa.
kbyrd
2
Boa decisão. Descobrimos esse método particularmente útil ao atravessar firewalls ASA / PIX da Cisco, que por padrão adoram esgotar o tempo limite das conexões TCP.
Mike Pountney
5
Talvez este não seja o lugar certo para perguntar, mas é possível que o pôster troque as respostas? Deveríamos responder a "tela" (a minha não é a melhor, eu gosto da de Mike Pountney, mas recebi o representante) com essas informações.
Kbyrd
1
Isso funcionará quando conectado por uma conexão Cisco VPN, e a conexão VPN for perdida e restabelecida?
Brent
para mim tela funciona perfeito, eu posso reconectar a tarefa rastreada e countiune para trabalhar
integratorIT
65

Como mencionado acima, o GNU Screen é o caminho a seguir. Isso permitirá que você tenha uma 'sessão de tela' na caixa remota na qual você pode executar vários comandos, através de várias 'janelas de tela'. Isso simplesmente desanexará se a conexão SSH principal morrer, mantendo todos os subprocessos em execução ativos e ativos.

' man screen' é seu amigo, como sempre, e o pacote do SO deve ser chamado ' screen' se não estiver instalado por padrão.

Noções básicas são:

  • Inicie uma sessão de tela (no seu host remoto):

    $ screen
    
  • Desligar da sua sessão de tela: CTRL-A,d

  • Reconecte-se à sua sessão na tela depois de fazer login novamente:

    $ screen -d -r
    
  • Abrir outra tela 'janela': CTRL-A,c

  • Ciclo através de você tela janelas abertas: CTRL-A,space

muitas coisas legais que você pode fazer com o Screen. Uso-o há mais de 10 anos e ainda estou descobrindo novos recursos. É o meu utilitário Unix favorito.

Mike Pountney
fonte
1
Sim, esta é uma resposta muito melhor que a minha.
kbyrd
Ainda posso conectar-me à sessão ssh desconectada, se eu reiniciar o meu PC onde a tela está sendo executada?
BarathVutukuri
tmux é mais poderoso
Pegasus
46

Não acredito que ninguém tenha mencionado o MOSH ;

O Mosh é um protocolo separado que pode ser conectado ao processo de login do SSH. Ele mantém sua sessão ativa após dias de desconexão, alteração de IP, alta latência e assim por diante. É explicado na página inicial melhor do que posso explicar, por isso copiei a descrição abaixo. Minhas experiências e conselhos são de que eu uso no meu celular Android, é um salva-vidas ao viajar e fazer SSH. O mesmo acontece no meu laptop quando conectado ao celular no trem, por exemplo. Eu recomendo a compilação do código-fonte para obter a versão mais recente, a versão repo para mim no Ubuntu tem alguns aborrecimentos que são corrigidos na versão mais recente (no momento em que escrevo).

Mosh (shell móvel)

Aplicativo de terminal remoto que permite roaming, suporta conectividade intermitente e fornece eco local inteligente e edição de linha das teclas do usuário.

Mosh é um substituto para o SSH. É mais robusto e ágil, especialmente através de links Wi-Fi, celular e de longa distância.

Mosh é um software gratuito, disponível para GNU / Linux, FreeBSD, Solaris, Mac OS X e Android.

Recursos do site:

  • Alterar IP. Mantenha-se conectado : o Mosh faz roaming automaticamente conforme você se move entre as conexões com a Internet. Use Wi-Fi no trem, Ethernet em um hotel e LTE na praia: você permanecerá conectado. A maioria dos programas de rede perde suas conexões após o roaming, incluindo SSH e aplicativos da Web como o Gmail. Mosh é diferente.

  • Cria bons sonhos : com o Mosh, você pode colocar seu laptop em repouso e acordá-lo mais tarde, mantendo sua conexão intacta. Se a sua conexão à Internet cair, o Mosh o alertará - mas a conexão continuará quando o serviço de rede voltar.

  • Livre-se do atraso na rede : o SSH aguarda a resposta do servidor antes de mostrar sua própria digitação. Isso pode criar uma interface de usuário ruim. Mosh é diferente: fornece uma resposta instantânea à digitação, exclusão e edição de linhas. Ele faz isso de forma adaptativa e funciona mesmo em programas de tela cheia como emacs e vim. Em uma conexão ruim, as previsões pendentes estão sublinhadas para que você não seja enganado.

  • Nenhum código privilegiado. Sem daemon : você não precisa ser o superusuário para instalar ou executar o Mosh. O cliente e o servidor são executáveis ​​executados por um usuário comum e duram apenas a vida útil da conexão.

  • Mesmo método de login : o Mosh não escuta nas portas de rede ou autentica usuários. O cliente mosh efetua login no servidor via SSH e os usuários apresentam as mesmas credenciais (por exemplo, senha, chave pública) de antes. Em seguida, o Mosh executa o servidor mosh remotamente e se conecta a ele pelo UDP.

  • É executado dentro do seu terminal, mas melhor : o Mosh é um programa de linha de comando, como o ssh. Você pode usá-lo dentro do xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen ou tmux. Mas o mosh foi projetado do zero e suporta apenas um conjunto de caracteres: UTF-8. Ele corrige bugs Unicode em outros terminais e no SSH.

  • O Control-C funciona muito bem : ao contrário do SSH, o protocolo baseado em UDP da mosh lida com a perda de pacotes normalmente e define a taxa de quadros com base nas condições da rede. O Mosh não preenche os buffers da rede; portanto, o Control-C
    sempre trabalha para interromper um processo descontrolado.

jwbensley
fonte
8
Mosh não é um wrapper ssh - é um protocolo diferente, quase totalmente não relacionado ao ssh (ele usa apenas ssh para login).
jch 6/02/15
+1 Muito verdadeiro, meu erro.
jwbensley
2
E a segurança, cara no meio? criptografia? troca de chaves?
Nasir Iqbal
Mosh parece incrível, embora, infelizmente, não suporta o encaminhamento de porta ainda .
Boann
20

O autossh observa sua conexão e, se ela cair, é reconectada. É mais confiável do que keepalives. Se você se conectar a uma sessão de tela, continuará exatamente de onde se desconectou (veja o rscreenque vem com o autossh)

hayalci
fonte
1
fora de uma manutenção configurável, ele não permite que você se reconecte a uma sessão (o que o OP estava procurando). mas o autossh pode ser realmente útil para aplicativos que requerem túneis ssh, mapeamento de portas etc.
ives
sim autossh + screen seria o ponto ideal. autossh tem rscreenpara isso.
hayalci
Autossh é melhor que mosh. Eu usei os dois.
Sridhar Sarnobat 15/09
Aqui está um post de Jesse Keating, sobre o uso de autossh com tela .
sampablokuper
12

tmux

Este é um clássico. Use-o sempre que correr o risco de perder a conexão com um terminal.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Assim, você está de volta à ação.

Jacksonkr
fonte
Muito obrigado! Eu estava procurando como fazer isso com o tmux, pois isso parece ser o que a maioria das pessoas considera como a melhor opção.
CoolOppo
10

Eu instalaria e iniciaria a tela para corrigir seu problema. Tela permitirá que você se reconecte a uma sessão de tela anterior.

Além disso, a tela também permite que você faça coisas legais, como dividir a tela, visualizar o console etc. Você pode encontrar mais informações aqui e aqui .

Para iniciantes, se você for desconectado, poderá usar

screen -ls

para ver suas sessões e

screen -r ${session} 

reconectar a um desconectado.

wzzrd
fonte
4

Como outros já apontaram, a tela geralmente é a melhor solução para isso e também adiciona uma série de outros recursos úteis.

Você pode configurar seu perfil na máquina remota para iniciar automaticamente e / ou reconectar-se à tela no login, o que evita que você esqueça de iniciar a tela na única vez que precisar, porque sofre uma queda na conexão.

Consulte http://tlug.dnho.net/?q=node/239 (ou pesquise no Google por muitos outros exemplos que são diferentes).

David Spillett
fonte
3

uma alternativa mais moderna à tela, infelizmente não disponível para alguns tipos de "virtualização" (por exemplo, no cygwin você pode ter "tela", mas não "tmux" devido à maneira como foi projetado), mas sempre que você tiver a opção de instalar o tmux , Eu recomendo vivamente que escolha um instante de tela.

cepal
fonte
3

Aqui está outra solução sem tela.

A bandeja de massa permite que você faça exatamente isso, tem uma opção de reconexão e desconexão que não está em uso regular ou em massa

https://puttytray.goeswhere.com/

é uma bifurcação (completamente aberta) de massa de vidraceiro com outras opções, acesse as configurações de conexão e existem 2 opções, uma para 'tentativa de reconectar-se com falha de conexão' e 'tentativa de reconectar-se na inicialização'.

munkiepus
fonte
1
Ehh. Ele vem com um keylogger e um utilitário automático de exfiltração ppk, por acaso?
Deer Hunter
1
Suponho que você esteja perguntando se, de alguma forma, rouba seus detalhes, é completamente de código aberto, o código-fonte está disponível no github se você quiser procurar no github.com/FauxFaux/PuTTYTray, existem alguns contribuidores: )
munkiepus
grandes cheers :)
munkiepus
2

Embora a tela mantenha sua sessão shell aberta no servidor remoto se a sessão ssh cair, ela não fará nada sobre o problema de queda das conexões ssh. Como zero_r sugere, tente ajustar sua conexão ssh com keep alives e longos tempos limite.

Eu sugiro que você rastreie a causa dos pacotes perdidos que causam os problemas e corrija-os em vez de contorná-los.

David
fonte
Obrigado pela sugestão. Estamos trabalhando para rastrear o problema principal da perda de pacotes; está demorando um pouco para descobrir (muito complicado, esse aqui!). Isso realmente é uma solução alternativa para esse período de problemas. Nunca se sabe quando algo causará uma queda de conexão.
palehorse
1
Isso gerará muito ruído, mas você pode tentar executar o ssh através do strace e ver o que está fazendo / relata quando a conexão ssh cai. Ele pode apenas relatar o que você já sabe, mas quem sabe ... #
David
1

Às vezes eu esqueci de rodar a tela também e perdi meu trabalho inacabado. Nesse caso, embora não possamos reconectar a uma sessão SSH quebrada, é possível reparar novamente um programa em execução em um novo terminal e retomar o que você estava fazendo reptyr.

Depois de desconectar acidentalmente de uma sessão SSH, a primeira coisa a fazer é executar screenpara que a conexão não seja interrompida novamente. Em seguida, na nova sessão, execute ps aux | grep {The process to be resumed}para obter o PID. Com o PID, você pode tentar reptyr {PID}ou reptyr -T {PID}(se houver subprocessos) continuar o trabalho.

march_happy
fonte