Sessões SSH travam no desligamento / reinicialização

13

Eu tenho um servidor que executa o Debian e o sshd e, no caso de precisar reiniciar o servidor, minha sessão SSH trava no lado do cliente até o tempo limite do TCP. Suponho que isso ocorre porque, quando sshdestá sendo encerrado, não fecha explicitamente as sessões SSH abertas para o host. O que devo fazer para sshdprimeiro desconectar todos e depois terminar normalmente? Até agora, não vejo um parâmetro man sshd_configrelacionado ao comportamento de desligamento.

Vesper
fonte
Quando tudo mais falhar, você pode matar um cliente SSH a qualquer momento pressionando [Enter] [~] [.]. Explicações sobre como resolver o seu problema também.
N

Respostas:

32

Quando você encerra ou reinicia o sistema, systemdtenta interromper todos os serviços o mais rápido possível. Isso envolve derrubar a rede e encerrar todos os processos que ainda estão ativos - geralmente nessa ordem. Portanto, quando o systemd mata os processos SSH bifurcados que estão lidando com suas sessões SSH, a conexão de rede já está desativada e eles não têm como fechar a conexão do cliente normalmente.

Seu primeiro pensamento pode ser matar todos os processos SSH como o primeiro passo durante o desligamento, e existem alguns arquivos de serviço do systemd por aí que fazem exatamente isso.

Mas é evidente que existe uma solução mais limpa (como ele é "suposto" ser feito): systemd-logind.
systemd-logindmonitora as sessões de usuários ativos (locais e SSH) e atribui todos os processos gerados dentro deles às chamadas "fatias". Dessa forma, quando o sistema é desligado, o systemd pode simplesmente SIGTERM tudo dentro das fatias do usuário (que inclui o processo SSH bifurcado que está realizando uma sessão específica) e continuar desligando os serviços e a rede.

systemd-logindrequer que um módulo PAM seja notificado sobre novas sessões de usuário e você precisará dbususar loginctlpara verificar seu status; portanto, instale ambas:

apt-get install libpam-systemd dbus

Certifique-se de que você /etc/ssh/sshd_configrealmente vai usar o módulo UsePAM yes.

n.st
fonte
Ok, objetivo alcançado e obrigado pela explicação. (Embora eu gostaria de alguma forma de controle de dependência para o encerramento, de modo que tudo é a primeira SIGTERM'd ao ser capaz de terminar o seu trabalho, isso pode fazer como uma solução em camadas.)
Vesper
Por alguma razão, não fui notificado sobre a resposta enquanto visitava apenas o StackOverflow. Esquisito.
Vesper
1
Então, para resumir, apenas para economizar alguns segundos no desligamento, temos que instalar toda uma carga de porcaria apenas para que nossas conexões sejam encerradas corretamente? Seriamente ? Isso está ficando errado. Estamos condenados.
Leucos
3
Observe que a primeira reinicialização após a instalação do libpam-systemd e do dbus ainda deixaria sua sessão SSH travada. Para evitar que, em vez de reboot, faça um shutdown -rpadrão com atraso de 1 minuto, deixando tempo para fechar a sessão SSH.
mivk
9

Isso é algo que você precisa definir no lado do cliente, não no lado do servidor. Edite seu ~/.ssh/configpara conter

ServerAliveInterval 15
ServerAliveCountMax 5

Isso significa que, após 15 segundos de inatividade, seu cliente enviará uma mensagem ao servidor. Se não receber nenhuma resposta, tentará novamente até 5 vezes e, quando ainda não obtiver resposta, encerrará a sessão.

Jenny D
fonte
2
Isso resultará em um atraso de 75s antes do servidor ssh relatar o servidor morto. Certo?
Vesper
1
Sim, e você pode ajustar os parâmetros para obter um tempo limite mais curto.
Tero Kilkanen 17/07/2015
Isso resolveu o problema para mim. Um problema tão irritante.
Justin Andrusk 28/06
5

Esse comportamento é relatado neste bug da Debian . Você só precisa configurar corretamente os scripts de desligamento fornecidos com o pacote porque, automaticamente, eles não são copiados por padrão:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service
Rfraile
fonte
1

Você pode especificar as opções sobre as quais Jenny D falou em sua resposta apenas para um comando ssh, como

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

se você fizer isso com frequência, poderá criar um script.

Diego Medaglia
fonte
0

Funciona para mim com o lshd. Então a solução seria

apt install lsh-server
apt remove openssh-server
Deus
fonte
0

infelizmente serverfault não me deixou responder na causa do thread por muito poucos pontos desde anos. Mas não preciso enviar spam em outros blogs para obter o desbloqueio ^^ ... então, como resposta dedicada:

Como Rfraile mencionou

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

trabalho. Para usá-lo sem reiniciar a instância / servidor, você deve executar tarefas adicionais:

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

portanto, o serviço é registrado e iniciado e o systemd precisa interrompê-lo para fins de reinicialização / desligamento.

Reiner030
fonte
Então você está apenas repetindo outra resposta?
RalfFriedl
Não? Eu usei as duas linhas apenas como referência para a resposta superior, porque ainda não posso responder como está escrito. Eu adicionei as etapas necessárias para usá-lo sem reiniciar. Isso também pode ser dado em outro tópico de perguntas, mas que eu não fiz check-out.
Reiner030