web-dev-qa-db-fra.com

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 à l'aide de:

# usermod -G <grouplist> <user>

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

Cela serait très utile dans le cas où un Screen session existe avec de nombreux shells en cours d'exécution, car la session entière doit être détruite pour que l'attribution de groupe prenne effet.

Je pense que je peux modifier le groupe principal de l'utilisateur dans un shell en cours d'exécution à l'aide de la commande newgrp - existe-t-il une alternative qui fonctionnerait pour les groupes secondaires?

Idéalement, je souhaiterais que quelque chose prenne effet dans chaque Shell sans être exécuté manuellement dans chaque, mais sans cela, peut-être une façon de forcer Screen à exécuter la même commande dans chacun.

312
Simon

Horriblement, mais vous pouvez utiliser deux couches de newgrp pour atteindre cet objectif pour un groupe particulier:

id -g

... vous donnera l'ID du groupe principal actuel. Nous appellerons ce orig_group aux fins de cet exemple. Ensuite:

newgrp <new group name>

... vous basculera vers ce groupe en tant que principal et l'ajoutera à la liste des groupes renvoyés par groups ou id -G. Maintenant, un autre:

newgrp <orig_group>

... vous obtiendrez un shell dans lequel vous pouvez voir le nouveau groupe et le principal est l’original.

C’est horrible et ne vous ajoutera qu’un groupe à la fois, mais cela m’a aidé plusieurs fois à obtenir l’ajout de groupes sans fermeture de session/dans toute ma session X (par exemple, pour que Fuse soit ajouté en tant que groupe à un utilisateur pour que sshfs fonctionne).

Edit: Cela ne vous oblige pas à taper votre mot de passe non plus, ce que su le fera.

188
Legooolas

Depuis un shell, vous pouvez lancer la commande suivante

su - $USER

id va maintenant lister le nouveau groupe:

id
331
stivlo

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

exec su -l $USER

Je pensais le poster ici car chaque fois que j'oublie comment faire cela, c'est le premier lien qui apparaît dans Google.

144
jhaagsma

1. Obtenir un shell avec le nouveau groupe sans vous déconnecter et vous reconnecter

Si vous ajoutez seulement un 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 couches de Legooolas, mais elle est sur une seule ligne et ne vous oblige pas à entrer manuellement votre groupe principal.

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

Contrairement à l'utilisation de su, vous n'avez pas besoin de saisir votre mot de passe. De plus, cela n’actualise pas 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

La commande at de Screen exécute une commande dans la fenêtre spécifiée (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 aux règles pour obtenir id dans la session Screen et ^ M pour que Screen tape 'entrée' à la fin de votre commande.

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

  • Pour vous débarrasser de toute commande à moitié écrite, vous pouvez ajouter "^ C" au début de la commande.
  • Pour éviter d'exécuter la commande dans une fenêtre emacs, etc., vous pouvez demander à «at» de filtrer 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 les éléments suivants:

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

Tu peux le faire.

Ajoutez autant de groupes que vous le souhaitez à l'aide de usermod -G. Ensuite, en tant qu'utilisateur ayant une session en cours d'exécution, exécutez newgrp - avec uniquement l'argument '-'.

Cela réinitialise l'ID de groupe à la valeur par défaut, mais cela définira également les groupes secondaires. Vous pouvez le vérifier en exécutant groups à partir de la session en cours, avant et après les usermod et newgrp.

Cela doit être exécuté à partir de chaque session ouverte - je ne connais pas grand chose à l'écran. Cependant, s'il est possible d'itérer toutes les sessions ouvertes et d'exécuter newgrp, vous devriez être bon. Vous n'aurez pas à vous soucier de connaître les groupes ou les identifiants de groupe.

Bonne chance à vous.

13
lunchmeat317

Les groupes sont généralement énumérés lors de la connexion. À ma connaissance, je ne parviens pas à le forcer à refaire l'énumération des groupes sans se déconnecter et y revenir.

Beaucoup de réponses votées ici semblent utiliser une solution de contournement qui invoque un nouveau shell avec un nouvel environnement (identique à la connexion à nouveau). Le Shell parent et tous les autres programmes en cours d'exécution ne recevront généralement pas la nouvelle appartenance au groupe tant qu'ils n'auront pas été ré-invoqués à partir d'un nouveau Shell, généralement après la déconnexion et la connexion.

12
Mister_Tom

Utiliser la commande newgrp a résolu le problème pour moi:

newgrp <GroupName>

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

12
Pavan Vegirouthu

Résumer:

exec newgrp <newlyaddedgroupname1>
exec newgrp <newlyaddedgroupname2>
...
exec newgrp -

Utiliser 'exec' signifie remplacer le Shell existant par le nouveau Shell démarré par la commande newgrp (vous devez donc quitter le nouveau Shell pour vous déconnecter).

Le newgrp - final est nécessaire pour restaurer votre groupe principal normal. Par conséquent, les fichiers que vous créez ultérieurement ont pour propriétaire.

Remarque: la question de l'affiche originale était de savoir comment rendre visibles les groupes nouvellement ajoutés dans les processus existants. Les commandes gpasswd et usermod n'affectent pas les processus existants; les groupes récemment ajoutés (ou supprimés!) apparaissent dans (disparaissent) de votre compte, c'est-à-dire dans les fichiers/etc/group et/etc/gshadow, mais les autorisations pour les processus existants ne sont pas modifiées. Pour supprimer autorisations, vous devez tuer tous les processus en cours; newgrp - ne relira pas/etc/group et ne réinitialisera pas la liste des groupes; au lieu de cela, il semble utiliser uniquement les groupes précédemment associés au processus.

4
jimav

J'ai eu le même problème, mais aussi pour les utilisateurs non connectés. Le redémarrage de nscd n'a pas aidé, mais l'exécution de cette commande a eu pour résultat: nscd -i group. Cela devrait indiquer à nscd (démon de mise en cache) de recharger le fichier de groupes.

1
Marki555

Un peu en retard pour la fête, gpasswd devrait faire le travail, sans créer une nouvelle session:

$ gpasswd -a user groupname

Vous pouvez modifier un groupe à la fois, bien que vous puissiez définir tous ses membres:

$ gpasswd -M user1,user2 groupname
0
Tombart

Je ne pouvais pas faire fonctionner la commande newgrp. Je ne sais pas si cela dépend de/etc/sudoers, mais je dois normalement taper mon mot de passe pour Sudo, et cela a fonctionné sans avoir besoin de mon mot de passe:

[leo60228@leonix:~]$ groups
users wheel

[leo60228@leonix:~]$ Sudo echo hi
[Sudo] password for leo60228:
hi

[leo60228@leonix:~]$ Sudo -k # reset Sudo timeout

[leo60228@leonix:~]$ exec Sudo -i -u $(whoami) # no password necessary

[leo60228@leonix:~]$ groups
users wheel docker
0
snuggles08

Cela fait l'affaire si vous avez Sudo et cela peut vous éviter de saisir votre mot de passe une fois de plus dans certains cas:

Sudo su $USER
0
guaka