Eu estava pesquisando isso um pouco atrás e notei algumas maneiras, mas acho que o Google não sabe tudo. Então, como você inicia usuários da sua caixa Linux? Além disso, como você vê que eles estão conectados em primeiro lugar? e relacionados ... o seu método funciona se o usuário estiver conectado a um X11 DE (não é um requisito que estou curioso)?
Provavelmente existe uma maneira mais fácil, mas eu faço o seguinte:
Veja quem está conectado à sua máquina - use who
ou w
:
> who
mmrozek tty1 Aug 17 10:03
mmrozek pts/3 Aug 17 10:09 (:pts/2:S.0)
Procure o ID do processo do Shell ao qual o TTY está conectado:
> ps t
PID TTY STAT TIME COMMAND
30737 pts/3 Ss 0:00 zsh
Rir da desconexão iminente (esta etapa é opcional, mas incentivada)
> echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
Mate o processo correspondente:
> kill -9 30737
Acabei de descobrir que você pode combinar as etapas 1 e 2 fornecendo who
o -u
flag; o PID é o número à direita:
> who -u
mmrozek tty1 Aug 17 10:03 09:01 9250
mmrozek pts/18 Aug 17 10:09 01:46 19467 (:pts/2:S.0)
Como Micheal já apontou, você pode usar who
para descobrir quem está conectado. No entanto, se eles tiverem vários processos, há uma maneira mais conveniente do que matar cada processo individualmente: você pode usar killall -u username
para matar todos os processos por esse usuário.
Necromancia!
Aprecio o humor da resposta aceita, mas profissionalmente não posso defendê-la.
O método mais elegante que conheço é enviar um -HUP para o Shell para simular um desligamento do usuário. Você pode enviar isso ao sshd inativo do usuário para simular a perda de conexão, o que aciona uma limpeza de todo o ambiente do Shell (incluindo shells filhos) ou enviá-lo para shells aninhados específicos (por exemplo, aqueles configurados dentro de um multiplexador de terminal desconectado que impedem que você desmonte um sistema de arquivos) se você quiser ser realmente preciso.
Usando write
para enviar mensagens para ptys terminais antes de inicializá-los é um hobby divertido.
Efetue logout do usuário 'nome de usuário':
skill -KILL -u username
Vejo man skill
Outro comando útil é pkill
aqui pkill -u username && pkill -9 -u username
. killall
tem a desvantagem de que no Solaris IIRC isso significa algo completamente diferente - também pkill
tem opções um pouco mais avançadas.
Primeiro de tudo, isso indica um problema maior. Se você possui usuários em quem não confia no seu sistema, provavelmente deve nivelá-lo e criar uma nova imagem.
Com isso em mente, você pode executar algumas ou todas as seguintes ações:
# configurar o ambiente $ BADUSER = foo # em que foo é o nome de usuário em questão $ USERLINE = $ (grep '^ $ {BADUSER}:'/etc/passwd ) $ BADUID = $ (eco $ {USERLINE} | awk -F: '{print $ 3}') $ BADGID = $ (eco $ {USERLINE} | awk -F: '{ print $ 4} ') $ BADHOMEDIR = $ (eco $ {USERLINE} | awk -F:' {print $ 6} ') $ BDIR = "~/backup/home-backup /" $ TSTAMP = $ (data +% F) $ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2" $ OWNED_FILENAME = "$ {BADUSER } -files - $ {TSTAMP} .txt " # desativar o logon futuro do usuário $ Sudo chsh -s/bin/false" $ {BADUSER} " # interrompe todos os processos do usuário $ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}') $ Sudo kill -9 $ {BADPROCS} # Faça backup/limpe o diretório pessoal do usuário $ Mkdir -p $ {BDIR} $ Sudo tar -cfj $ {BDIR}/$ {TAR_FILENAME} $ {BADHOMEDIR} $ Sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR}/* # Encontre todos os arquivos de propriedade do usuário [.__ __.] $ Sudo find/-user $ {BADUSER}> ~/backup/$ {OWNED_FILENAME} # Remover usuário $ Sudo userdel $ {BADUSER}
Eu olhei ao redor e não consegui encontrar um único script para automatizar esta tarefa.
Então, com base nas soluções propostas aqui, misturei tudo em m script interativo do Bash que lista os usuários e as sessões de who -u
para o usuário escolher o que fazer.
Você pode:
killall -u <username> -HUP
kill <PID>
Todas as informações necessárias vêm de who -u
e é analisado usando mapfile
e awk
.
Adicionarei a possibilidade de enviar uma mensagem usando write
mais tarde (bifurcando o processo com um atraso).
Provavelmente vou adicionar a opção de matar uma sessão específica com kill -9
também. Mas não tive problemas com apenas kill
e como apontado por outros, kill -9
deve ser evitado, se possível.
Você pode verificar o código no github se quiser experimentá-lo ou saber mais sobre como estou fazendo isso de maneira automatizada:
Na minha opinião, não é realmente útil usar killall -u username
porque se é o mesmo usuário que você, você se dará bem. Então kill
o processo será uma solução melhor.
Então, como você expulsa os usuários [benignos] da sua caixa Linux?
No final, tudo se resume a identificar e finalizar os processos pertencentes, associados ou gerados a partir de um ID do usuário. Quaisquer comandos que você use para atingir esse objetivo final não importam necessariamente desde que você chegue lá.
Basicamente duas respostas ...
Opção A: causando um logout do referido usuário, para o qual sempre e no entanto muitos logons que eles possuam. Portanto, isso significaria identificar os processos que pertencem a um usuário, rastreáveis pelo uid e classificados como parte de algum processo de login para a distribuição Linux que você está executando. Perceba que existem processos pai como SSH ou VNC antes do "login" e processos filhos como GDM após o "login" Normalmente, matar um processo pai mata o processo filho, mas nem sempre. Portanto, você deseja eliminar esses outros processos que obviamente não são mais necessários após o logout. Ao fazer tudo isso, isso manteria os trabalhos em segundo plano em execução ... porque é um usuário benigno e talvez você queira apenas desconectá-los. Até onde sei, /usr/bin/w
e /usr/bin/who
relatará quem passou pelo processo de logon.
opção B: encerra completamente todos os processos pertencentes a um uid específico, o que significaria simplesmente matar todo e qualquer processo pertencente ao referido usuário, isso também os desconectaria se eles estivessem logados. Isso satisfaria a expulse-os do sistema . Isso só precisa ser um simples ps -ef | grep <uid>
e finalizando todos esses processos da maneira que for aceitável.
fwiw no SLES 11 informa
habilidade do homem ... Essas ferramentas são provavelmente obsoletas e não portáveis. A sintaxe do comando está mal definida. Considere usar os comandos killall, pkill e pgrep.
kill -9
FTW!