Terminar sessões SSH descartadas

41

Minhas sessões de SSH parecem estar caindo embora esse não seja meu grande problema - o maior problema é que minhas sessões anteriores ainda estão vivas, pior ainda, uma delas está executando visudo impedindo-me de acessá-lo!

who mostra um número de sessões todas, exceto a minha atual, que sei que foram desconectadas, como posso terminar as antigas para liberar seus recursos?

    
por markmnl 02.05.2014 / 15:42

3 respostas

50

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 para verificar se você excluir o arquivo de bloqueio, você pode executar o visudo novamente.

Para excluir todas as sessões que ainda estão pendentes, primeiro descubra o pid de sua própria sessão atual. Então, se o seu próprio pid é 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 querer fazer isso sem o | sh final primeiro, apenas para checar os PIDs que você está planejando matar.

Se você está no Linux, você pode 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 que resta.

Você também pode definir ServerAliveInterval 15 no seu .ssh/config para enviar uma mensagem de keepalive a cada 15 segundos quando nenhum dado for enviado. man ssh_config para mais informações.

    
por 02.05.2014 / 16:02
2

Se você listar os processos para ver o comando e os argumentos deles (como, por exemplo, ps -f do procps), deverá ver os processos sshd chamados, por exemplo:

sshd: user@pts/7

O terminal ( pts/7 ) é a parte chave aqui - se você compará-lo com o seu terminal atual ( tty ), você poderá ver qual é a sua sessão ativa. É claro que existem outras maneiras de fazer isso (como observar o PID do shell em execução no momento e localizá-lo na árvore de processos), mas esse é provavelmente o mais fácil. Você pode então usar algo ao longo destas linhas:

# 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 com xargs , mas sempre certifique-se de não matar o processo principal sshd que lida com novas conexões .

Em uma nota relacionada, esteja ciente de que analisar a saída ps é propenso 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= ) .

    
por 02.05.2014 / 16:55
0

Isso matará as sessões penduradas por mais de dois dias. Poderia 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 menos 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
    
por 13.10.2017 / 13:42

Tags