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


Beim Zuweisen der sekundären Gruppenliste eines Benutzers mithilfe von:

# usermod -G <grouplist> <user>

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

Dies wäre sehr nützlich in der Situation, in der a Bildschirm Die Sitzung existiert mit vielen laufenden Shells, da die gesamte Sitzung im Wesentlichen zerstört werden muss, damit die Gruppenzuweisung wirksam wird.

Ich denke, dass ich die primäre Gruppe des Benutzers in einer laufenden Schale ändern kann, die das verwendet newgrp Befehl - Gibt es eine Alternative, die für sekundäre Gruppen funktionieren würde?

Idealerweise möchte ich etwas, das in jeder Shell wirksam wird, ohne manuell in jedem einzelnen ausgeführt zu werden, aber wenn das nicht gelingt, könnte Screen gezwungen sein, denselben Befehl in jedem auszuführen.


254
2018-04-17 19:50


Ursprung


Ich weiß, dass es zumindest für einige Fenster- / Session-Manager möglich ist, dies so zu tun, dass die Sitzung die neue Gruppe aufnimmt und sie für alle neuen Prozesse verfügbar ist, die von den Menüs, Bedienfeldschaltflächen oder was auch immer gestartet werden. Ich bin gerade erst hierher gekommen, um das wieder zu finden, also kann ich jetzt nicht genau sagen, wie es geht, und es ist wahrscheinlich spezifisch für den Fenstermanager. - mc0e


Antworten:


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

id -g

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

newgrp <new group name>

... werden Sie als primäre Gruppe zu dieser Gruppe wechseln und sie der Liste der zurückgegebenen Gruppen hinzufügen groups oder id -G. Jetzt, ein weiteres:

newgrp <orig_group>

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

Das ist schrecklich und bringt nur jeweils eine Gruppe hinzu, aber es hat mir ein paar Mal geholfen, Gruppen hinzuzufügen, ohne mich in meiner gesamten X-Sitzung abzumelden (zB um die Sicherung als Gruppe einem Benutzer hinzuzufügen) damit sshfs funktioniert).

Edit: Dazu müssen Sie auch nicht Ihr Passwort eingeben, welches su werden.


149
2017-10-10 17:36



Netter Trick, ich mag es - Simon
Auf Fedora musste ich machen newgrp $USER Anstatt von newgrp <orig_group>. Das bedeutet, dass ich meine ursprüngliche primäre Gruppen-ID nicht finden musste, also ist es noch einfacher als diese Lösung. - Richard Turner
Ich fand, es war genug zu tun newgrp <new group name>. Das war Ubuntu 14.04 - Edward Falk
@ EdwardFalk richtig, aber Sie wollen (vielleicht nicht) diese Gruppe als Ihre primäre verlassen ... - mimoralea
Beachten Sie, dass jeder newgrp erstellt eine neue Shell. Wenn Sie also Ihre Sitzung vollständig beenden müssen, müssen Sie "exit exit exit" ausführen, um den vollständigen Zugriff zu erhalten (: - jwd


In einer Shell können Sie den folgenden Befehl eingeben

su - $USER

id wird nun die neue Gruppe auflisten:

id

252
2017-11-06 15:28



Ich denke, dass dies in vielen Fällen der beste Ansatz ist, aber das ursprüngliche Poster wollte mehrere Shells innerhalb einer Bildschirmsitzung aktualisieren. Diese Lösung müsste von jeder Shell aus durchgeführt werden. - Adrian Ratnapala
Netter Trick, funktioniert super! - genpfault
Die ursprüngliche Lösung würde auch nur eine einzelne Shell-Sitzung im Bildschirm beheben. Ich habe das gerade getestet. Der Grund, warum diese Lösung funktioniert, liegt darin, dass Sie eine vollständig neue Sitzung generieren und nicht von der ursprünglichen Umgebung übernehmen. - Dror
Das sollte wirklich die akzeptierte Antwort sein. Netter Trick, danke! - dotancohen
Dies erfordert jedoch die Eingabe eines Passworts, was unangenehm / unerwünscht sein kann, wenn Sie es in vielen Sitzungen versuchen. - Legooolas


Dieser raffinierte Trick von dieser Link funktioniert super!

exec su -l $USER

Ich dachte, ich würde es hier veröffentlichen, wie jedes Mal, wenn ich vergesse, wie dies zu tun ist, ist dies der erste Link, der in Google auftaucht.


115
2018-06-18 16:27



+1, um den Benutzer nicht in eine Subshell zu versetzen; Sie können sich wie gewohnt abmelden / verlassen. Wenn NOPASSWD: in / etc / sudoers festgelegt ist, können Sie stattdessen auch verwenden exec sudo su -l $USER um zu vermeiden, zur Eingabe eines Passworts aufgefordert zu werden. - Ivan X
Hinweis: Sie werden nach einem Sudo-Passwort gefragt. Wenn Sie es falsch verstehen, wird Ihr Terminal geschlossen. - Tyler Collier
@TylerCollier Ivan hat getan erwähnen NOPASSWD: - pepoluan


1. Eine Shell mit der neuen Gruppe abrufen, ohne sich an- und abmelden zu müssen

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

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

Dies ist eine Variation von Legooolas 'Zwei-Ebenen-Newgrp-Trick, aber es ist in einer Zeile und erfordert nicht, dass Sie Ihre primäre Gruppe manuell eingeben.

sg ist newgrp, akzeptiert aber einen Befehl zur Ausführung mit der neuen Gruppen-ID. Das exec bedeutet, 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 beibehalten usw.

2. Ausführen des Befehls in allen Bildschirmfenstern einer Sitzung

Das at Befehl in Screen führt einen Befehl in jedem Fenster aus, das Sie angeben (beachten Sie, dass dies ein Screen-Befehl und kein Shell-Befehl ist).

Sie können den folgenden Befehl verwenden, um den Befehl an alle vorhandenen Bildschirmsitzungen zu senden:

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

Beachten Sie die Notwendigkeit, die Backticks zu entkommen id um in der Bildschirmsitzung zu laufen, und mit ^ M wird Screen dazu gebracht, am Ende des Befehls 'Enter' zu drücken.

Beachten Sie auch diesen Bildschirm stuff Der Befehl gibt einfach den Befehlstext in Ihrem Namen ein. Daher kann etwas Seltsames passieren, wenn eines der Bildschirmfenster an einer Eingabeaufforderung einen halbgeschriebenen Befehl hat oder eine andere Anwendung als eine Shell ausführt (z. B. emacs, top). Wenn das ein Problem ist, habe ich einige Ideen:

  • Um jeden halbgeschriebenen Befehl loszuwerden, können Sie am Anfang des Befehls "^ C" hinzufügen.
  • Um zu verhindern, dass der Befehl in einem Emacs-Fenster usw. ausgeführt wird, könnten Sie `at 'fragen, um den Fenstertitel usw. zu filtern (im obigen Beispiel verwende ich" # ", das allen Fenstern entspricht, aber Sie können nach Fenstertitel, Benutzer filtern) , etc).

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

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

19
2017-12-17 21:33



Super One Liner, der scheinbar keine anderen Nebenwirkungen hat, danke! - Cyril Duchon-Doris


Du kannst das.

Fügen Sie beliebig viele Gruppen hinzu usermod -G. Führen Sie als Benutzer mit einer laufenden Sitzung dann aus newgrp - mit nur dem '-' Argument.

Dadurch wird die Gruppen-ID neu initialisiert, aber auch die sekundären Gruppen. Sie können dies überprüfen, indem Sie ausführen groups von der aktuellen Sitzung, vor und nach der usermod und das newgrp.

Dies muss von jeder offenen Sitzung aus ausgeführt werden - ich weiß nicht viel über den Bildschirm. Wenn es jedoch möglich ist, über alle geöffneten Sitzungen zu iterieren und auszuführen newgrpDu solltest gut sein. Sie müssen sich keine Gedanken über die Gruppen oder die Gruppen-IDs machen.

Viel Glück für Sie.


14
2018-01-30 16:17



versucht auf einem Xterm innerhalb einer X-Sitzung, aber es hat nicht funktioniert - dwery
versuchte in einer Session in tmux und es funktionierte dort auch nicht - Michael
Versucht auf Amazon Linux 2, hat es nicht funktioniert - Cyril Duchon-Doris
newgrp - Startet einen neuen Shell-Prozess - Piotr Findeisen


Gruppen werden normalerweise bei der Anmeldung aufgelistet. Es gibt keine Möglichkeit, sie zu zwingen, die Gruppenaufzählung zu wiederholen, ohne sich abzumelden und wieder einzusteigen.

Viele Antworten, die hier gewählt wurden, scheinen eine Problemumgehung zu verwenden, die eine neue Shell mit einer neuen Umgebung aufruft (genau wie beim erneuten Anmelden). Die Parent-Shell und alle anderen fortlaufend ausgeführten Programme erhalten die neue Gruppenmitgliedschaft normalerweise nicht, bis sie nach einer sauberen Abmeldung und einem Login von einer neuen Shell neu aufgerufen werden.


12
2018-04-25 17:56



Ehrlich gesagt bin ich mir ziemlich sicher, dass das nicht stimmt - ich hatte einen Weg gefunden, es vorher auf einer Linux-Box zu machen. Aber für das Leben von mir kann ich mich nicht erinnern, was der Befehl war. Wenn ich es finde, werde ich es posten. Edit: Gerade gefunden, ich poste es als Antwort. - lunchmeat317


Verwenden newgrp Befehl löste Problem für mich:

newgrp <GroupName>

Dieser Blogbeitrag hat eine detaillierte Erklärung.


10
2017-10-07 04:53



Willkommen bei Super User! Auf dieser Q & A-Site versuchen wir zu liefern gute Antworten zu Fragen, die Leute stellen. Ein Teil davon ist die Antwort in Ihrem Post, anstatt einfach einen Link zu einer anderen Seite bereitzustellen, die die Frage beantworten könnte. Bearbeiten Sie Ihre Antwort, um die tatsächliche Lösung für die gestellte Frage hinzuzufügen. - cascer1
Dies ist meiner Meinung nach der beste Weg und sollte als die neue akzeptierte Antwort markiert werden. - Dakatine


Zusammenfassen:

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

Die Verwendung von 'exec' bedeutet, dass die existierende Shell durch die neue Shell ersetzt wird, die mit dem Befehl newgrp gestartet wurde (so dass Sie die neue Shell abmelden).

Das endgültige newgrp - wird benötigt, um Ihre normale primäre Gruppe wiederherzustellen, so dass Dateien, die Sie später erstellen, diese als Gruppenbesitzer haben.

Hinweis: Die Frage des ursprünglichen Posters war, wie neu hinzugefügte Gruppen in vorhandenen Prozessen sichtbar gemacht werden. Das gpasswd und usermod Befehle wirken sich nicht auf bestehende Prozesse aus; neu hinzugefügte (oder gelöschte!) Gruppen werden in Ihrem Konto angezeigt, dh in den Dateien / etc / group und / etc / gshadow, die Berechtigungen für vorhandene Prozesse werden jedoch nicht geändert. Zu Löschen Berechtigungen müssen Sie alle laufenden Prozesse beenden; newgrp - wird / etc / group nicht erneut lesen und die Gruppenliste zurücksetzen; Stattdessen scheint es nur die zuvor mit dem Prozess verbundenen Gruppen zu verwenden.


4
2018-02-10 23:21



Apropos, exec su - <username> kann verwendet werden, um eine neue Login-Shell mit gesetzten Gruppen zu erhalten, aber das wird in Skripten nicht funktionieren, da eine neue Shell Befehle vom Terminal lesen wird. Du könntest benutzen su -c "command ..." <myusername> Um das Skript neu zu starten, hat der resultierende Prozess jedoch kein steuerndes Terminal. Daher wird ein Fehler auftreten, wenn ein Bildschirmeditor oder ein anderer interaktiver Befehl versucht wird. - jimav
Warum wurde das abgelehnt? Kann jemand erklären, was daran schlimm ist, weil es mir eingefallen ist und ich denke, dass es mir am besten gefällt? - jasonmp85
Gah, ich habe es vor dem Testen gewählt. newgrp - tut nicht Ersetze die "primäre Gruppe". Die Antwort von Patrick Conheady ist die beste, da sie weder die erste noch die erste Gruppe verändert. - jasonmp85


Ich hatte ein ähnliches Problem, aber auch für nicht eingeloggte Benutzer. Der Neustart von nscd hat nicht geholfen, aber die Ausführung dieses Befehls hat folgendes bewirkt: nscd -i group. Das sollte nscd (Caching-Daemon) anweisen, die Gruppendatei neu zu laden.


1
2017-11-13 16:07