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

60

Eu estava pesquisando isso um pouco atrás e notei algumas maneiras, mas acredito que o Google não saiba tudo. Então, como você expulsa os usuários da sua caixa do Linux? Também como você vê que eles estão logados em primeiro lugar? e relacionado ... o seu método funciona se o usuário estiver logado em um X11 DE (não é um requisito que eu estou apenas curioso)?

    
por xenoterracide 18.08.2010 / 00:17

8 respostas

115

Há provavelmente uma maneira mais fácil, mas eu faço isso:

  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. Ria da sua desconexão iminente (este passo é opcional, mas encorajado)

    > 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 dando who o -u flag; o PID é o número para a 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)
    
por 18.08.2010 / 01:00
30

Como Micheal já apontou, você pode usar who para descobrir quem está logado. No entanto, se eles têm 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.

    
por 18.08.2010 / 01:43
21

Necromancia!

Eu aprecio o humor da resposta aceita, mas profissionalmente não posso advogar isso.

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 para o sshd ocioso do usuário para simular sua conexão sendo perdida, o que desencadeia uma limpeza de todo o ambiente do shell (incluindo shells filho) ou envia isso para shells aninhadas específicas (digamos, aquelas dentro de um multiplexador de terminal desconectado estão impedindo você de desmontar um sistema de arquivos) se quiser ser realmente preciso.

Usando write para enviar mensagens para ptys terminais e inativos antes de inicializá-los, é um divertido passatempo.

    
por 08.01.2013 / 00:45
12

Efetue logout do usuário 'username':

skill -KILL -u username

Veja man skill

    
por 18.08.2010 / 03:05
11

Outro comando útil é pkill here 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.

    
por 18.08.2010 / 02:14
3

Primeiramente, isso indica um problema maior. Se você tem usuários que não confia em seu sistema, provavelmente deve nivelá-lo e refazer a imagem.

Com isso em mente, você pode fazer algumas ou todas as ações a seguir:

# set up the environment
$ BADUSER=foo # where foo is the username in question
$ USERLINE=$(grep '^${BADUSER}:' /etc/passwd)
$ BADUID=$(echo ${USERLINE} | awk -F: '{print $3}')
$ BADGID=$(echo ${USERLINE} | awk -F: '{print $4}')
$ BADHOMEDIR=$(echo ${USERLINE} | awk -F: '{print $6}')
$ BDIR="~/backup/home-backup/"
$ TSTAMP=$(date +%F)
$ TAR_FILENAME="${BADUSER}-${TSTAMP}.tar.bz2"
$ OWNED_FILENAME="${BADUSER}-files-${TSTAMP}.txt"

# disable the user's future login
$ sudo chsh -s /bin/false "${BADUSER}"

# kill all of the user's processes
$ BADPROCS=$(ps auwx | grep '^${BADUSER} ' | awk '{print $2}')
$ sudo kill -9 ${BADPROCS}

# back up/clear the user's home directory
$ mkdir -p ${BDIR}
$ sudo tar -cfj ${BDIR}/${TAR_FILENAME} ${BADHOMEDIR}
$ sudo rm -rf ${BADHOMEDIR}/.* ${BADHOMEDIR}/*

# find all files owned by user
$ sudo find / -user ${BADUSER} > ~/backup/${OWNED_FILENAME}

# remove user
$ sudo userdel ${BADUSER}
    
por 19.08.2010 / 21:29
0

Na minha opinião, não é realmente útil usar killall -u username , porque se ele é o mesmo usuário que você, você vai se chutar. Então kill o processo será uma solução melhor.

    
por 16.09.2013 / 10:36
0

Eu olhei ao redor e não consegui encontrar um único script para automatizar essa tarefa.

Assim, com base nas soluções propostas aqui, misturei tudo em um script Bash interativo que lista os usuários e as sessões de who -u para o usuário escolher o que fazer.

Você pode então:

  • elimina todas as sessões de um usuário %código%
  • mate uma sessão específica %código%

Todas as informações necessárias vêm de killall -u <username> -HUP e, em seguida, são analisadas usando kill <PID> e who -u .

Eu adicionarei a possibilidade de enviar uma mensagem usando mapfile mais tarde (forking o processo com um atraso).

Eu provavelmente adicionarei a opção para matar uma sessão específica com awk também. Mas eu não tive problemas com apenas write 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 aprender mais sobre como estou fazendo isso de maneira automatizada:

por 30.09.2016 / 13:23