Ricarica le assegnazioni di gruppo di un utente Linux senza disconnettersi


348

Quando si assegna un elenco di gruppi secondari di un utente utilizzando:

# usermod -G <grouplist> <user>

è possibile forzare l'attribuzione di questo gruppo al gruppo senza disconnettersi da tutte le sessioni in corso?

Ciò sarebbe molto utile nella situazione in cui esiste una sessione dello schermo con molte shell in esecuzione, poiché l'intera sessione deve essere essenzialmente distrutta per rendere effettiva l'assegnazione del gruppo.

Penso di poter cambiare il gruppo primario dell'utente in una shell in esecuzione usando il newgrpcomando: esiste qualche alternativa che funzionerebbe per i gruppi secondari?

Idealmente, vorrei qualcosa che avrebbe effetto in ciascuna shell senza essere eseguito manualmente in ognuna, ma in mancanza di ciò, forse un modo per forzare Screen ad eseguire lo stesso comando in ciascuna.


So che almeno per alcuni gestori di finestre / sessioni è possibile farlo in modo che la sessione raccolga il nuovo gruppo ed è disponibile per tutti i nuovi processi avviati dai menu, dai pulsanti del pannello o altro. Sono venuto qui proprio ora cercando di ritrovarlo, quindi non posso dire proprio ora come farlo ed è probabilmente specifico per il gestore delle finestre.
MC0e,

Risposte:


205

Orribilmente hacky, ma potresti usare due livelli di newgrpper raggiungere questo obiettivo per un particolare gruppo:

id -g

... ti darà l'ID del gruppo primario corrente. Lo chiameremo orig_groupai fini di questo esempio. Poi:

newgrp <new group name>

... passerà a quel gruppo come principale e lo aggiungerà all'elenco dei gruppi restituiti da groupso id -G. Ora un ulteriore:

newgrp <orig_group>

... ti darà una shell in cui puoi vedere il nuovo gruppo e quello primario è quello originale.

Questo è orribile e ti farà aggiungere un solo gruppo alla volta, ma mi ha aiutato un paio di volte a ottenere i gruppi aggiunti senza disconnettersi / in tutta la mia sessione X (ad esempio per ottenere un fusibile aggiunto come gruppo a un utente in modo che sshfs funzionerà).

Modifica: questo non richiede neanche di digitare la password, il che lo sufarà.


6
Bel trucco, mi piace
Simon,

1
Su Fedora ho dovuto fare newgrp $USERinvece di newgrp <orig_group>. Ciò significa che non ho dovuto trovare il mio ID gruppo primario originale, quindi è ancora più semplice di questa soluzione.
Richard Turner,

2
Ho scoperto che era sufficiente farlo newgrp <new group name>. Questo era Ubuntu 14.04
Edward Falk il

4
@EdwardFalk giusto, ma non vuoi (forse non) lasciare quel gruppo come primario ...
mimoralea,

4
Si noti che ognuno newgrpcrea una nuova shell, quindi quando è necessario uscire completamente dalla sessione è necessario eseguire "exit exit exit" per uscire completamente (:
jwd

371

Dall'interno di una shell, è possibile emettere il seguente comando

su - $USER

id ora elencherà il nuovo gruppo:

id

3
Penso che questo sia l'approccio migliore in molti casi, ma il poster originale voleva aggiornare più shell all'interno di una sessione dello schermo. Questa soluzione sarebbe stata fatta da ogni shell.
Adrian Ratnapala,

3
Bel trucco, funziona benissimo!
genpfault

4
La soluzione originale avrebbe anche risolto solo una singola sessione di shell sullo schermo. L'ho appena provato. Il motivo per cui questa soluzione funziona è perché stai generando una nuova sessione completa piuttosto che ereditare dall'ambiente originale.
Dror,

4
Questa dovrebbe davvero essere la risposta accettata. Bel trucco, grazie!
dotancohen,

2
Ciò richiede tuttavia di digitare una password, che potrebbe essere scomoda / indesiderata se si sta tentando di farlo in molte sessioni.
Legooolas,

156

Questo trucco ingegnoso da questo link funziona alla grande!

exec su -l $USER

Ho pensato di pubblicarlo qui perché ogni volta che dimentico come farlo, questo è il primo link che compare su Google.


14
+1 per non mettere l'utente in una subshell; puoi disconnetterti / uscire come al solito con questo. Inoltre, se NOPASSWD: è impostato in / etc / sudoers, puoi invece usare exec sudo su -l $USERper evitare che ti venga richiesta la password.
Ivan X,

21
Attenzione: ti verrà richiesta una password sudo. Se sbagli, il tuo terminale si chiuderà.
Tyler Collier,

1
@TylerCollier Ivan ha menzionatoNOPASSWD:
pepoluan il

32

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ò execsignifica 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 atcomando 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 ida correre nella sessione dello schermo e ^ M per far sì che lo schermo prema 'invio' alla fine del tuo comando.

Nota anche che il stuffcomando 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"

Una fodera fantastica, che non sembra avere altri effetti collaterali, grazie!
Cyril Duchon-Doris,


12

I gruppi sono di solito elencati all'accesso, non c'è modo che io sappia costringerlo a ripetere l'enumerazione di gruppo senza disconnettersi e riconnettersi.

Molte risposte votate qui sembrano usare una soluzione alternativa che richiama una nuova shell con un ambiente fresco (come il login di nuovo). la shell padre e tutti gli altri programmi in esecuzione continua non riceveranno in genere la nuova appartenenza al gruppo fino a quando non vengono nuovamente invocati da una shell fresca, in genere dopo il logout pulito e l'accesso.


Sinceramente, sono abbastanza sicuro che questo non sia vero - avevo trovato un modo per farlo prima su un box Linux. Tuttavia, per la mia vita, non riesco a ricordare quale fosse il comando. Se lo trovo, lo posterò. Modifica: appena trovato, lo sto pubblicando come risposta.
lunchmeat317

1
Grazie per averlo sottolineato, questa è anche la mia comprensione. Ogni altra risposta qui apre semplicemente una nuova shell, non importa se sostituisce una shell aperta o riavvia lo schermo o altro. Non esiste una panacea magica per emettere un comando o uno script e ogni sessione in esecuzione, inclusa la sessione X, rifletta le nuove appartenenze al gruppo.
scravy

12

Puoi farlo.

Aggiungi tutti i gruppi che desideri utilizzare usermod -G. Quindi, come utente con una sessione in esecuzione, esegui newgrp -solo l'argomento '-'.

Ciò reinizializza l'id del gruppo sul valore predefinito, ma imposterà anche i gruppi secondari. È possibile verificarlo eseguendo groupsdalla sessione corrente, prima e dopo il usermode il newgrp.

Questo deve essere eseguito da ogni sessione aperta - non so molto sullo schermo. Tuttavia, se è possibile iterare su tutte le sessioni aperte ed eseguire newgrp, dovresti essere bravo. Non dovrai preoccuparti di conoscere i gruppi o gli ID dei gruppi.

Buona fortuna a te.


11
provato su un xterm all'interno di una sessione X, ma non ha funzionato
dwery

3
provato in una sessione in tmux e non ha funzionato neanche lì
Michael

2
Provato su Amazon Linux 2, non ha funzionato
Cyril Duchon-Doris,

1
newgrp -avvia un nuovo processo di shell
Piotr Findeisen,

Alla luce del tuo commento sulla risposta di Mister_Tom, questa è, come tutte le altre risposte, una soluzione alternativa. La risposta di Mister_Tom è ancora corretta.
scravy

4

Riassumere:

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

Usare 'exec' significa sostituire la shell esistente con la nuova shell avviata dal comando newgrp (quindi uscire dalla nuova shell si disconnette).

Il finale newgrp -è necessario per ripristinare il tuo normale gruppo primario, quindi i file che creerai in seguito avranno quello come proprietario del gruppo.

Nota: la domanda del poster originale era come rendere visibili i gruppi appena aggiunti nei processi esistenti. I comandi gpasswde usermodnon influenzano i processi esistenti; i gruppi appena aggiunti (o eliminati!) compaiono nel tuo account (scompaiono), ad esempio nei file / etc / group e / etc / gshadow, ma le autorizzazioni per i processi esistenti non vengono modificate. Per rimuovere le autorizzazioni è necessario interrompere tutti i processi in esecuzione; newgrp -non rileggerà / etc / group e resetterà l'elenco dei gruppi; invece, sembra usare solo i gruppi precedentemente associati al processo.


A proposito, exec su - <username>può essere usato per ottenere una nuova shell di login con gruppi impostati, ma che non funzionerà negli script perché una nuova shell leggerà i comandi dal terminale. È possibile utilizzare su -c "command ..." <myusername>per riavviare lo script, ma il processo risultante non ha un terminale di controllo e quindi si verificherà un errore se si tenta un editor di schermate o un altro comando interattivo.
jimav,

Perché questo è stato downvoted? Qualcuno può spiegare cosa c'è di male, perché è quello che mi è successo e penso che mi piaccia di più?
jasonmp85

Gah, l'ho votato prima del test. newgrp -non non sostituire il "gruppo primario". La risposta di Patrick Conheady è la migliore qui, in quanto non si biforca né cambia il gruppo principale.
jasonmp85

1

Ho avuto un problema simile ma anche per gli utenti non connessi. Riavvio di nscd non ha aiutato, ma l'esecuzione di questo comando ha fatto: nscd -i group. Ciò dovrebbe indicare a nscd (daemon di memorizzazione nella cache) di ricaricare il file dei gruppi.


1

Non sono riuscito a far funzionare il comando newgrp. Non sono sicuro che questo dipenda da / etc / sudoers, ma normalmente devo digitare la mia password per sudo, e questo ha funzionato senza richiedere la mia password:

[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

Questo è il trucco se lo hai sudoe può salvarti dall'inserimento della password ancora una volta in alcuni casi:

sudo su $USER
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.