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)?
Il y a probablement un moyen plus simple, mais je fais ceci:
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)
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
Riez de leur déconnexion imminente (cette étape est facultative, mais encouragée)
> echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
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)
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.
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.
Déconnectez-vous de l'utilisateur 'nom d'utilisateur':
skill -KILL -u username
Voir man skill
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.
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}
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:
killall -u <username> -HUP
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:
À 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.
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!