1. Ottenere una shell con il nuovo gruppo senza disconnettersi e riconnettersi
Se stai aggiungendo solo un gruppo, ho usato quanto segue:
exec sg <new group name> newgrp `id -gn`
Questa è una variante del trucco newgrp a due strati di Legooolas, ma è in una riga e non richiede di inserire manualmente il tuo gruppo principale.
sg
è newgrp ma accetta un comando da eseguire con il nuovo ID gruppo. Ciò exec
significa che la nuova shell sostituisce la shell esistente, quindi non è necessario "disconnettersi" due volte.
A differenza dell'uso di su, non è necessario digitare la password. Inoltre non aggiorna il tuo ambiente (oltre all'aggiunta del gruppo), quindi mantieni la tua directory di lavoro corrente ecc.
2. Esecuzione del comando in tutte le finestre dello schermo in una sessione
Il at
comando in Schermo esegue un comando in qualunque finestra tu specifichi (nota che questo è un comando Schermo, non un comando shell).
È possibile utilizzare il comando seguente per inviare il comando a tutte le sessioni dello schermo esistenti:
screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
Nota la necessità di sfuggire ai backtick per iniziare id
a correre nella sessione dello schermo e ^ M per far sì che lo schermo prema 'invio' alla fine del tuo comando.
Nota anche che il stuff
comando dello schermo digita semplicemente il testo del comando per tuo conto. Pertanto può succedere qualcosa di strano se una delle finestre dello schermo ha un comando scritto a metà al prompt dei comandi o esegue un'applicazione diversa da una shell (ad esempio emacs, top). Se questo è un problema, ho alcune idee:
- Per eliminare qualsiasi comando scritto a metà, è possibile aggiungere "^ C" all'inizio del comando.
- Per evitare di eseguire il comando in una finestra di emacs, ecc., Potresti chiedere a `at 'di filtrare il titolo della finestra ecc. (Nell'esempio sopra, uso" # ", che corrisponde a tutte le finestre, ma puoi filtrare per titolo della finestra, utente , eccetera).
Per eseguire il comando in una finestra specifica (identificata dal numero di finestra), utilizzare quanto segue:
screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"