ti-enxame.com

Como você expulsa um usuário benigno do seu sistema?

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)?

68
xenoterracide

Provavelmente existe uma maneira mais fácil, mas eu faço o seguinte:

  1. 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)
    
  2. 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
    
  3. Rir da desconexão iminente (esta etapa é opcional, mas incentivada)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. 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)
147
Michael Mrozek

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.

33
sepp2k

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.

23
Andrew B

Efetue logout do usuário 'nome de usuário':

skill -KILL -u username

Vejo man skill

13
bsd

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.

11
Maciej Piechotka

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} 
3
cjac

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:

  • mata todas as sessões para um usuário killall -u <username> -HUP
  • matar uma sessão específica 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:

0
Gus Neves

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.

0
Mailo

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!

0
ron