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

Lorsque vous affectez la liste de groupe secondaire d'un utilisateur en utilisant:

# 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 la situation où une session d' écran existe avec de nombreux shells en cours d'exécution, car la session entière doit essentiellement être détruite pour que l'affectation 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 commande newgrp – existe-t-il une alternative qui fonctionnerait pour les groupes secondaires?

Idéalement, je voudrais quelque chose qui prendra effet dans chaque coque sans être exécuté manuellement sur tous, mais en déduisant cela, peut-être une façon de forcer l'écran à exécuter la même commande dans chacun.

11 Solutions collect form web for “Rechargez les affectations de groupe d'un utilisateur Linux sans vous déconnecter”

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

 id -g 

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

 newgrp <new group name> 

… vous mèneront à ce groupe en tant que principal et l'ajouterez à la liste des groupes renvoyés par groups ou id -G . Maintenant, un autre:

 newgrp <orig_group> 

… vous obtiendrez une coque dans laquelle vous pourrez voir le nouveau groupe et le premier est l'original.

C'est horrible et vous obtiendrez seulement un groupe ajouté à la fois, mais cela m'a aidé quelques fois à ajouter des groupes sans se déconnecter / dans toute ma session X (p. Ex. Pour obtenir un fusible ajouté en tant que groupe à un utilisateur Afin que sshfs fonctionne).

Modifier: Cela ne vous oblige pas à taper votre mot de passe non plus, et ce sera.

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

 su - $USER 

Id affichera maintenant le nouveau groupe:

 id 

Cet astérisque de ce lien fonctionne très bien!

 exec su -l $USER 

J'ai pensé que je l'afficherais ici car chaque fois que j'oublierais comment faire cela, c'est le premier lien qui surgit dans Google.

1. Obtenir un shell avec le nouveau groupe sans se déconnecter et à 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 couches de Legooolas, mais elle est en une seule ligne et ne nécessite pas d'entrer manuellement votre groupe principal.

sg est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. L' exec signifie que le nouveau shell remplace le shell existant, donc vous n'avez pas besoin de "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), donc vous conservez votre répertoire de travail actuel, etc.

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

La commande à l'écran affiche une commande dans n'importe quelle fenêtre que vous spécifiez (notez que c'est une commande d'écran, pas 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 backticks pour obtenir id pour s'exécuter dans la session d'écran, et le ^ M pour obtenir l'écran pour frapper 'entrer' à la fin de votre commande.

Notez également que la commande stuff l'écran suffit de taper le texte de commande en votre nom. Par conséquent, quelque chose d'étrange peut se produire si l'une des fenêtres d'écran a une commande à demi-écrit à 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 de toute commande à demi écrit, 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 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 la fenêtre, utilisateur , etc).

Pour exécuter la commande dans une fenêtre spécifique (identifiée par le 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" 

Tu peux le faire.

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

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

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

Bonne chance à vous.

Les groupes sont généralement énumérés lors de la connexion, il n'y a aucun moyen de le forcer à re-faire l'énumération du groupe sans vous déconnecter et revenir à nouveau.

Beaucoup de réponses votées ici semblent utiliser une solution de contournement qui invoque un nouveau shell avec un nouvel environnement (même que se connecter à 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 jusqu'à ce qu'ils soient ré-invoqués à partir d'un nouveau shell habituellement après la connexion et la connexion.

L'utilisation de la newgrp commande newgrp résolu:

 newgrp <GroupName> 

Cette publication du blog contient des explications détaillées.

Résumer:

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

L'utilisation de 'exec' signifie de remplacer le shell existant par le nouveau shell démarré par la commande newgrp (donc la sortie de la nouvelle shell vous enregistre).

Le nouveau groupe final est nécessaire pour restaurer votre groupe primaire normal, de sorte que les fichiers que vous créerez ultérieurement auront ce type de propriétaire de groupe.

Remarque: la question de l'affiche originale était la façon de rendre les groupes nouvellement ajoutés visibles dans les processus existants. Les commandes gpasswd et usermod 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. Pour supprimer les autorisations, vous devez tuer tous les processus en cours d'exécution; newgrp - ne relire pas / etc / group et réinitialise la liste des groupes; Au lieu de cela, il semble simplement utiliser les groupes précédemment associés au processus.

Cela fait le tour si vous avez sudo et cela vous permet d'enregistrer votre mot de passe une fois de plus dans certains cas:

 sudo su $USER 

J'ai eu un problème similaire, mais aussi pour les utilisateurs qui ne sont pas connectés. Le redémarrage de nscd n'a pas aidé, mais l'exécution de cette commande a été faite: nscd -i group . Cela devrait indiquer à nscd (mise en cache du démon) de recharger le fichier des groupes.

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 seul groupe à la fois, mais vous pouvez définir tous ses membres:

 $ gpasswd -M user1,user2 groupname 
Soyons le génie de l'ordinateur et du réseau.