Manter a sessão SSH ativa [fechada]


241

Eu uso ssh -p8520 username@remote_hostpara fazer login no servidor remoto.

Edição :

Ele está sempre conectado e funciona corretamente quando estou no local de trabalho. Infelizmente, o terminal congela em 10 a 15 minutos depois que eu conectei o servidor remoto em casa.

Não há nenhum relatório de erro / tempo limite no console, mas o cursor não pode mais se mover.

Ao entrar wpara verificar os usuários de login, alguns usuários de zumbis estão lá, e eu tenho que matá-los manualmente.

Isso é muito chato. Alguém pode me ajudar?


Eu também tive isso, comecei a usar screen. Talvez seja algum tipo de problema de tempo limite.
Martin

O @martin screenajuda a manter o programa em execução. Infelizmente, às vezes eu tenho que trabalhar no servidor remoto :(
Haifeng Zhang

Se você iniciá-lo sem parâmetros, isso fornece um shell.
Martin

Você está dizendo screenapenas? Ele pode resolver o problema de conexão perdida? Não screen -S screenName? Eu sempre uso a tela com -Se-r
Haifeng Zhang

1
Não, isso não resolve o problema, você apenas evita perder seu trabalho no terminal. Se você não fizer nada, ele ainda irá congelar, você pode começar por onde começou. Eu quis dizer que você pode criar um terminal que você sempre pode retomar usando screen. Você parece já sabe que;)
martin

Respostas:


449

O daemon ssh (sshd), que executa no lado do servidor, fecha a conexão do lado do servidor se o cliente ficar silencioso (ou seja, não envia informações). Para evitar a perda de conexão, instrua o cliente ssh a enviar um sinal de vida útil ao servidor de vez em quando.

A configuração para isso está no arquivo $HOME/.ssh/config, crie o arquivo se ele não existir (o arquivo de configuração não deve ser legível pelo mundo, portanto, execute chmod 600 ~/.ssh/configapós a criação do arquivo). Para enviar o sinal a cada quatro minutos (240 segundos) para o host remoto, coloque o seguinte nesse arquivo de configuração:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Para ativar o envio de um sinal keep-alive para todos os hosts, coloque o seguinte conteúdo no arquivo de configuração:

Host *
    ServerAliveInterval 240

24
@ user271996, por que reiniciar um daemon para uma configuração do lado do cliente?
maxschlepzig

A configuração deve ser apenas gravável pelo usuário. legibilidade não é uma preocupação. Usar 600 como seu nível de permissão é bom, pois isso é apenas gravável pelo usuário.
jbruni

1
apenas no caso não é óbvio para este arquivo em sua caixa PC / linux
ZZAPPER

5
Sempre fico confuso com o nome da configuração: o cliente usa ServerAliveInterval enquanto o servidor usa ClientAliveInterval . Que bagunça.
youkaichao

@youkaichao Muitas vezes há essa confusão. Como designer de API, há razões para que eu possa colocá-lo de duas maneiras. Por fim, o mais crítico é a boa documentação do padrão escolhido.
Cameron Tacklind 17/10/19

170

Eu queria uma solução única:

ssh -o ServerAliveInterval=60 myname@myhost.com

Armazenado em um alias:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

Agora pode se conectar assim:

me@MyMachine:~$ sshprod

12
Isso é legal, mas não é exatamente uma "solução única". Se você estiver se conectando ao servidor mais de uma vez, por que não fazer Host *& ServerAliveInterval 240(ou especificar o nome do host, se você o desejar apenas myname@myhost.comcomo na resposta de rockymonkey555? Definir um alias não parece mais fácil de forma alguma.
Lambart

8
Ou então, basta criar um alias em seu ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
Ele quer dizer "uma vez", como em "só funciona uma vez", não "só preciso escrever uma vez".
Jonathan Hartley

1
Sim, se você ler "uma vez" como "uso único", isso fará o trabalho perfeitamente.
philraj

Se você quer um "one-liner" que conjuntos ServerAliveIntervalpara 60, ótimo. No entanto, o uso de um alias do bash quando você poderia estar usando .ssh/configé simplesmente bobo.
Cameron Tacklind 17/10/19

50

Para aqueles que se perguntam, @ edward-coast

Se você deseja definir o keep alive para o servidor , adicione-o a /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : define um intervalo de tempo limite em segundos, após o qual, se nenhum dado foi recebido do cliente, o sshd (8) enviará uma mensagem através do canal criptografado para solicitar uma resposta do cliente.

ClientAliveCountMax : define o número de mensagens ativas do cliente (veja abaixo) que podem ser enviadas sem o sshd (8) receber nenhuma mensagem do cliente. Se esse limite for atingido enquanto as mensagens ativas do cliente estiverem sendo enviadas, o sshd desconectará o cliente, encerrando a sessão.


Parece que não existe um "parâmetro", como ClientAliveInterval, única ServerAliveInterval, você pode verificar na página de manual "homem ssh_config"
DTJ

6
Essa é a incorreta, procure em "man sshd_config" a parte do servidor executando o daemon ssh, não a configuração do cliente.
30816 Jeff Davenport

Devo usar ClientAliveIntervalpara deixar o servidor verificar se o cliente está ativo ou devo deixar o cliente "executar ping" no servidor ServerAliveIntervalrepetidamente? Ambos não parece fazer sentido
qrtLs

1
Defina apenas ClientAliveIntervalo servidor se desejar que o servidor desconecte em conexões mortas que não respondem e você poderá personalizar com que frequência e quando isso acontecer.
Jeff Davenport


10

Podemos manter nossa conexão ssh ativa, seguindo as configurações globais

Adicione a seguinte linha ao /etc/ssh/ssh_configarquivo:

ServerAliveInterval 60

Isso funciona apenas para o cliente ou também para sshd?
Edward Coast

1
@ EdwardCoast Funciona na máquina do cliente. Eu testei no Mac
minhas23
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.