Eu tenho um servidor que executa Debian e sshd nele e, caso precise reiniciar o servidor, minha sessão SSH trava no lado do cliente até o tempo limite do TCP. Presumo que isso ocorra porque, quando sshd
está sendo encerrado, ele não fecha explicitamente as sessões SSH abertas para o host. O que devo fazer para sshd
primeiro desconectar todos e depois terminar normalmente? Até agora não vejo um parâmetro man sshd_config
relacionado ao comportamento de desligamento.
Quando você desliga ou reinicia o sistema,
systemd
tenta 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 apenas matar todos os processos SSH como a primeira etapa durante o desligamento, e existem alguns arquivos de serviço systemd por aí que fazem exatamente isso.
Mas é claro que existe uma solução mais simples (como "deveria" ser feito):
systemd-logind
.systemd-logind
rastreia as sessões ativas do usuário (locais e SSH) e atribui todos os processos gerados dentro deles aos chamados "slices". Dessa forma, quando o sistema é desligado, o systemd pode apenas SIGTERM tudo dentro das fatias do usuário (que inclui o processo SSH bifurcado que está passando por uma sessão específica) e, em seguida, continuar desligando os serviços e a rede.systemd-logind
requer um módulo PAM para ser notificado sobre novas sessões de usuário e você precisarádbus
usá -lologinctl
para verificar seu status, então instale ambos:Certifique-se de que você
/etc/ssh/sshd_config
realmente usará o módulo comUsePAM yes
.Isso é algo que você precisa definir no lado do cliente, não no lado do servidor. Edite o seu
~/.ssh/config
para conterIsso significa que após 15 segundos de inatividade, seu cliente enviará uma mensagem ao servidor. Se não obtiver resposta, tentará novamente até 5 vezes, e quando ainda não obtiver resposta, encerrará a sessão.
Este comportamento é relatado neste Debian Bug , você só precisa configurar corretamente os scripts de desligamento enviados com o pacote porque, automaticamente, eles não são copiados por padrão:
Você pode especificar as opções sobre as quais Jenny D falou em sua resposta apenas para um comando ssh, como
se você fizer isso com frequência, poderá criar um script.
Funciona para mim com lshd. Então a solução seria
infelizmente, o serverfault não me deixou responder no tópico por causa de muito poucos pontos desde anos. Mas não preciso enviar spam para outros blogs para obter o desbloqueio ^^... então, como resposta dedicada:
Como Rfraile mencionou
funciona. Para usá-lo sem reiniciar a instância/servidor, você deve executar tarefas adicionais:
portanto, o serviço é registrado e iniciado e o systemd precisa interrompê-lo para fins de reinicialização/desligamento.