Question Rechargez les assignations de groupe d'un utilisateur Linux sans vous déconnecter


Lors de l'attribution d'une liste de groupes secondaire d'utilisateurs à l'aide de:

# usermod -G <grouplist> <user>

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

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

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

Idéalement, je voudrais quelque chose qui prendrait effet dans chaque shell sans être exécuté manuellement, mais à défaut, peut-être une façon de forcer Screen à exécuter la même commande dans chacun.


254
2018-04-17 19:50


origine


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 démarré à partir des menus, des boutons du panneau ou autre. Je suis venu ici juste pour chercher à nouveau à trouver cela, donc je ne peux pas dire tout de suite comment le faire, et il est probablement spécifique au gestionnaire de fenêtres. - mc0e


Réponses:


Horriblement pirate, mais vous pouvez utiliser deux couches de newgrp pour y parvenir pour un groupe particulier:

id -g

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

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 primaire est l'original.

C'est horrible et cela ne vous apportera qu'un groupe à la fois, mais cela m'a aidé à ajouter des groupes sans me déconnecter / dans toute ma session X (par exemple, pour ajouter un fusible à un utilisateur) pour que sshfs fonctionne).

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


149
2017-10-10 17:36



Bon tour, j'aime ça - Simon
Sur Fedora je devais faire newgrp $USER au lieu de newgrp <orig_group>. Cela signifie que je n'ai pas eu à trouver mon identifiant de groupe primaire original, donc c'est encore plus facile que cette solution. - Richard Turner
J'ai trouvé que c'était suffisant pour faire newgrp <new group name>. C'était Ubuntu 14.04 - Edward Falk
@EdwardFalk à droite, mais vous ne voulez pas (peut-être pas) laisser ce groupe comme principal ... - mimoralea
Notez que chaque newgrp crée un nouveau shell, donc lorsque vous avez besoin de quitter complètement votre session, vous devez faire "exit exit exit" pour sortir complètement (: - jwd


Depuis l'intérieur d'un shell, vous pouvez émettre la commande suivante

su - $USER

id va maintenant lister le nouveau groupe:

id

252
2017-11-06 15:28



Je pense que c'est la meilleure approche dans de nombreux cas, mais l'affiche originale voulait mettre à jour plusieurs shells dans une session d'écran. Cette solution aurait été faite à partir de chaque coque. - Adrian Ratnapala
Nice trick, fonctionne très bien! - genpfault
La solution originale ne fixerait également qu'une seule session shell à l'écran. Je viens de tester ça. La raison pour laquelle cette solution fonctionne est que vous créez une nouvelle session complète plutôt que d'hériter de l'environnement d'origine. - Dror
Cela devrait vraiment être la réponse acceptée. Bon tour, merci! - dotancohen
Cependant, vous devez taper un mot de passe, ce qui peut être gênant / indésirable si vous essayez de le faire en plusieurs sessions. - Legooolas


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

exec su -l $USER

J'ai pensé que je le posterais ici comme chaque fois que j'oublie comment faire, c'est le premier lien qui apparaît dans Google.


115
2018-06-18 16:27



+1 pour ne pas placer l'utilisateur dans un sous-shell; vous pouvez vous déconnecter / quitter 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é à entrer un mot de passe. - Ivan X
Soyez averti: il vous sera demandé un mot de passe sudo. Si vous vous trompez, votre terminal se fermera. - Tyler Collier
@TylerCollier Ivan fait mention NOPASSWD: - pepoluan


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

Si vous ajoutez seulement un groupe, j'ai utilisé les éléments suivants:

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

Ceci est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle se trouve sur une seule ligne et ne nécessite pas de saisir manuellement votre groupe principal.

sg est newgrp mais accepte une commande à exécuter avec le nouvel identifiant de groupe. le 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. Il ne rafraîchit pas non plus votre environnement (autre que l'ajout du groupe), vous conservez ainsi votre répertoire de travail actuel, etc.

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

le at La commande in Screen exécute une commande dans toutes les fenêtres que vous spécifiez (notez qu'il s'agit d'une commande Screen et non d'une commande shell).

Vous pouvez utiliser la commande suivante pour envoyer la commande à toutes les sessions d'écran existantes:

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

Notez la nécessité d’échapper aux punaises pour obtenir id pour exécuter dans la session écran, et le ^ M pour obtenir l'écran pour appuyer sur «entrer» à la fin de votre commande.

Notez également cet écran stuff commande 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 comporte 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 se 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, , etc).

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

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

19
2017-12-17 21:33



Superbe une doublure, qui ne semble pas avoir d'autres effets secondaires, merci! - Cyril Duchon-Doris


Tu peux le faire.

Ajoutez autant de groupes que vous voulez en utilisant usermod -G. Puis, en tant qu'utilisateur avec une session en cours d'exécution, exécutez newgrp - avec juste l'argument '-'.

Cela réinitialise l'ID du groupe à la valeur par défaut, mais il définira également les groupes secondaires. Vous pouvez le vérifier en exécutant groups de la session en cours, avant et après la usermod et 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 d'itérer toutes les sessions ouvertes et de les 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.


14
2018-01-30 16:17



essayé sur un xterm dans une session X mais cela n'a pas fonctionné - dwery
essayé dans une session dans tmux et il ne fonctionnait pas là non plus - Michael
Essayé sur Amazon Linux 2, cela n'a pas fonctionné - Cyril Duchon-Doris
newgrp - lance un nouveau processus shell - Piotr Findeisen


Les groupes sont généralement énumérés lors de la connexion. Je ne sais pas comment le forcer à refaire une énumération de groupe sans se déconnecter et se reconnecter.

Beaucoup de réponses votées ici semblent utiliser une solution de contournement qui appelle un nouveau shell avec un nouvel environnement (identique à une nouvelle connexion). le shell parent et tous les autres programmes en cours d'exécution ne recevront généralement pas la nouvelle appartenance au groupe avant d'avoir été ré-invoqué depuis un nouveau shell généralement après une déconnexion et une connexion propres.


12
2018-04-25 17:56



En vérité, je suis presque sûr que ce n’est pas vrai - j’avais trouvé un moyen de le faire auparavant sur une machine Linux. Cependant, pour la vie de moi, je ne peux pas me rappeler quelle était la commande. Si je le trouve, je le posterai. Edit: Je viens de le trouver, je le poste comme réponse. - lunchmeat317


En utilisant newgrp problème de commande résolu pour moi:

newgrp <GroupName>

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


10
2017-10-07 04:53



Bienvenue sur Super User! Sur ce site de questions-réponses, nous essayons de fournir bonnes réponses aux questions que les gens postent. Une partie de ceci inclut la réponse dans votre message, au lieu de simplement fournir un lien vers une autre page qui pourrait répondre à la question. Veuillez modifier votre réponse pour inclure la solution réelle à la question affichée. - cascer1
C'est le meilleur moyen à mon avis et devrait être marqué comme la nouvelle réponse acceptée. - Dakatine


Résumer:

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

Utiliser 'exec' signifie remplacer le shell existant par le nouveau shell lancé par la commande newgrp (donc, quitter le nouveau shell vous déconnecte).

Le final newgrp - est nécessaire pour restaurer votre groupe principal normal, donc les fichiers que vous créerez ultérieurement en auront le propriétaire de groupe.

Note: La question de l'affiche originale était de savoir comment rendre visibles les groupes nouvellement ajoutés dans les processus existants. le gpasswd et usermod les commandes n'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. À retirer autorisations que vous avez pour tuer des processus en cours d'exécution; newgrp - ne relira pas / etc / group et réinitialisera la liste des groupes; au lieu de cela, il semble utiliser uniquement les groupes précédemment associés au processus.


4
2018-02-10 23:21



Au fait, 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 pourriez 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 produit si un éditeur d'écran ou une autre commande interactive est tentée. - jimav
Pourquoi était-ce abaissé? Est-ce que quelqu'un peut expliquer ce qui ne va pas, parce que c'est ce qui m'est arrivé et je pense que je l'aime le mieux? - jasonmp85
Gah, j'ai voté avant de tester. newgrp - Est-ce que ne pas remplacer le "groupe primaire". La réponse de Patrick Conheady est la meilleure ici, car elle ne forge ni ne change le groupe principal. - jasonmp85


J'ai eu un problème similaire, 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 fait: nscd -i group. Cela devrait indiquer à nscd (démon de mise en cache) de recharger le fichier de groupes.


1
2017-11-13 16:07





Cela fait le tour 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
2017-08-06 14:03





Un peu en retard à 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, mais vous pouvez définir tous ses membres:

$ gpasswd -M user1,user2 groupname

0
2017-11-18 14:26



Cela ne change pas le shell actuel. - kavadias
@kavadias Ce n'est pas censé changer le shell. Il suffit d'ajouter l'utilisateur au groupe sans nécessité de déconnexion et de nouveau login. - Tombart
Je ne vois pas comment cela est utile lorsque les processus en cours d'exécution et les processus nouvellement démarrés, lors de la session Screen, ne pourront pas voir le changement des groupes. - kavadias