Muitas vezes, tenho que me conectar a um servidor via ssh em um ambiente wifi não confiável. No servidor, eu executo a tela; portanto, se eu for desconectado, posso reconectar e retomar a sessão de tela e continuar de onde parei, mas a perda de conexão ainda é um grande problema: se a conexão cair enquanto eu estiver estou no servidor, a janela do terminal tende a congelar. Eu tenho que matar essa guia, abrir um novo, ssh para o servidor novamente e retomar a sessão de tela. Eu tentei isso com tela em execução no servidor e tela localmente. De qualquer maneira, ele tende a congelar quando a conexão é interrompida.
Existe alguma maneira de ter algo semelhante à tela, ou talvez a própria tela, que tentará se reconectar automaticamente e manter a sessão em execução, para que eu não precise se reconectar manualmente? Muitas vezes, quando perco a conexão, acho que é apenas por um período muito breve - menos de um segundo, talvez.
Estou usando o Ubuntu 14.04 LTS, edição MATE. obrigado
fonte
<Enter>
e digite~.
para dizer ao seu lado para interromper a conexão, e você pode simplesmente repetir o último comando ssh para reconectar (por exemplo, com seta para cima ou!!
).Respostas:
Você pode usar
mosh
: https://mosh.org/Você pode configurar um servidor 'jump' com uma conexão de internet confiável à qual você
mosh
se conecta e terssh
sessões para cada servidor que você gerencia. O motivo pelo qual sugiro usar um servidor de salto é que você pode não querer instalarmosh
nos servidores que está gerenciando.Outra vantagem
mosh
disso é que ele é baseado em UDP e não em TCP, e sua sessão pode sobreviver a uma mudança de endereço IP, por exemplo, passando de WiFi para uma conexão de Internet móvel.Só para deixar claro,
mosh
não é um substituto parascreen
, mas simssh
. Ainda é uma boa idéia usáscreen
-lo, poismosh
ele não fornece uma maneira de se reconectar à sua sessão se o cliente morrer por algum motivo.fonte
Estou usando
tmux
há alguns anos e, na minha experiência, ele se reconecta automaticamente. Pelo menos quando a conexão falha apenas por um tempo relativamente curto. Note que eu realmente usobyobu
com o tmux como back-end. Eu não sei se isso robustez é uma característica detmux
oubyobu
ou mesmo da combinação dos dois, mas eu sugiro que você dê tanto uma tentativa.Eu me conecto da minha instalação local do Arch a vários servidores remotos do Ubuntu por meio de uma VPN. Testei-o agora desconectando meu cabo de rede enquanto estava conectado ao controle remoto. A sessão foi interrompida, mas assim que meu cabo foi conectado novamente, ele foi retomado sem problemas.
No entanto, quando eu testei reiniciando meu roteador, a conexão não retornou. Suponho que tenha algo a ver com o tempo que a rede ficou inoperante, mas parece reconectar-se se estiver apenas inoperante em alguns segundos.
Caso seja relevante, faço tudo isso
terminator
como meu emulador de terminal.Todos os três estão disponíveis nos repositórios do Ubuntu:
No entanto, não tenho certeza de que seja
tmux
oubyobu
seja melhor no tratamento de desconexões ssh. Só sei que, em minha experiência, eles geralmente retornam de pequenas perdas de conexão. Isso pode estar relacionado a outros aspectos da minha configuração.fonte
tcp
conexão. Pela minha experiência,ssh
pode ser muito resistente a interrupções intermitentes da rede, não acho que isso tenha algo a ver com o fato de você estar usandotmux
dentro dassh
janela.ClientAlive
/ServerAlive
triggers, ou ... Não sei o quebyobu
faz, no entanto .tmux
é basicamente uma alternativa mais moderna parascreen
, sim. Quando comecei a trabalhar como agora e precisava desse tipo de coisa, minha leitura superficial sugeriu quetmux
é a melhor escolha hoje em dia. Também não tenho 100% de certeza de que ele tenha um melhor gerenciamento de conexões perdidas, tudo que sei é que ele se recupera de breves interrupções na minha experiência. Se é issotmux
ou algo mais, eu não sei. Mas parece que vale a pena tentar :). O Byobu é basicamente um frontend para o screen / tmux, não um emulador de terminal da GUI. É extremamente útil: byobu.orgUse as
ServerAlive
opções do ssh para detectar quando a conexão falhou.Portanto, se você definir
ServerAliveInterval
5,ssh
será desconectado automaticamente se a rede sair por 15 segundos.fonte
~.
(ou entra pela primeira vez, então~.
) constituído por: o caractere de escape~
e o comando para quebrar a sessão.
Em condições semelhantes, eu costumo usar
eshell
com TRAMP (over ssh) dentro do Emacs. O TRAMP cuida da reconexão quando necessário, sem causar muitos problemas para eu fornecer os comandos desejados para o shell remoto.No entanto, eshell não é bom como um terminal, ou seja, para executar comandos que fazem algo especial com o terminal ou que funcionam por um período significativo de tempo continuamente (incrementalmente) imprimindo algo.
Basicamente, é bastante simples começar a usá-lo no Emacs com o TRAMP:
fonte
aviso Legal
Se a sua conexão SSH não sobreviver a breves interrupções na rede, haverá outra coisa que não permitirá que o
ssh
TCP faça o que é normal.Veja abaixo para detalhes. De qualquer forma:
A solução sem dependência mais rápida e suja
Crie um script de shell como este:
Isso apenas executará um loop simples e estúpido que continua tentando se conectar
ssh
e se conectarscreen
. Passe o host ou qualquer outra coisa que você normalmente passaria para suassh
chamada como argumentos da linha de comando.A reconexão baseia-se apenas no fato de o SSH relatar um erro na conexão, o que significa que ele não possui inteligência para detectar erros não-SSH como "você literalmente não tem o WiFI ativado" ou o que quer que seja, mas isso provavelmente não importa para você.
Suponho que você tenha
ssh-agent
ou uma chave SSH sem senha que permita que as reconexões funcionem sem a necessidade de entrada adicional de você.Haverá uma pequena condição de corrida em que, se você acertar
^C
durante a fração de segundo imperceptível a humanos certa durante uma reconexão, poderá acabar matando o script em vez de passar o^C
caminho para o terminal do cliente, portanto, se você suspeitar de uma conexão travada não amasse^C
com zelo demais.Solução de software adicional mais simples
Você pode tentar o programa autossh , que deve estar disponível no seu repositório de pacotes Ubuntu.
Se você precisar compilar a partir do código-fonte ou auditá-lo, é um único programa em C que compila sem nenhuma biblioteca adicional como dependências, parece ter mais inteligência sobre como verificar a vitalidade da conexão do que o meu hack acima, e também é fornecido com um conveniente
rscreen
comando de script que auto -anexa ascreen
.Detalhes
Como
ssh
normalmente se recuperaSó para verificar, porque não gosto de dizer as coisas sem me verificar, fiz um pequeno teste antes de responder:
Eu entrei no meu WiFi com um dispositivo Linux, fiz uma conexão SSH com outro dispositivo na minha LAN, verifiquei que tinha uma
ssh
conexão funcionando com a outra extremidade (podia executar comandos, etc.) e, em seguida, o cliente desconectou o WiFi (causando a interface para ser desconfigurado: não há mais endereços IP), digitou muitos caracteres na sessão ssh (sem resposta, é claro) e reconectou-se ao meu WiFi - a reconexão realmente falhou pelo menos uma vez devido a um sinal ruim e outros fatores e, finalmente, reconectado: esperei cerca de cinco segundos para que assh
sessão se recuperasse, nada aconteceu e pressionei mais uma tecla, e assh
sessão imediatamente voltou a funcionar, com todas as teclas que eu havia digitado durante a desconexão aparecendo na linha de comando.Veja,
ssh
apenas grava / lê no soquete da rede TCP até que o sistema operacional avise que algo deu errado, e o TCP é realmente muito tolerante a quedas prolongadas de conexão.Deixada para seus próprios dispositivos com configurações padrão do kernel, a pilha TCP no Linux tolerará com prazer a conexão ficar completamente silenciosa por muitos minutos antes de declarar a conexão inativa e relatar um erro
ssh
- no momento em que finalmente desistir, estaremos conversando no estádio. de ~ 30 minutos, ou pelo menos certamente o tempo suficiente para superar os soluços de conexão que duram um segundo ou um minuto.Por baixo das capas, a pilha TCP do Linux tenta novamente gradualmente as mensagens com atrasos cada vez maiores, o que significa que, quando sua conexão voltar, você poderá observar um atraso adicional antes que sua
ssh
sessão pareça ficar "viva" novamente.Por que isso às vezes quebra
Geralmente, algo está ativamente causando o fechamento da conexão após um período de inatividade significativamente mais curto do que o valor que a pilha TCP tolerará e, em seguida, falha ao relatar esse estado de conexão ao seu
ssh
cliente.Os candidatos prováveis incluem:
Firewalls ou roteadores NAT'ing, que precisam usar a memória para lembrar cada conexão TCP ativa - como uma otimização e alguma atenuação contra ataques do DOS, eles às vezes esquecem sua conexão e depois ignoram silenciosamente os pacotes resultantes, porque os pacotes no no meio de uma conexão quando você não se lembra da conexão existente parecer inválida.
Firewalls / roteadores com melhor comportamento injetam um pacote TCP RST, que geralmente se manifesta como uma
connection reset by peer
mensagem de erro, mas o pacote de redefinição é um alerta, portanto, se a conexão com o cliente ainda estiver com problemas naquele momento e eliminar o redefinir o pacote também, seu cliente pensará que a conexão ainda está ativa.O servidor em si pode ter uma política de firewall para eliminar silenciosamente pacotes inesperados, o que interromperia as tentativas de retomada de conexão do cliente sempre que o servidor considerar que a conexão foi fechada, mas o cliente não: seu cliente continua tentando continuar a conexão, mas o servidor é apenas ignorando-o porque não há conexão ativa à qual esses pacotes pertençam ao estado de firewall do servidor.
Como você está executando o Linux, verifique cuidadosamente o servidor
iptables
/ip6tables
(ounft
se você estiver usando o novo material) exatamente o que está permitindo ou descartando. É muito comum permitir pacotes novos / estabelecidos / relacionados na porta TCP SSH, mas não "inválidos" - se você estiver descartando silenciosamente tudo o que não é permitido, essa configuração comum poderá causar esse tipo de congelamento após breves problemas de conexão .O próprio servidor SSH pode ser configurado para fechar a conexão após um período de inatividade, usando uma das opções do OpenSSH para pacotes de manutenção de atividade do cliente TCP ou SSH. Por si só, isso não causará travamentos indefinidos, mas pode colocá-lo em um dos estados descritos acima.
É possível que você simplesmente não esteja dando tempo suficiente para "desfazer" sozinho depois de entrar no estado em que sua
ssh
sessão é encerrada .fonte