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.
sg
est newgrp mais accepte une commande à exécuter avec le nouvel ID de groupe. Les exec
moyens 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 at
commande 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 id
s'exécuter dans la session Screen et au ^ M pour que Screen frappe à «entrée» à la fin de votre commande.
Notez également que la stuff
commande 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"