Encerrar sessões SSH descartadas

47

Minhas sessões SSH parecem estar caindo, mas esse não é o meu maior problema - o principal problema é que minhas sessões anteriores ainda estão vivas, pior ainda, uma delas está em execução, visudoimpedindo-me de acessá-la!

who mostra várias sessões, todas, exceto a atual, que sei que foram desconectadas. Como posso encerrar as antigas para liberar seus recursos?

markmnl
fonte
11
Se você está bem em matar tudo em um terminal específico, você pode fazer algo parecido fuser -k /dev/pts/0ou qualquer outro terminal que esteja aparecendo na whosaída. Um pouco estranho todos aqueles que ignoraram SIGHUP, no entanto. Eles estavam correndo em uma screensessão ou algo assim?
Bratchley
Recebo: Não foi possível eliminar o processo 1031: Não existe esse processo. nada de especial apenas usando SSH no uso do PuTTY - acho que meu novo roteador é agressivo ao eliminar conexões inativas - embora eu achasse que a outra extremidade teria feito algo assim que a conexão TCP terminar - talvez ainda não saiba?
MarkMnl #
11
ATUALIZE esse comando está funcionando para os outros usuários (não há whomais 0 ), obrigado!
MarkMnl #
"Mas minhas sessões SSH parecem estar caindo ... o grande problema é que minhas sessões anteriores ainda estão vivas" é um pouco contraditório. Eles foram desconectados ou ainda estão conectados. Talvez você deva explicar como chegou a essa conclusão de forma a ter sido desconectado e depois se conectar novamente e perceber que sua conexão antiga ainda está em execução.
goldilocks

Respostas:

58

Para resolver o problema imediato, que o arquivo sudoers está bloqueado, você pode simplesmente excluir o arquivo de bloqueio. Geralmente será `/etc/sudoers.tmp"; verifique a página de manual do visudo para verificar. Se você excluir o arquivo de bloqueio, poderá executar o visudo novamente.

Para excluir todas as sessões que ainda estão suspensas, primeiro descubra o detalhe da sua própria sessão atual. Então, se seu próprio pid for 12345, faça

ps -ef | grep sshd | grep -v root | grep -v 12345 | grep -v grep | awk '{print "sudo kill -9", $2}' |sh 

Você pode fazer isso sem o | shprimeiro final apenas para verificar os PIDs que planeja matar.

Se você estiver no Linux, poderá usar

pkill -o -u YOURUSERNAME sshd

para matar sua sessão SSH mais antiga. Continue fazendo isso até que sua sessão atual seja a única.

Você também pode querer definir ServerAliveInterval 15em sua .ssh/configpara enviar uma mensagem keepalive a cada 15 segundos quando nenhum dado foi enviado. man ssh_configPara maiores informações.

Jenny D
fonte
11
No CentOS - Se você estiver executando o SSH na conta root, esta resposta não funcionará, tente usar o seguinte: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Ali Nadalizadeh
Obrigado. Isso funciona. Não estou claro sobre qual finalidade serve grep -v 12345parte da sintaxe? passar tudo o que não contém 12345?
Senhor Loh.
grep -v 12345significa "remover qualquer linha correspondente 12345da correspondência". Portanto, você deve primeiro identificar o PID da sua própria sessão e usá-lo em vez de 12345.
Jenny D
Depois de encerrar todas essas sessões e renunciar, comandar whoou topainda mostrar o número antigo de usuários assinados, mesmo ele deve mostrar apenas 1. Como isso pode ser forçado a ser atualizado?
Egamega
2

Se você listar processos para ver seus comandos e argumentos (como por exemplo, ps -fprocps), deverá ver os processos sshd chamados, por exemplo:

sshd: user@pts/7

O terminal ( pts/7) é a parte principal aqui - se você o comparar com o terminal atual ( tty), poderá ver qual é a sua sessão ativa. É claro que existem outras maneiras de fazer isso (como examinar o PID do shell em execução no momento e localizá-lo na árvore de processos), mas essa é provavelmente a mais fácil. Você pode usar algo nesse sentido:

# current tty name
TTY=$(tty | cut -f3- -d/)
# PIDs of other sshd processes
ps -o pid= -o command= -C sshd \
    | grep sshd:.*@ \
    | grep -v "@$TTY" \
    | sed "s/ sshd.*//"

Você pode alimentar os PIDs para matar, xargsmas sempre certifique-se de não matar o sshdprocesso principal que lida com novas conexões .

Em uma nota relacionada, lembre-se de que geralmente analisa a pssaída que está sujeita a erros (especialmente em vários sistemas) devido à variabilidade de seus formatos de saída (aqui mitigados em grande parte pelo uso de -o pid= -o command=).

peterph
fonte
1

Isso matará as sessões suspensas por mais de 2 dias. Pode ser colocado como um cron.

for i in `w|awk '{print $2,$5}'|grep days|cut -d' ' -f1`; do fuser -k /dev/$i; done

Isso matará todos, exceto a sua (última sessão ativa). Execute isso no terminal.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Assustador
fonte