565 votes

Recharger les affectations de groupe d'un utilisateur Linux sans se déconnecter

Lors de l'affectation de la liste de groupes secondaires d'un utilisateur en utilisant :

# usermod -G <grouplist> <user>

est-il possible de forcer cette affectation de groupe à prendre effet sans déconnecter toutes les sessions en cours ?

Cela serait très utile dans la situation où une Écran existe avec de nombreux shells en cours d'exécution, car la session entière doit être détruite pour que l'affectation de groupe prenne effet.

Je pense que je peux changer le groupe primaire de l'utilisateur dans un Shell en cours d'exécution en utilisant la commande newgrp commande - existe-t-il une alternative qui fonctionnerait pour les groupes secondaires ?

Idéalement, je voudrais quelque chose qui prenne effet dans chaque Shell sans être exécuté manuellement dans chacun d'eux, mais à défaut, peut-être un moyen de forcer Screen à exécuter la même commande dans chacun.

0 votes

Je sais qu'au moins pour certains gestionnaires de fenêtres/sessions, il est possible de le faire de telle sorte que la session récupère le nouveau groupe et qu'il soit disponible pour tout nouveau processus lancé à partir des menus, des boutons du panneau ou autre. Je viens juste de venir ici pour retrouver cette information, donc je ne peux pas dire maintenant comment faire, et c'est probablement spécifique au gestionnaire de fenêtres.

605voto

theKing Points 320

Depuis l'intérieur d'un Shell, vous pouvez lancer la commande suivante

su - $USER

id va maintenant lister le nouveau groupe :

id

6 votes

Je pense que c'est la meilleure approche dans de nombreux cas, mais le posteur original voulait mettre à jour plusieurs shells dans une session d'écran. Cette solution devrait être faite à partir de chaque Shell.

4 votes

La solution originale ne fixerait également qu'une seule session Shell à l'écran. Je viens de le tester. La raison pour laquelle cette solution fonctionne est que vous générez une nouvelle session complète plutôt que d'hériter de l'environnement d'origine.

2 votes

Vous pouvez rendre la commande légèrement plus générique comme suit : su - $USER

298voto

Legooolas Points 5490

C'est très compliqué, mais vous pourriez utiliser deux couches de newgrp pour y parvenir pour un groupe particulier :

id -g

...vous donnera l'ID du groupe primaire actuel. Nous l'appellerons orig_group pour les besoins de cet exemple. Alors :

newgrp <new_group_name>

...vous fera passer à ce groupe en tant que groupe principal et l'ajoutera à la liste des groupes retournés par groups o id -G . Maintenant, un autre :

newgrp <orig_group_name>

...vous obtiendrez un Shell dans lequel vous pouvez voir le nouveau groupe et le primaire est celui d'origine.

C'est horrible et cela ne vous permettra d'ajouter qu'un seul groupe à la fois, mais cela m'a aidé à plusieurs reprises pour ajouter des groupes sans avoir à ouvrir une session X complète (par exemple, pour que fuse soit ajouté comme groupe à un utilisateur afin que sshfs fonctionne).

Notes :

  • Cela ne vous oblige pas non plus à taper votre mot de passe, ce qui su 意志

  • Chaque appel à newgrp lance une nouvelle Shell (comme enfant de la Shell actuelle)

  • Le Shell actuel peut être "remplacé" par le exec commande

    exec newgrp <new_group_name>
  • 使用方法 exec résoudra le problème de la mise en cache pour la branche actuelle du fichier pstree

    C'est-à-dire que si vous êtes connecté à un gestionnaire de fenêtres, chaque nouveau terminal que vous lancez sera un enfant d'une branche antérieure à celle "corrigée" par cet exercice et héritera donc de la carte gid mise en cache.

3 votes

Sur Fedora, j'ai dû faire newgrp $USER au lieu de newgrp <orig_group> . Cela signifie que je n'ai pas eu à retrouver l'ID de mon groupe primaire d'origine, ce qui est encore plus facile que cette solution.

0 votes

Cela ne nécessite pas non plus de mot de passe, ce que fait su.

4 votes

J'ai trouvé que c'était suffisant pour faire newgrp <new group name> . C'était Ubuntu 14.04

246voto

Melly Points 1

Cette astuce astucieuse de ce lien fonctionne très bien !

exec su -l $USER

Je me suis dit que j'allais le poster ici car à chaque fois que j'oublie comment faire, c'est le premier lien qui apparaît dans Google.

33 votes

+1 pour ne pas mettre l'utilisateur dans un sous-shell ; vous pouvez vous déconnecter/se retirer comme d'habitude avec ceci. De plus, si NOPASSWD : est défini dans /etc/sudoers, vous pouvez utiliser à la place exec sudo su -l $USER pour éviter d'être invité à saisir un mot de passe.

34 votes

Attention : on vous demandera un mot de passe sudo. Si vous vous trompez, votre terminal se fermera.

1 votes

@TylerCollier Ivan a fait mention NOPASSWD:

51voto

Patrick Conheady Points 531

1. Obtenir un Shell avec le nouveau groupe sans se déconnecter et se reconnecter à nouveau.

Si vous n'ajoutez qu'un seul groupe, j'ai utilisé ce qui suit :

exec sg <new group name> newgrp `id -gn`

Il s'agit d'une variante de l'astuce newgrp à deux niveaux de Legooolas, mais elle se fait en une seule ligne et ne nécessite pas d'entrer manuellement votre groupe primaire.

sg est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le site exec signifie que le nouveau Shell remplace le Shell existant, de sorte que vous n'avez pas besoin de vous "déconnecter" deux fois.

Contrairement à l'utilisation de su, vous n'avez pas besoin de taper votre mot de passe. Il ne rafraîchit pas non plus votre environnement (autre que l'ajout du groupe), vous conservez donc votre répertoire de travail actuel, etc.

2. Exécution de la commande dans toutes les fenêtres d'écran d'une session

El at dans Screen exécute une commande dans le Windows que vous spécifiez (notez qu'il s'agit d'une commande Screen, pas d'une commande Shell).

Vous pouvez utiliser la commande suivante pour envoyer la commande à toutes les sessions Screen existantes :

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

Notez la nécessité d'échapper les backticks pour obtenir id pour l'exécuter dans la session Screen, et ^M pour que Screen appuie sur 'enter' à la fin de votre commande.

Notez également que l'écran stuff tape simplement le texte de la commande à votre place. Par conséquent, quelque chose d'étrange peut se produire si l'un des Windows de l'écran a une commande à moitié écrite à une invite de commande ou exécute une application autre qu'un Shell (par exemple emacs, top). Si c'est un problème, j'ai quelques idées :

  • Pour se débarrasser d'une commande à moitié écrite, vous pouvez ajouter "^C" au début de la commande.
  • Pour éviter de lancer la commande dans une fenêtre emacs, etc, vous pouvez demander à `at' de filtrer sur le titre de la fenêtre etc (dans l'exemple ci-dessus, j'utilise "#", qui correspond à toutes les fenêtres, mais vous pouvez filtrer par titre de fenêtre, utilisateur, etc).

Pour exécuter la commande dans une fenêtre spécifique (identifiée par le numéro de la fenêtre), utilisez ce qui suit :

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

4 votes

Très belle réponse. Petite correction : sg s'attend à ce que la commande soit un argument unique, et ignore les arguments supplémentaires (essayez sg some_group echo test ). Ainsi, sg new_group_name newgrp `id -gn` est en fait équivalent à sg new_group_name newgrp . La raison pour laquelle cela semble fonctionner est que lorsque newgrp est invoqué sans arguments, il utilise le groupe par défaut dans /etc/passwd, qui correspond généralement au groupe actuel. La solution consiste à citer la commande : sg new_group_name "newgrp `id -gn`"

37voto

Pavan Vegirouthu Points 399

使用方法 newgrp La commande a résolu le problème pour moi :

newgrp <GroupName>

Cet article de blog a une explication détaillée.

0 votes

C'est la meilleure réponse ! !!

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X