it-swarm.it

Come si espelle un utente benigno dal sistema?

Stavo cercando su Google un po 'di tempo fa e ho notato un paio di modi, ma suppongo che Google non sappia tutto. Quindi, in che modo t estrai gli utenti dal tuo box Linux? anche come fai a vedere che sono connessi in primo luogo? e correlati ... il tuo metodo funziona se l'utente ha effettuato l'accesso a un X11 DE (non è un requisito, sono solo curioso)?

68
xenoterracide

Probabilmente c'è un modo più semplice, ma lo faccio:

  1. Guarda chi ha effettuato l'accesso al tuo computer - usa who o w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Cerca l'ID del processo della Shell a cui è collegato il TTY:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Ridi della loro imminente disconnessione (questo passaggio è facoltativo, ma incoraggiato)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Uccidi il processo corrispondente:

    > kill -9 30737
    

Ho appena scoperto che puoi combinare i passaggi 1 e 2 dando a who il -u bandiera; il PID è il numero sulla destra:

> 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

Come già sottolineato da Micheal, puoi usare who per scoprire chi ha effettuato l'accesso. Tuttavia, se hanno più processi, c'è un modo più conveniente che uccidere ogni processo singolarmente: puoi usare killall -u username per terminare tutti i processi di quell'utente.

33
sepp2k

Negromanzia!

Apprezzo l'umorismo della risposta accettata, ma professionalmente non posso sostenerla.

Il metodo più grazioso di cui sono a conoscenza è inviare un -HUP a Shell per simulare un blocco dell'utente. Puoi inviarlo a sshd inattivo dell'utente per simulare la perdita della connessione, il che innesca una ripulitura dell'intero ambiente Shell (comprese le shell secondarie) o inviarlo a shell nidificate specifiche (ad esempio, quelle che si trovano all'interno di un multiplexer terminale disconnesso che ti impediscono di smontare un filesystem) se vuoi essere davvero preciso.

Utilizzando write per inviare messaggi a pty inattivi prima di avviarli è un hobby divertente però.

23
Andrew B

Disconnetti l'utente "nome utente":

skill -KILL -u username

Vedi man skill

13
bsd

Un altro comando utile è pkill qui pkill -u username && pkill -9 -u username. killall ha lo svantaggio che su Solaris IIRC significa qualcosa di completamente diverso - anche pkill ha opzioni leggermente più avanzate.

11
Maciej Piechotka

Innanzitutto, questo indica un problema più grande. Se hai utenti di cui non ti fidi sul tuo sistema, probabilmente dovresti livellarlo e ri-immagine.

Tenendo presente ciò, puoi eseguire alcune o tutte le seguenti operazioni:

 # imposta l'ambiente 
 $ BADUSER = foo # dove foo è il nome utente in questione 
 $ 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 = $ (data +% F) 
 $ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2" 
 $ OWNED_FILENAME = "$ {BADUSER } -files - $ {TSTAMP} .txt "
 
 # disabilita l'accesso futuro dell'utente 
 $ Sudo chsh -s/bin/false" $ {BADUSER} "
 
 # uccide tutti i processi dell'utente 
 $ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}') 
 $ Sudo kill -9 $ {BADPROCS} 
 
 # Esegue il backup/cancella la home directory dell'utente 
 $ Mkdir -p $ {BDIR} 
 $ Sudo tar -cfj $ {BDIR}/$ {TAR_FILENAME} $ {BADHOMEDIR} 
 $ Sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR}/* 
 
 # Trova tutti i file di proprietà dell'utente [.__ __.] $ Sudo trova/-user $ {BADUSER}> ~/backup/$ {OWNED_FILENAME} 
 
 # Rimuovi utente 
 $ Sudo userdel $ {BADUSER} 
3
cjac

Mi sono guardato intorno e non sono riuscito a trovare un singolo script per automatizzare questo compito.

Quindi, sulla base delle soluzioni qui proposte, ho mescolato tutto in no script Bash interattivo che elenca gli utenti e le sessioni da who -u per l'utente di scegliere cosa fare.

È quindi possibile:

  • uccidere tutte le sessioni per un utente killall -u <username> -HUP
  • uccidere una sessione specifica kill <PID>

Tutte le informazioni richieste provengono da who -u e quindi analizzato usando mapfile e awk.

Aggiungerò la possibilità di inviare un messaggio usando write più tardi (rinviando il processo con un ritardo).

Probabilmente aggiungerò l'opzione per terminare una sessione specifica con kill -9 anche. Ma non ho avuto problemi con solo kill e come indicato da altri, kill -9 dovrebbe essere evitato, se possibile.

Puoi controllare il codice su github se vuoi provarlo o saperne di più su come lo sto facendo in modo automatizzato:

0
Gus Neves

Secondo me, non è davvero utile usare killall -u username perché se è lo stesso utente di te, ti darai il calcio d'inizio. Quindi kill il processo sarà una soluzione migliore.

0
Mailo

Quindi, come togliete gli utenti [benigni] dalla vostra scatola di Linux?

Alla fine si tratta di identificare e terminare quei processi che sono di proprietà, associati o generati da un ID utente. Qualunque sia il comando che usi per raggiungere l'obiettivo finale, non importa necessariamente finché ci arrivi.

Fondamentalmente due risposte ...

Opzione A: causa la disconnessione di detto utente, per la quale ha sempre e comunque molti accessi. Quindi questo significherebbe identificare quei processi che sono di proprietà di un utente, rintracciabili da uid e classificati come parte di alcuni processi di login per la data distribuzione di Linux che stai eseguendo. Renditi conto che ci sono processi padre come SSH o VNC prima del "login" e processi figlio come GDM dopo il "login" Normalmente uccidere un processo genitore ucciderà il processo figlio, ma non sempre. Quindi vorresti uccidere questi altri processi che ovviamente non sono più necessari dopo il logout. Nel fare tutto ciò, ciò manterrebbe i lavori in background in esecuzione ... perché è un utente benigno e forse vuoi solo disconnetterli. Per quanto ne so, /usr/bin/w e /usr/bin/who segnalerà chi ha superato il processo di accesso.

opzione B: termina completamente tutti i processi di proprietà di uno specifico uid, il che significherebbe semplicemente l'uccisione di tutti i processi di proprietà di tale utente, questo li disconnetterebbe anche se fossero connessi. eliminali dal sistema . Deve solo essere un semplice ps -ef | grep <uid> e quindi terminare tutti quei processi in qualunque modo è accettabile.

in seguito in SLES 11 riporta

abilità dell'uomo ... Questi strumenti sono probabilmente obsoleti e non portabili. La sintassi del comando è mal definita. Prendi invece in considerazione l'utilizzo dei comandi killall, pkill e pgrep.

kill -9 FTW!

0
ron