Eu encontrei esta pergunta , mas desculpe, não entendo bem as configurações das duas variáveis ServerAliveInterval
e ClientAliveInterval
mencionadas na resposta aceita. Se meu servidor local estiver atingindo o tempo limite, devo definir esse valor como zero? Será que nunca vai expirar? Em vez disso, devo configurá-lo para 300 segundos ou algo assim?
Minha pergunta é simplesmente: algumas das minhas conexões atingem o tempo limite quando eu suspiro e desinsiro o meu laptop com a resposta Write failed: Broken pipe
e alguns não. Como posso configurar corretamente um sshd local para que eles não falhem com um pipe quebrado?
ServerAliveInterval : número de segundos que o cliente aguardará antes de enviar um pacote nulo ao servidor (para manter a conexão ativa) .
ClientAliveInterval : número de segundos que o servidor aguardará antes de enviar um pacote nulo ao cliente (para manter a conexão ativa) .
Definir um valor 0 (o padrão) desabilitará esses recursos para que sua conexão possa cair se ficar inativa por muito tempo.
ServerAliveInterval parece ser a estratégia mais comum para manter uma conexão ativa. Para evitar o problema de tubo quebrado, aqui está a configuração ssh que eu uso no meu arquivo .ssh/config:
Host myhostshortcut
HostName myhost.com
User barthelemy
ServerAliveInterval 60
ServerAliveCountMax 10
A configuração acima funcionará da seguinte maneira,
ClientAliveCountMax no lado do servidor também pode ajudar. Esse é o limite de quanto tempo um cliente pode permanecer sem resposta antes de ser desconectado. O valor padrão é 3, como em três ClientAliveInterval.
Isso é explicado em sshd_config
manual (man sshd_config
):
ClientAliveInterval
Define um intervalo de tempo limite em segundos, após o qual, se nenhum dado foi recebido do cliente, o sshd enviará uma mensagem através do canal criptografado para solicitar uma resposta do cliente. O padrão é 0, indicando que essas mensagens não serão enviadas ao cliente. Essa opção se aplica apenas à versão 2 do protocolo.
ClientAliveCountMax
O valor padrão é 3. Se
ClientAliveInterval
(veja abaixo) estiver definido como 15 eClientAliveCountMax
for deixado no padrão, os clientes SSH que não responderem serão desconectados após aproximadamente 45 segundos. Esta opção se aplica apenas ao protocolo versão 2.
Para as opções do cliente, consulte a explicação em man ssh_config
:
ServerAliveInterval
Define um intervalo de tempo limite em segundos após o qual, se nenhum dado foi recebido do servidor,
ssh
enviará uma mensagem pelo canal criptografado para solicitar uma resposta do servidor. O padrão é 0, indicando que essas mensagens não serão enviadas ao servidor. Essa opção se aplica apenas à versão 2 do protocolo.
ServerAliveCountMax
O valor padrão é 3. Se, por exemplo,
ServerAliveInterval
estiver definido como 15 eServerAliveCountMax
for deixado no padrão, se o servidor não responder,ssh
será desconectado após aproximadamente 45 segundos. Esta opção se aplica apenas ao protocolo versão 2.
Com base no acima, 0 significa que está desativado. Portanto, você deve definir esses valores altos o suficiente para evitar erros Tubo quebrado.
A resposta de Barthelemy é legal, mas realmente não chega à raiz do problema. Você suspende sua máquina e deseja que a sessão SSH ainda esteja ativa quando você inicializar o computador.
Não existe uma configuração para o ssh que mantenha a conexão ativa assim. O SSH usa o TCP. Para começar, você precisa do handshake de três direções e, depois, permanece vivo após algum tempo ocioso. Quando você encerra/hiberna, todas as suas conexões TCP são fechadas com FIN. Não há como superar isso.
Para uma solução alternativa suja, você pode usar o VPS ou outra caixa online com tela para manter a conexão. Meu conselho não faz isso por razões de segurança.
Como você não pode garantir que uma conexão SSH (sendo TCP) permaneça ativa quando uma extremidade parar de enviar ACKs para pacotes recebidos, eu pessoalmente uso http://www.harding.motd.ca/autossh/ = para reiniciar todas as minhas conexões SSH quase assim que eu suspender.
Como a tela GNU estará em uso no lado do servidor, a reconectação me leva a onde eu estava antes).
Você pode ouvi-lo em portas extras para verificar continuamente se as conexões ainda estão ativas, mas, pessoalmente, acho que funciona bem o suficiente com isso desativado e confiando apenas no ServerAliveInterval
/ServerAliveCountMax
do SSH.
Outra opção é http://mosh.mit.edu/ que usa UDP e se recupera perfeitamente da falta de conectividade a longo prazo.
Você também pode executar comandos com Nohup
se desejar que eles sejam executados independentemente da sua conexão SSH.
por exemplo.
$ Nohup tar -xzf some_huge.tar.gz &
O &
acho que não é necessário, mas é conveniente, pois faz com que o processo seja executado em segundo plano para que você possa fazer outras coisas.
Eu sempre uso o Nohup para qualquer processo que leva algum tempo, para não precisar recomeçar se perder a conexão por qualquer motivo - falta de energia (na minha localização remota, não no host, obviamente), falta de rede, qualquer que seja.
Coloque sua longa sessão dentro da tela Veja a tela -h para detalhes
Dessa forma, você pode se reconectar à máquina usando ssh e reconectar à sessão da tela