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

348

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ù une session Screen existe avec plusieurs shells en cours d'exécution, car la session entière doit essentiellement être détruite pour que l'attribution de groupe prenne effet.

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

Idéalement, je voudrais quelque chose qui prend 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 chaque.

Simon
la source
Je sais qu'au moins pour certains gestionnaires de fenêtres / sessions, il est possible de faire cela de manière à ce que la session récupère le nouveau groupe et qu'il soit disponible pour tout nouveau processus démarré à partir des menus, des boutons du panneau ou autre. Je viens d'arriver ici tout à l'heure, à la recherche de cette information. Je ne peux donc pas vous dire comment procéder. Cela est probablement lié au gestionnaire de fenêtres.
mc0e

Réponses:

205

Horriblement hacky, mais vous pouvez utiliser deux couches newgrppour y parvenir pour un groupe particulier:

id -g

... vous donnera l'ID du groupe principal actuel. Nous appellerons cela orig_groupaux 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 groupsou 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, l’ajout d’un fusible en tant que groupe à un utilisateur). de sorte que sshfs fonctionnera).

Edit: Cela ne vous oblige pas à taper votre mot de passe non plus, ce qui susera.

Legooolas
la source
6
Bon tour, j'aime bien
Simon
1
Sur Fedora, je devais faire newgrp $USERau lieu de newgrp <orig_group>. Cela signifie que je n'avais pas à trouver mon ID de groupe principal d'origine, c'est donc encore plus simple que cette solution.
Richard Turner
2
J'ai trouvé que c'était suffisant pour faire newgrp <new group name>. C'était Ubuntu 14.04
Edward Falk
4
@ EdwardFalk non, vous ne voulez pas (peut-être pas) laisser ce groupe en tant que votre principal ...
mimoralea
4
Notez que chacun newgrpcrée un nouveau shell, donc lorsque vous devez quitter complètement votre session, vous devez faire "exit exit exit" pour sortir complètement (:
jwd
371

A partir d'un shell, vous pouvez lancer la commande suivante

su - $USER

id va maintenant lister le nouveau groupe:

id
Stivlo
la source
3
Je pense que c'est la meilleure approche dans de nombreux cas, mais l'affiche originale voulait mettre à jour plusieurs coques au cours d'une session à l'écran. Cette solution aurait été faite à partir de chaque shell.
Adrian Ratnapala
3
Belle astuce, fonctionne très bien!
genpfault
4
De plus, la solution d'origine ne corrigeait qu'une seule session shell à l'écran. Je viens de tester cela. Si cette solution fonctionne, c'est parce que vous créez une nouvelle session complète au lieu d'hériter de l'environnement d'origine.
Dror
4
Cela devrait vraiment être la réponse acceptée. Belle astuce, merci!
dotancohen
2
Cela nécessite cependant de taper un mot de passe, ce qui peut être gênant / indésirable si vous essayez de le faire dans de nombreuses sessions.
Legooolas
156

Cette astuce de ce lien fonctionne très bien!

exec su -l $USER

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

Jhaagsma
la source
14
+1 pour ne pas mettre l'utilisateur dans un sous-shell; vous pouvez vous déconnecter / sortir comme d'habitude avec cela. De plus, si NOPASSWD: est défini dans / etc / sudoers, vous pouvez plutôt utiliser cette option exec sudo su -l $USERpour éviter d’être invité à entrer un mot de passe.
Ivan X
21
Soyez averti: un mot de passe sudo vous sera demandé. Si vous vous trompez, votre terminal se fermera.
Tyler Collier
1
@TylerCollier Ivan a mentionnéNOPASSWD:
pepoluan
32

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.

sgest newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Les execmoyens que la nouvelle coquille remplace la coque existante, de sorte que vous ne avez pas besoin de « 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 atcommande dans Screen exécute une commande dans toutes les fenêtres 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 aux jeux de hasard pour pouvoir ids'exécuter dans la session Screen et au ^ M pour que Screen frappe à «entrée» à la fin de votre commande.

Notez également que la stuffcommande de screen tape 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 si elle 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 "#", ce qui correspond à toutes les fenêtres. , 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"
Patrick Conheady
la source
Awesome one liner, qui ne semble pas avoir d’autres effets secondaires, merci!
Cyril Duchon-Doris
17

L'utilisation de la newgrpcommande a résolu le problème pour moi:

newgrp <GroupName>

Ce blog a une explication détaillée.

Pavan Vegirouthu
la source
12

Les groupes sont généralement énumérés lors de la connexion. À ma connaissance, il n’ya aucun moyen de 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.

Mister_Tom
la source
En vérité, je suis à peu près sûr que ce n'est pas vrai - j'avais déjà trouvé un moyen de le faire sur une machine Linux. Cependant, pour ma vie, je ne peux pas me rappeler ce que le commandement était. Si je le trouve, je le posterai. Edit: Je viens de le trouver, je l’affiche comme réponse.
lunchmeat317
1
Merci de l'avoir signalé, c'est aussi ce que j'ai compris. Toute autre réponse ici ouvre simplement un nouveau shell, peu importe qu’il remplace un shell ouvert, redémarre l’écran ou autre. Il n'y a pas de panacée magique pour émettre une commande ou un script et faire en sorte que chaque session en cours, y compris votre session X, reflète les nouvelles appartenances au groupe.
Scravy
12

Tu peux le faire.

Ajoutez autant de groupes que vous voulez en utilisant usermod -G. Puis, comme l'utilisateur avec une session en cours d' exécution, exécutez newgrp -avec juste 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 à groupspartir de la session en cours, avant et après le usermodet le newgrp.

Cela doit être exécuté à partir de chaque session ouverte - je ne connais pas grand chose à l'écran. Cependant, s'il est possible de parcourir toutes les sessions ouvertes et de l'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.

lunchmeat317
la source
11
essayé sur un xterm au cours d’une session X mais cela n’a pas fonctionné
dwery
3
essayé dans une session dans tmux et cela n’a pas fonctionné non plus
Michael
2
Essayé sur Amazon Linux 2, cela n'a pas fonctionné
Cyril Duchon-Doris
1
newgrp -lance un nouveau processus shell
Piotr Findeisen le
À la lumière de votre commentaire sur la réponse de Mister_Tom, il s’agit, comme toutes les autres réponses, d’une solution de contournement. La réponse de Mister_Tom est toujours correcte.
Scravy
4

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).

La version finale newgrp -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 gpasswdet usermodn'affectent pas les processus existants; les groupes nouvellement 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 des autorisations, vous devez tuer tous les processus en cours d'exécution. newgrp -ne relira pas / etc / group et ne réinitialisera pas la liste des groupes; au lieu de cela, il semble simplement utiliser les groupes précédemment associés au processus.

Jimav
la source
À propos, exec su - <username>peut être utilisé pour obtenir un nouveau shell de connexion avec des groupes définis, mais cela ne fonctionnera pas dans les scripts, car un nouveau shell lira les commandes du terminal. Vous pouvez utiliser su -c "command ..." <myusername>pour redémarrer votre script, mais le processus résultant n'a pas de terminal de contrôle et une erreur se produira si un éditeur d'écran ou une autre commande interactive est tenté.
jimav
Pourquoi cela a-t-il été voté? Quelqu'un peut-il expliquer ce qui est mauvais à ce sujet, car c'est ce qui m'est arrivé et je pense que je l'aime mieux?
jasonmp85
Gah, j'ai voté avant d'essayer. newgrp -ne remplace pas le "groupe principal". La réponse de Patrick Conheady est la meilleure, car elle ne modifie ni ne modifie le groupe principal.
jasonmp85
1

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

Marki555
la source
1

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
snuggles08
la source
0

Si vous en possédez une sudo, cela vous évitera de saisir votre mot de passe dans certains cas:

sudo su $USER
guaka
la source