web-dev-qa-db-fra.com

Comment expulsez-vous un utilisateur bénin de votre système?

J'ai fait une recherche sur Google il y a un peu et j'ai remarqué plusieurs façons, mais je suppose que Google ne sait pas tout. Alors, comment vous donnez-vous un coup de pied aux utilisateurs de votre boîte Linux? aussi comment allez-vous voir qu'ils sont connectés en premier lieu? et connexes ... votre méthode fonctionne-t-elle si l'utilisateur est connecté à un X11 DE (pas une exigence, je suis juste curieux)?

68
xenoterracide

Il y a probablement un moyen plus simple, mais je fais ceci:

  1. Voyez qui est connecté à votre machine - utilisez who ou w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Recherchez l'ID de processus du Shell auquel leur TTY est connecté:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Riez de leur déconnexion imminente (cette étape est facultative, mais encouragée)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Tuez le processus correspondant:

    > kill -9 30737
    

Je viens de découvrir que vous pouvez combiner les étapes 1 et 2 en donnant à who le -u drapeau; le PID est le nombre à droite:

> 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

Comme Micheal l'a déjà souligné, vous pouvez utiliser who pour savoir qui est connecté. Cependant, s'ils ont plusieurs processus, il existe un moyen plus pratique que de tuer chaque processus individuellement: vous pouvez utiliser killall -u username pour tuer tous les processus de cet utilisateur.

33
sepp2k

Nécromancie!

J'apprécie l'humour de la réponse acceptée, mais professionnellement, je ne peux pas la défendre.

La méthode la plus gracieuse que je connaisse consiste à envoyer un -HUP au shell pour simuler le raccrochage d'un utilisateur. Vous pouvez l'envoyer au sshd inactif de l'utilisateur pour simuler la perte de sa connexion, ce qui déclenche un nettoyage de l'environnement Shell entier (y compris les shells enfants), ou l'envoyer à des shells imbriqués spécifiques (par exemple, ceux qui se trouvent à l'intérieur d'un multiplexeur de terminal déconnecté qui vous empêchent de démonter un système de fichiers) si vous voulez être vraiment précis.

Utiliser write pour envoyer des messages à des ptys inactifs avant de les démarrer est un passe-temps amusant cependant.

23
Andrew B

Déconnectez-vous de l'utilisateur 'nom d'utilisateur':

skill -KILL -u username

Voir man skill

13
bsd

Une autre commande utile est pkill ici pkill -u username && pkill -9 -u username. killall a l'inconvénient que sous Solaris IIRC cela signifie quelque chose de complètement différent - également pkill a des options légèrement plus avancées.

11
Maciej Piechotka

Tout d'abord, cela indique un problème plus important. Si vous avez des utilisateurs auxquels vous ne faites pas confiance sur votre système, vous devriez probablement le mettre à niveau et réimaginer.

Dans cet esprit, vous pouvez effectuer tout ou partie des opérations suivantes:

 # configurer l'environnement 
 $ BADUSER = foo # où foo est le nom d'utilisateur en question 
 $ USERLINE = $ (grep '^ $ {BADUSER}:'/etc/passwd ) 
 $ BADUID = $ (echo $ {USERLINE} | awk -F: '{print $ 3}') 
 $ BADGID = $ (echo $ {USERLINE} | awk -F: '{ imprimer $ 4} ') 
 $ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F:' {imprimer $ 6} ') 
 $ BDIR = "~/backup/home-backup /" 
 $ TSTAMP = $ (date +% F) 
 $ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2" 
 $ OWNED_FILENAME = "$ {BADUSER } -files - $ {TSTAMP} .txt "
 
 # désactiver la future connexion de l'utilisateur 
 $ Sudo chsh -s/bin/false" $ {BADUSER} "
 
 # tue tous les processus de l'utilisateur 
 $ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}') 
 $ Sudo kill -9 $ {BADPROCS} 
 
 # Sauvegarder/effacer le répertoire personnel de l'utilisateur 
 $ Mkdir -p $ {BDIR} 
 $ Sudo tar -cfj $ {BDIR}/$ {TAR_FILENAME} $ {BADHOMEDIR} 
 $ Sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR}/* 
 
 # Rechercher tous les fichiers appartenant à l'utilisateur [.__ __.] $ Sudo find/-user $ {BADUSER}> ~/backup/$ {OWNED_FILENAME} 
 
 # Supprimer l'utilisateur 
 $ Sudo userdel $ {BADUSER} 
3
cjac

J'ai regardé tout autour et n'ai pas pu trouver un seul script pour automatiser cette tâche.

Donc, sur la base des solutions proposées ici, j'ai tout mélangé dans n script Bash interactif qui répertorie les utilisateurs et les sessions de who -u pour que l'utilisateur choisisse quoi faire.

Vous pouvez alors soit:

  • tuer toutes les sessions pour un utilisateur killall -u <username> -HUP
  • tuer une session spécifique kill <PID>

Toutes les informations requises proviennent de who -u et est ensuite analysé à l'aide de mapfile et awk.

J'ajouterai la possibilité d'envoyer un message en utilisant write plus tard (en forçant le processus avec un retard).

Je vais probablement ajouter l'option de tuer une session spécifique avec kill -9 ainsi que. Mais je n'ai eu aucun problème avec juste kill et comme indiqué par d'autres, kill -9 doit être évité si possible.

Vous pouvez vérifier le code sur github si vous voulez l'essayer ou en savoir plus sur la façon dont je le fais de manière automatisée:

0
Gus Neves

À mon avis, il n'est pas vraiment utile d'utiliser killall -u username car si c'est le même utilisateur que vous, vous vous lancerez. Donc kill le processus sera une meilleure solution.

0
Mailo

Alors, comment pouvez-vous lancer des utilisateurs [bénins] hors de votre boîte Linux?

En fin de compte, il s'agit d'identifier et de mettre fin aux processus qui sont détenus, associés ou générés à partir d'un identifiant utilisateur. Quelles que soient les commandes que vous utilisez pour atteindre cet objectif final, cela n'a pas nécessairement d'importance tant que vous y arrivez.

Fondamentalement, deux réponses ...

Option A: provoquant une déconnexion dudit utilisateur, pour lequel et toujours autant de connexions qu'ils ont. Donc, cela signifierait identifier les processus appartenant à un utilisateur, traçables par uid et classés dans le cadre d'un processus de connexion pour la distribution linux donnée que vous exécutez. Sachez qu'il existe des processus parents tels que SSH ou VNC avant la "connexion" et des processus enfants tels que GDM après la "connexion". La suppression d'un processus parent entraîne généralement la suppression du processus enfant, mais pas toujours. Vous voudrez donc tuer ces autres processus qui ne sont évidemment plus nécessaires après la déconnexion. En faisant tout cela, cela maintiendrait les tâches d'arrière-plan en cours d'exécution ... car c'est un utilisateur bénin et peut-être que vous voulez simplement les déconnecter. Pour autant que je sache, /usr/bin/w et /usr/bin/who indiquera qui a franchi le processus de connexion.

option B: terminer complètement tous les processus appartenant à un uid spécifique, ce qui signifierait simplement tuer tous les processus appartenant à cet utilisateur, cela les déconnecterait également s'ils étaient connectés. les expulser du système . Cela ne doit être qu'un simple ps -ef | grep <uid> puis mettre fin à tous ces processus de quelque manière que ce soit est acceptable.

fwiw dans SLES 11, il rapporte

l'homme de compétence ... Ces outils sont probablement obsolètes et non transférables. La syntaxe de commande est mal définie. Pensez à utiliser les commandes killall, pkill et pgrep à la place.

kill -9 FTW!

0
ron