Laden Sie die Gruppenzuweisungen eines Linux-Benutzers neu, ohne sich abzumelden

348

Beim Zuweisen einer sekundären Gruppenliste eines Benutzers mit:

# usermod -G <grouplist> <user>

Ist es möglich, diese Gruppenzuweisung zu erzwingen, ohne alle laufenden Sitzungen abzumelden?

Dies ist in Situationen sehr nützlich, in denen eine Screen- Sitzung mit vielen laufenden Shells vorhanden ist, da im Wesentlichen die gesamte Sitzung zerstört werden muss, damit die Gruppenzuweisung wirksam wird.

Ich glaube, ich kann die primäre Gruppe des Benutzers in einer laufenden Shell mit dem newgrpBefehl ändern. Gibt es eine Alternative, die für sekundäre Gruppen funktionieren würde?

Idealerweise möchte ich, dass etwas in jeder Shell wirksam wird, ohne dass es manuell in jeder Shell ausgeführt wird. Andernfalls wird Screen möglicherweise gezwungen, in jeder Shell den gleichen Befehl auszuführen.

Simon
quelle
Ich weiß, dass es zumindest für einige Fenster- / Sitzungsmanager möglich ist, dies so zu tun, dass die Sitzung die neue Gruppe aufnimmt und für alle neuen Prozesse verfügbar ist, die über Menüs, Bedienfeldschaltflächen oder was auch immer gestartet werden. Ich bin gerade hierher gekommen, um das wiederzufinden, kann also nicht sagen, wie ich es machen soll, und es ist wahrscheinlich spezifisch für den Fenstermanager.
mc0e

Antworten:

205

Schrecklich abgedreht, aber Sie könnten zwei Ebenen verwenden newgrp, um dies für eine bestimmte Gruppe zu erreichen:

id -g

... gibt Ihnen die aktuelle primäre Gruppen-ID. Wir werden dies orig_groupfür die Zwecke dieses Beispiels nennen. Dann:

newgrp <new group name>

... wechselt Sie zu dieser Gruppe als primäre und fügt sie der Liste der von groupsoder zurückgegebenen Gruppen hinzu id -G. Nun noch ein weiteres:

newgrp <orig_group>

... erhalten Sie eine Shell, in der Sie die neue Gruppe sehen können und die primäre die ursprüngliche ist.

Dies ist schrecklich und es wird immer nur eine Gruppe auf einmal hinzugefügt, aber es hat mir ein paar Mal geholfen, Gruppen hinzuzufügen, ohne mich / in meiner gesamten X-Sitzung abzumelden (z. B. um einem Benutzer eine Sicherung als Gruppe hinzuzufügen) damit sshfs funktioniert).

Bearbeiten: Hierfür müssen Sie auch kein Passwort eingeben su.

Legooolas
quelle
6
Nizza Trick, Ich mag es
Simon
1
Auf Fedora musste ich newgrp $USERstatt newgrp <orig_group>. Das bedeutet, dass ich meine ursprüngliche primäre Gruppen-ID nicht finden musste. Dies ist sogar noch einfacher als diese Lösung.
Richard Turner
2
Ich fand es war genug zu tun newgrp <new group name>. Dies war Ubuntu 14.04
Edward Falk
4
@ EdwardFalk richtig, aber Sie wollen diese Gruppe nicht (vielleicht auch nicht) als Ihre primäre ...
Mimoralea
4
Beachten Sie, dass jeder newgrpeine neue Shell erstellt. Wenn Sie Ihre Sitzung also vollständig beenden möchten, müssen Sie "exit exit exit" ausführen, um den vollständigen Ausgang zu erreichen (:
jwd
371

In einer Shell können Sie den folgenden Befehl eingeben

su - $USER

id listet nun die neue Gruppe auf:

id
stivlo
quelle
3
Ich denke, dies ist in vielen Fällen der beste Ansatz, aber das ursprüngliche Poster wollte mehrere Shells innerhalb einer Bildschirmsitzung aktualisieren. Diese Lösung müsste von jeder Shell aus erfolgen.
Adrian Ratnapala
3
Netter Trick, funktioniert super!
Genpfault
4
Die ursprüngliche Lösung würde auch nur eine einzelne Shell-Sitzung auf dem Bildschirm reparieren. Ich habe das gerade getestet. Der Grund, warum diese Lösung funktioniert, liegt darin, dass Sie eine vollständige neue Sitzung erstellen, anstatt von der ursprünglichen Umgebung zu erben.
Dror
4
Dies sollte wirklich die akzeptierte Antwort sein. Netter Trick, danke!
Dotancohen
2
Hierfür müssen Sie jedoch ein Kennwort eingeben. Dies ist möglicherweise umständlich oder unerwünscht, wenn Sie dies in vielen Sitzungen versuchen.
Legooolas
156

Dieser raffinierte Trick von diesem Link funktioniert großartig!

exec su -l $USER

Ich dachte, ich würde es hier posten, da dies der erste Link ist, der in Google auftaucht, wenn ich vergesse, wie man das macht.

jhaagsma
quelle
14
+1, wenn der Benutzer nicht in eine Subshell versetzt wurde; Hiermit können Sie sich wie gewohnt abmelden / beenden. Wenn NOPASSWD: in / etc / sudoers festgelegt ist, können Sie stattdessen verwenden exec sudo su -l $USER, um die Aufforderung zur Kennworteingabe zu vermeiden.
Ivan X
21
Achtung: Sie werden nach einem Sudo-Passwort gefragt. Wenn Sie etwas falsch machen, wird Ihr Terminal geschlossen.
Tyler Collier
1
@ TylerCollier Ivan hat erwähntNOPASSWD:
pepoluan
32

1. Eine Shell mit der neuen Gruppe erstellen, ohne sich aus- und wieder einzuloggen

Wenn Sie nur eine Gruppe hinzufügen, habe ich Folgendes verwendet:

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

Dies ist eine Variation des zweischichtigen Newgrp-Tricks von Legooolas, aber es befindet sich in einer Zeile und erfordert nicht, dass Sie Ihre primäre Gruppe manuell eingeben.

sgist newgrp, akzeptiert jedoch einen Befehl zur Ausführung mit der neuen Gruppen-ID. Dies execbedeutet, dass die neue Shell die vorhandene Shell ersetzt, sodass Sie sich nicht zweimal abmelden müssen.

Im Gegensatz zur Verwendung von su müssen Sie Ihr Passwort nicht eingeben. Es aktualisiert auch nicht Ihre Umgebung (außer das Hinzufügen der Gruppe), so dass Sie Ihr aktuelles Arbeitsverzeichnis usw. behalten.

2. Führen Sie den Befehl in allen Bildschirmfenstern einer Sitzung aus

Der atBefehl in Screen führt einen Befehl in den von Ihnen angegebenen Fenstern aus (beachten Sie, dass dies ein Screen-Befehl ist, kein Shell-Befehl).

Mit dem folgenden Befehl können Sie den Befehl an alle vorhandenen Bildschirmsitzungen senden:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

Beachten Sie, dass Sie die Backticks entziehen müssen, um idin der Screen-Sitzung ausgeführt zu werden, und das ^ M, um Screen zu veranlassen, am Ende Ihres Befehls die Eingabetaste zu drücken .

Beachten Sie auch, dass der stuffBefehl des Bildschirms einfach den Befehlstext in Ihrem Namen eingibt. Daher kann etwas Seltsames passieren, wenn eines der Bildschirmfenster an einer Eingabeaufforderung einen halb geschriebenen Befehl enthält oder eine andere Anwendung als eine Shell ausführt (z. B. emacs, top). Wenn dies ein Problem ist, habe ich einige Ideen:

  • Um halbgeschriebene Befehle zu entfernen, können Sie "^ C" an den Anfang des Befehls setzen.
  • Um zu vermeiden, dass der Befehl in einem Emacs-Fenster usw. ausgeführt wird, können Sie `at 'auffordern, nach Fenstertitel usw. zu filtern (im obigen Beispiel verwende ich" # ", das mit allen Fenstern übereinstimmt, aber Sie können nach Fenstertitel und Benutzer filtern , usw).

Verwenden Sie Folgendes, um den Befehl in einem bestimmten Fenster (gekennzeichnet durch die Fensternummer) auszuführen:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
Patrick Conheady
quelle
Super Einzeiler, der keine anderen Nebenwirkungen zu haben scheint, danke!
Cyril Duchon-Doris
17

Mit newgrpBefehl Problem für mich gelöst:

newgrp <GroupName>

Dieser Blog-Beitrag enthält ausführliche Erklärungen.

Pavan Vegirouthu
quelle
12

Gruppen werden normalerweise bei der Anmeldung aufgelistet. Ich kenne keine Möglichkeit, die erneute Aufzählung von Gruppen zu erzwingen, ohne sich abzumelden und wieder anzumelden.

Viele der hier abgegebenen Antworten scheinen eine Problemumgehung zu verwenden, die eine neue Shell mit einer neuen Umgebung aufruft (wie das erneute Anmelden). Die übergeordnete Shell und alle anderen ununterbrochen laufenden Programme erhalten die neue Gruppenmitgliedschaft im Allgemeinen erst dann, wenn sie von einer neuen Shell erneut aufgerufen werden, normalerweise nach einem sauberen Abmelden und Anmelden.

Mister_Tom
quelle
Ehrlich gesagt bin ich mir ziemlich sicher, dass dies nicht stimmt - ich hatte zuvor einen Weg gefunden, dies auf einer Linux-Box zu tun. Für mein ganzes Leben kann ich mich jedoch nicht erinnern, was der Befehl war. Wenn ich es finde, werde ich es posten. Edit: Hab es gerade gefunden, ich poste es als Antwort.
lunchmeat317
1
Vielen Dank für den Hinweis, das ist auch mein Verständnis. Jede andere Antwort hier öffnet einfach eine neue Shell, egal ob sie eine offene Shell ersetzt oder den Bildschirm neu startet oder was auch immer. Es gibt kein magisches Allheilmittel, um einen Befehl oder ein Skript auszugeben, und jede laufende Sitzung, einschließlich Ihrer X-Sitzung, spiegelt die neuen Gruppenmitgliedschaften wider.
Scravy
12

Du kannst das.

Fügen Sie so viele Gruppen hinzu, wie Sie möchten usermod -G. Führen Sie dann als Benutzer mit einer laufenden Sitzung newgrp -nur das Argument '-' aus.

Dadurch wird die Gruppen-ID auf den Standardwert zurückgesetzt, es werden jedoch auch die sekundären Gruppen festgelegt. Sie können dies überprüfen, indem Sie in groupsder aktuellen Sitzung vor und nach dem usermodund dem ausführen newgrp.

Dies muss von jeder offenen Sitzung ausgeführt werden - ich weiß nicht viel über Bildschirm. Wenn es jedoch möglich ist, alle offenen Sitzungen zu durchlaufen und auszuführen newgrp, sollten Sie gut sein. Sie müssen sich keine Sorgen machen, ob Sie die Gruppen oder die Gruppen-IDs kennen.

Viel Glück für Sie.

lunchmeat317
quelle
11
habe ein xterm innerhalb einer X-Sitzung ausprobiert, aber es hat nicht funktioniert
dwery
3
versuchte auf einer Sitzung in tmux und es entweder gar nicht dort arbeiten
Michael
2
Versucht auf Amazon Linux 2, es hat nicht funktioniert
Cyril Duchon-Doris
1
newgrp -startet einen neuen Shell-Prozess
Piotr Findeisen
In Anbetracht Ihres Kommentars zur Antwort von Mister_Tom ist dies, wie alle anderen Antworten, eine Problemumgehung. Die Antwort von Mister_Tom ist immer noch richtig.
Scravy
4

Zusammenfassen:

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

Wenn Sie 'exec' verwenden, wird die vorhandene Shell durch die neue Shell ersetzt, die mit dem Befehl newgrp gestartet wurde. Wenn Sie also die neue Shell verlassen, werden Sie abgemeldet.

Das Finale newgrp -wird benötigt, um Ihre normale primäre Gruppe wiederherzustellen, sodass Dateien, die Sie später erstellen, diese als Gruppeneigentümer haben.

Hinweis: Die Frage des ursprünglichen Posters lautete, wie neu hinzugefügte Gruppen in vorhandenen Prozessen sichtbar gemacht werden können. Die Befehle gpasswdund wirken usermodsich nicht auf vorhandene Prozesse aus. Neu hinzugefügte (oder gelöschte!) Gruppen erscheinen (verschwinden aus) Ihrem Konto, dh in den Dateien / etc / group und / etc / gshadow, aber die Berechtigungen für vorhandene Prozesse werden nicht geändert. Um Berechtigungen zu entfernen , müssen Sie alle laufenden Prozesse beenden. newgrp -liest / etc / group nicht erneut und setzt die Gruppenliste zurück; Stattdessen werden scheinbar nur die zuvor mit dem Prozess verknüpften Gruppen verwendet.

jimav
quelle
Übrigens exec su - <username>kann verwendet werden, um eine neue Anmeldeshell mit festgelegten Gruppen zu erhalten, aber das funktioniert in Skripten nicht, da eine neue Shell Befehle vom Terminal liest. Sie können su -c "command ..." <myusername>Ihr Skript auch neu starten, der resultierende Prozess hat jedoch kein steuerndes Terminal. Daher tritt ein Fehler auf, wenn ein Bildschirmeditor oder ein anderer interaktiver Befehl ausgeführt wird.
10.
Warum wurde das abgelehnt? Kann jemand erklären, was daran so schlimm ist, weil es mir eingefallen ist und ich denke, es gefällt mir am besten?
jasonmp85
Gah, ich habe vor dem Testen abgestimmt. newgrp -ersetzt nicht die "primäre Gruppe". Patrick Conheadys Antwort ist hier die beste, da sie die primäre Gruppe weder gabelt noch verändert.
jasonmp85
1

Ich hatte ähnliches Problem aber auch für nicht angemeldete Benutzer. Neustart von nscd nicht helfen, aber die Ausführung des Befehls tat nscd -i group. Das sollte nscd (Caching Daemon) anweisen, die Gruppendatei neu zu laden.

Marki555
quelle
1

Ich konnte den Befehl newgrp nicht zum Laufen bringen. Ich bin nicht sicher, ob dies von / etc / sudoers abhängt, aber ich muss normalerweise mein Passwort für sudo eingeben, und das hat funktioniert, ohne dass mein Passwort erforderlich ist:

[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
snuggles08
quelle
0

Dies ist der Trick, den Sie haben, sudound erspart Ihnen in einigen Fällen die erneute Eingabe Ihres Passworts:

sudo su $USER
Guaka
quelle