2011-04-17 19:50:06 +0000 2011-04-17 19:50:06 +0000
377
377

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

Lors de l'attribution de la liste de groupes secondaires d'un utilisateur à l'aide de :

# usermod -G <grouplist> <user>

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

Cela serait très utile dans la situation où une session Screen existe avec de nombreux 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 pouvoir changer le groupe primaire de l'utilisateur dans un shell en cours d'exécution en utilisant la commande newgrp - existe-t-il une alternative qui fonctionnerait pour les groupes secondaires ? Idéalement, je voudrais que quelque chose 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 d'eux.

Réponses (12)

400
400
400
2011-11-06 15:28:07 +0000

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

su - $USER

id va maintenant lister le nouveau groupe :

id
221
221
221
2011-10-10 17:36:48 +0000

Horriblement hacky, 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. Ensuite :

newgrp <new group name>

…vous fera passer à ce groupe comme primaire et l'ajoutera à la liste des groupes renvoyés par groups ou id -G. Maintenant, un autre :

newgrp <orig_group>

…vous obtiendra un shell dans lequel vous pourrez voir le nouveau groupe et le primaire est le groupe original.

C'est horrible et vous n'obtiendrez qu'un groupe ajouté à la fois, mais cela m'a aidé à quelques reprises à obtenir des groupes ajoutés sans me déconnecter/dans ma session X entière (e. g. pour faire ajouter un fusible en tant que groupe à un utilisateur afin que sshfs fonctionne).

Edit : Vous n'avez pas non plus besoin de taper votre mot de passe, ce que fera su.

168
168
168
2013-06-18 16:27:30 +0000

Cette astuce de ce lien fonctionne très bien !

exec su -l $USER

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

35
35
35
2014-12-17 21:33:21 +0000

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

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

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

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

sg est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le exec signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 dans 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 ### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter 

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

exec sg newgrp id -gn “`

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

id est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le stuff signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 &007 dans 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 :

id -gn### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter

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

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

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

&007 est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le &007 signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 [ &007 ]&003 dans 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 :

^M" “`

Notez la nécessité d'échapper aux backticks pour obtenir que la commande &007 soit exécutée dans la session d'écran, et que le ^M pour obtenir que l'écran appuie sur "enter” à la fin de votre commande. 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 si elle exécute une application autre qu'un shell (par exemple emacs, top). Si cela pose 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 pourriez 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 ### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter 

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

exec sg newgrp id -gn “`

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

&007 est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le &007 signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 [ &007 ]&003 dans 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 ### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter 

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

exec sg newgrp id -gn “`

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

&007 est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le &007 signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 [ &007 ]&003 dans 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 :

id -gn### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter

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

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

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

&007 est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le &007 signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 [ &007 ]&003 dans 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 :

^M" “`

Notez la nécessité d'échapper aux backticks pour obtenir que la commande &007 soit exécutée dans la session d'écran, et que le ^M pour obtenir que l'écran appuie sur "enter” à la fin de votre commande. 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 si elle exécute une application autre qu'un shell (par exemple emacs, top). Si cela pose 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 pourriez 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 :

id -gn### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter

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

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

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

&007 est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le &007 signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 [ &007 ]&003 dans 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 ### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter 

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

exec sg newgrp id -gn “`

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

&007 est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le &007 signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 [ &007 ]&003 dans 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 :

id -gn### 1. Obtenir un shell avec le nouveau groupe sans se déconnecter et se reconnecter

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

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

C'est une variation de l'astuce newgrp à deux couches de Legooolas, mais elle est sur une ligne et ne nécessite pas que vous entriez manuellement votre groupe principal.

&007 est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Le &007 signifie que le nouveau shell remplace le shell existant, donc 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 (à part 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 [ &007 ]&003 dans 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 :

^M" “`

Notez la nécessité d'échapper aux backticks pour obtenir que la commande &007 soit exécutée dans la session d'écran, et que le ^M pour obtenir que l'écran appuie sur "enter” à la fin de votre commande. 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 si elle exécute une application autre qu'un shell (par exemple emacs, top). Si cela pose 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 pourriez 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 :

^M" “`

18
18
18
2016-10-07 04:53:42 +0000

L'utilisation de la commande newgrp a résolu un problème pour moi :

newgrp <GroupName>

Ce billet de blog a une explication détaillée.

12
12
12
2012-01-30 16:17:03 +0000

Vous pouvez le faire.

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

Cela réinitialise l'identifiant du groupe par défaut, mais cela va également définir les groupes secondaires. Vous pouvez vérifier cela en exécutant groups à partir de la session actuelle, avant et après usermod et newgrp.

Cela doit être exécuté à partir de chaque session ouverte - je ne sais 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 bon. Vous n'aurez pas à vous soucier de connaître les groupes ou les ID de groupe.

Bonne chance à vous.

11
11
11
2011-04-25 17:56:34 +0000

Les groupes sont généralement énumérés lors de la connexion, il n'y a aucun moyen que je connaisse pour le forcer à refaire l'énumération des groupes sans se déconnecter et se reconnecter.

De nombreuses réponses votées ici semblent utiliser une solution de contournement qui invoque un nouveau shell avec un nouvel environnement (comme pour se reconnecter). Le shell parent et tous les autres programmes fonctionnant en continu ne recevront généralement pas la nouvelle adhésion au groupe avant d'être ré-invoqués à partir d'un nouveau shell, généralement après une déconnexion et une connexion propres.

4
4
4
2017-02-10 23:21:38 +0000

Pour 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 sortir du nouveau shell vous déconnecte).

Le newgrp - final est nécessaire pour restaurer votre groupe primaire normal, donc les fichiers que vous créerez plus tard auront ce groupe comme propriétaire.

Note : La question du poster original était de savoir comment 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 des processus existants ne sont pas modifiées. Pour remove permissions, vous devez tuer tous les processus en cours ; newgrp - ne relit pas /etc/group et ne réinitialise pas la liste des groupes ; à la place, il semble utiliser simplement les groupes précédemment associés au processus.

1
1
1
2018-04-28 13:30:22 +0000

Je n'ai pas réussi à 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 exiger 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
0
0
2014-08-06 14:03:21 +0000

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

sudo su $USER
0
0
0
2019-10-21 22:03:04 +0000

J'avais besoin de faire cela dans un script shell (le script ajoute l'utilisateur actuel à un groupe, exécute des commandes ultérieures qui nécessitent l'appartenance à ce groupe). La commande newgrp est fragile dans le sens où elle ne peut exécuter qu'un nouveau shell plutôt qu'une commande arbitraire (je veux ré-exécuter le script shell actuel avec les args de la ligne de commande d'origine).

Voici ma solution, qui utilise beaucoup de bash-ismes : (note : le script environnant a besoin d'une sorte de branche pour exécuter cette fonction uniquement si le groupe requis n'est pas actif actuellement) :

(note : le script implique qu'il a exécuté sudo adduser $user docker, ce qui signifie qu'il pourrait aussi simplement exécuter sudo docker partout au lieu de docker mais cela n'était pas souhaitable dans ce cas)

# save these for later
ORIGINAL_ARGS=("$@")

# This function is a little insane. The problem is this: user running
# this script is not a member of docker group, but used 'sudo' to add
# themselves to group. Without logging out and back in, the only way
# to gain access to that group is via the 'newgrp' command, which
# unfortunately starts a new shell rather than an arbitrary command...
#
# Also, we're going to newgrp twice: first to add the new group and
# again to restore the original group (but the new group remains in
# the 'groups' output).
#
# So this horrendous hack dups stdin to fd3 for later. Then runs
# 'newgrp' piping in a script that runs 'newgrp' a second time, piping
# in another script that restores stdin from fd3 and execs the
# original command...
restart-newgrp-newgrp() {
  # dup original stdin to fd3
  exec 3<&0

  local group="$1"
  local command="$0"
  local arg
  for arg in "${ORIGINAL_ARGS[@]}"; do
    printf -v command "%s %q" "$command" "$arg"
  done

  # restore original stdin from fd3; also replace any single-quote in
  # command with '"'"' to embed it in a single-quoted string
  local script
  printf -v script "exec newgrp %q <<<'exec <&3-; exec %s'" "$(id -gn)" "${command///\"\"}"

  exec newgrp "$group" <<<"$script"
}
0
0
0
2014-11-13 16:07:46 +0000

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 ordonner à nscd (démon de mise en cache) de recharger le fichier des groupes.