J'avais besoin de faire cela dans un Shell Shell (Shell ajoute l'utilisateur actuel à un groupe, exécute les commandes ultérieures qui nécessitent cette appartenance au groupe). Le site newgrp
est fragile dans la mesure où elle ne peut exécuter qu'une nouvelle Shell plutôt qu'une commande arbitraire (je veux réexécuter la Shell Shell actuelle avec les arguments de ligne de commande originaux).
Voici ma solution, qui utilise beaucoup de bash-ismes : (notez que le script qui l'entoure a besoin d'une sorte de branche pour ne lancer cette fonction que si le groupe requis n'est pas actuellement actif) :
(note : le script implique qu'il a été 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 votes
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 lancé à partir des menus, des boutons du panneau ou autre. Je viens juste de venir ici pour retrouver cette information, donc je ne peux pas dire maintenant comment faire, et c'est probablement spécifique au gestionnaire de fenêtres.