SSH sessões pendurar no desligamento / reinicialização

12

Eu tenho um servidor que executa o Debian e o sshd nele, e no caso de eu precisar reiniciar o servidor, minha sessão SSH trava no lado do cliente até o tempo limite do TCP. Suponho que isso acontece porque quando sshd está sendo finalizado, ele não fecha explicitamente as sessões SSH abertas para o host. O que devo fazer para que sshd primeiro desconecte todos e termine-se como normal? Até agora, não vejo um parâmetro em man sshd_config relacionado ao comportamento de shutsown.

    
por Vesper 17.07.2015 / 10:16

4 respostas

27

Quando você desliga ou reinicializa 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 vivos - geralmente nessa ordem. Então, quando o systemd mata os processos SSH bifurcados que estão manipulando suas sessões SSH, a conexão de rede já está desabilitada e eles não têm como fechar a conexão do cliente normalmente.

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

Mas é claro que há uma solução mais simples (como é "suposto" ser feito): systemd-logind .
systemd-logind mantém o controle das sessões ativas do usuário (locais e SSH) e atribui todos os processos gerados dentro eles para chamados "fatias". 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á entregando uma sessão específica) e depois continuar a desligar 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á de dbus para usar loginctl para verificar seu status. Portanto, instale os dois:

apt-get install libpam-systemd dbus

Certifique-se de que seu /etc/ssh/sshd_config , na verdade, usará o módulo com UsePAM yes .

    
por 17.07.2015 / 11:20
8

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

ServerAliveInterval 15
ServerAliveCountMax 5

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

    
por 17.07.2015 / 10:36
1

Você pode especificar as opções que 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á fazer o script.

    
por 04.12.2016 / 03:12
0

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

apt install lsh-server
apt remove openssh-server
    
por 03.08.2015 / 16:57