it-swarm.com.de

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

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 wäre sehr nützlich in Situationen, 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 Befehl newgrp ä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.

312
Simon

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

id -g

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

newgrp <new group name>

... wechselt zu dieser Gruppe als primäre und fügt sie der Liste der von groups oder id -G zurückgegebenen Gruppen hinzu. 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.

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

Bearbeiten: Dies erfordert nicht, dass Sie Ihr Passwort eingeben, die su wird.

188
Legooolas

In einer Shell können Sie den folgenden Befehl eingeben

su - $USER

id listet nun die neue Gruppe auf:

id
331
stivlo

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.

144
jhaagsma

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 steht in einer Zeile und erfordert nicht, dass Sie Ihre primäre Gruppe manuell eingeben.

sg ist newgrp, akzeptiert jedoch einen Befehl zur Ausführung mit der neuen Gruppen-ID. Die 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 usw. behalten.

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

Der Befehl at in Screen führt einen Befehl in jedem von Ihnen angegebenen Fenster aus (beachten Sie, dass dies ein Bildschirmbefehl und kein Shell-Befehl ist).

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 die Backticks umgangen werden müssen, damit id in der Screen-Sitzung ausgeführt wird, und ^ M, damit Screen am Ende Ihres Befehls die Eingabetaste drückt.

Beachten Sie auch, dass der Befehl stuff 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 hat oder eine andere Anwendung als eine Shell ausführt (z. B. emacs, oben). Wenn dies ein Problem ist, habe ich einige Ideen:

  • Um halb geschriebene 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 allen Fenstern entspricht, 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"
30

Du kannst das.

Fügen Sie mithilfe von usermod -G so viele Gruppen hinzu, wie Sie möchten. Führen Sie dann als Benutzer mit einer laufenden Sitzung newgrp - nur mit dem 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 groups in der aktuellen Sitzung vor und nach der usermod und der newgrp ausführen.

Dies muss von jeder offenen Sitzung ausgeführt werden - ich weiß nicht viel über Bildschirm. Wenn es jedoch möglich ist, über alle offenen Sitzungen zu iterieren und newgrp auszuführen, 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.

13
lunchmeat317

Gruppen werden normalerweise bei der Anmeldung aufgelistet. Es gibt 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 fortlaufenden Programme erhalten die neue Gruppenmitgliedschaft in der Regel erst dann, wenn sie von einer neuen Shell erneut aufgerufen werden. Dies erfolgt in der Regel nach einem sauberen Abmelden und Anmelden.

12
Mister_Tom

Die Verwendung des Befehls newgrp hat das Problem für mich gelöst:

newgrp <GroupName>

Dieser Blog-Beitrag hat detaillierte Erklärung.

12

Zusammenfassen:

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

Die Verwendung von 'exec' bedeutet, dass die vorhandene Shell durch die neue Shell ersetzt wird, die mit dem Befehl newgrp gestartet wurde (wenn Sie die neue Shell verlassen, werden Sie abgemeldet).

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

Hinweis: Die Frage des ursprünglichen Posters lautete, wie neu hinzugefügte Gruppen in vorhandenen Prozessen sichtbar gemacht werden sollen. Die Befehle gpasswd und usermod wirken sich nicht auf vorhandene Prozesse aus. Neu hinzugefügte (oder gelöschte!) Gruppen werden in Ihrem Konto angezeigt (aus Ihrem Konto entfernt), d. h. in den Dateien/etc/group und/etc/gshadow. Die Berechtigungen für vorhandene Prozesse werden jedoch 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.

4
jimav

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

1
Marki555

Etwas zu spät zur Party sollte gpasswd den Job erledigen, ohne eine neue Session zu erstellen:

$ gpasswd -a user groupname

Sie können eine einzelne Gruppe gleichzeitig ändern, aber Sie können alle ihre Mitglieder festlegen:

$ gpasswd -M user1,user2 groupname
0
Tombart

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:

[[email protected]:~]$ groups
users wheel

[[email protected]:~]$ Sudo echo hi
[Sudo] password for leo60228:
hi

[[email protected]:~]$ Sudo -k # reset Sudo timeout

[[email protected]:~]$ exec Sudo -i -u $(whoami) # no password necessary

[[email protected]:~]$ groups
users wheel docker
0
snuggles08

Dies ist der Trick, wenn Sie Sudo haben, und es kann Sie in einigen Fällen davon abhalten, Ihr Passwort noch einmal einzugeben:

Sudo su $USER
0
guaka