Załaduj ponownie zadania grupy użytkowników systemu Linux bez wylogowania

348

Podczas przypisywania listy grup drugorzędnych użytkownika za pomocą:

# usermod -G <grouplist> <user>

czy można wymusić, aby to przypisanie grupy zaczęło obowiązywać bez wylogowywania się z wszystkich uruchomionych sesji?

Byłoby to bardzo przydatne w sytuacji, gdy istnieje sesja Screen z wieloma uruchomionymi powłokami, ponieważ zasadniczo cała sesja musi zostać zniszczona, aby przypisanie do grupy stało się skuteczne.

Myślę, że mogę zmienić grupę podstawową użytkownika w działającej powłoce za pomocą newgrppolecenia - czy istnieje jakaś alternatywa, która działałaby dla grup drugorzędnych?

Idealnie chciałbym mieć coś, co zadziałałoby w każdej powłoce bez uruchamiania w każdej z nich ręcznie, ale w przeciwnym razie, może jakiś sposób zmuszenia Screena do wykonania tego samego polecenia w każdej z nich.

Szymon
źródło
Wiem, że przynajmniej w przypadku niektórych menedżerów okien / sesji można to zrobić w taki sposób, że sesja wybiera nową grupę i jest dostępna dla wszystkich nowych procesów uruchamianych z menu, przycisków panelu lub cokolwiek innego. Właśnie tu przyszedłem, żeby to znaleźć, więc nie mogę powiedzieć, jak to zrobić, i prawdopodobnie jest to specyficzne dla menedżera okien.
mc0e

Odpowiedzi:

205

Okropnie hacky, ale możesz użyć dwóch warstw, newgrpaby osiągnąć to dla konkretnej grupy:

id -g

... poda bieżący identyfikator grupy podstawowej. Nazwiemy to orig_groupna potrzeby tego przykładu. Następnie:

newgrp <new group name>

... przełączy Cię do tej grupy jako podstawowej i doda ją do listy grup zwróconych przez groupslub id -G. Teraz kolejne:

newgrp <orig_group>

... dostaniesz powłokę, w której możesz zobaczyć nową grupę, a podstawową jest ta oryginalna.

Jest to okropne i powoduje, że dodawana jest tylko jedna grupa na raz, ale pomogło mi to kilka razy, aby dodać grupy bez wylogowania / w całej mojej sesji X (np. Aby dodać bezpiecznik jako grupę do użytkownika aby sshfs działał).

Edycja: Nie wymaga to również wpisania hasła, co suspowoduje.

Legooolas
źródło
6
Fajna sztuczka, podoba mi się
Simon,
1
W Fedorze musiałem to zrobić newgrp $USERzamiast newgrp <orig_group>. Oznacza to, że nie musiałem znajdować oryginalnego identyfikatora grupy podstawowej, więc jest to nawet łatwiejsze niż to rozwiązanie.
Richard Turner
2
Stwierdziłem, że to wystarczy newgrp <new group name>. To był Ubuntu 14.04
Edward Falk
4
@EdwardFalk racja, ale nie chcesz (możesz nie) opuścić tej grupy jako swojej podstawowej ...
mimoralea
4
Zauważ, że każda z nich newgrptworzy nową powłokę, więc kiedy musisz całkowicie wyjść z sesji, musisz zrobić „exit exit exit”, aby się wydostać (:
jwd
370

Z poziomu powłoki możesz wydać następujące polecenie

su - $USER

id wyświetli teraz nową grupę:

id
stivlo
źródło
3
Myślę, że to najlepsze podejście w wielu przypadkach, ale oryginalny plakat chciał zaktualizować wiele powłok w sesji ekranowej. To rozwiązanie byłoby wykonane z każdej powłoki.
Adrian Ratnapala,
3
Dobra sztuczka, działa świetnie!
genpfault
4
Oryginalne rozwiązanie naprawiałoby również tylko jedną sesję powłoki na ekranie. Właśnie to przetestowałem. Powodem, dla którego działa to rozwiązanie, jest to, że odradzasz kompletną nową sesję zamiast dziedziczenia z oryginalnego środowiska.
Dror
4
To naprawdę powinna być zaakceptowana odpowiedź. Niezła sztuczka, dzięki!
dotancohen,
2
Wymaga to jednak wpisania hasła, które może być niezręczne / niepożądane, jeśli próbujesz to zrobić w wielu sesjach.
Legooolas,
155

Ta fajna sztuczka z tego linku działa świetnie!

exec su -l $USER

Pomyślałem, że opublikuję go tutaj, ponieważ za każdym razem, gdy zapominam, jak to zrobić, jest to pierwszy link, który pojawia się w Google.

jhaagsma
źródło
14
+1 za nie umieszczanie użytkownika w podpowłoce; dzięki temu możesz się wylogować / wyjść jak zwykle. Ponadto jeśli NOPASSWD: jest ustawione w / etc / sudoers, możesz zamiast tego użyć, exec sudo su -l $USERaby uniknąć monitowania o hasło.
Ivan X
21
Uwaga: zostaniesz poproszony o podanie hasła sudo. Jeśli pomylisz się, terminal zostanie zamknięty.
Tyler Collier
1
@TylerCollier Ivan zrobił wzmiankęNOPASSWD:
pepoluan
32

1. Uzyskiwanie powłoki z nową grupą bez wylogowania i ponownego zalogowania

Jeśli dodajesz tylko jedną grupę, użyłem następujących:

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

Jest to odmiana dwuwarstwowej sztuczki newgrp Legooolas, ale jest w jednym wierszu i nie wymaga ręcznego wprowadzania grupy podstawowej.

sgjest newgrp, ale przyjmuje polecenie wykonania z nowym identyfikatorem grupy. Te execśrodki, że nowa powłoka zastępuje istniejącą powłokę, dzięki czemu nie trzeba „wylogowania” dwukrotnie.

W przeciwieństwie do su, nie musisz wpisywać swojego hasła. Nie odświeża również twojego środowiska (oprócz dodawania grupy), więc zachowujesz swój bieżący katalog roboczy itp.

2. Wykonanie polecenia we wszystkich oknach ekranu w sesji

atKomenda w ekran uruchamia polecenie w cokolwiek okna można określić (zauważ, że jest to polecenie ekranu, a nie polecenie powłoki).

Możesz użyć następującego polecenia, aby wysłać polecenie do wszystkich istniejących sesji Screen:

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

Zwróć uwagę na potrzebę ucieczki przed backstickami, aby iduruchomić w sesji Screen, oraz ^ M, aby Screen uderzył „enter” na końcu twojego polecenia.

Zauważ też, że stuffpolecenie screena po prostu wpisuje tekst polecenia w twoim imieniu. Dlatego może się zdarzyć coś dziwnego, jeśli jedno z okien ekranowych ma w połowie napisane polecenie w wierszu polecenia lub uruchamia aplikację inną niż powłoka (np. Emacs, top). Jeśli to jest problem, mam kilka pomysłów:

  • Aby pozbyć się w połowie napisanego polecenia, możesz dodać „^ C” na początku polecenia.
  • Aby uniknąć uruchamiania polecenia w oknie emacsa itp., Możesz poprosić `at 'o filtrowanie według tytułu okna itp. (W powyższym przykładzie używam„ # ”, który pasuje do wszystkich okien, ale możesz filtrować według tytułu okna, użytkownika itp.).

Aby uruchomić polecenie w określonym oknie (oznaczonym numerem okna), użyj następujących poleceń:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
Patrick Conheady
źródło
Wspaniale jedna wkładka, która nie wydaje się mieć innych skutków ubocznych, dzięki!
Cyril Duchon-Doris
17

Za pomocą newgrppolecenia rozwiązał problem dla mnie:

newgrp <GroupName>

Ten post na blogu zawiera szczegółowe wyjaśnienia.

Pavan Vegirouthu
źródło
12

Grupy są zwykle wyliczane przy logowaniu, nie ma sposobu, aby zmusić je do ponownego wykonania wyliczenia grup bez wylogowania i ponownego zalogowania.

Wydaje się, że w wielu głosowaniach tutaj zastosowano obejście, które wywołuje nową powłokę ze świeżym środowiskiem (tak samo jak ponowne logowanie). powłoka nadrzędna i wszystkie inne stale działające programy na ogół nie otrzymają nowego członkostwa w grupie, dopóki nie zostaną ponownie wywołane ze świeżej powłoki, zwykle po czystym wylogowaniu i zalogowaniu.

Mister_Tom
źródło
Prawdę mówiąc, jestem prawie pewien, że to nieprawda - wcześniej znalazłem sposób na zrobienie tego na Linux-ie. Jednak przez całe życie nie pamiętam, jaki był rozkaz. Jeśli go znajdę, opublikuję go. Edycja: Właśnie znalazłem, wysyłam jako odpowiedź.
lunchmeat317
1
Dziękuję za zwrócenie na to uwagi, to także moje zrozumienie. Każda inna odpowiedź tutaj po prostu otwiera nową powłokę, bez względu na to, czy zastępuje jedną otwartą powłokę, czy uruchamia ponownie ekran, czy cokolwiek innego. Nie ma magicznego panaceum na wydanie polecenia lub skryptu, a każda uruchomiona sesja, w tym sesja X, odzwierciedla nowe członkostwo w grupie.
scravy
12

Możesz to zrobić.

Dodaj tyle grup, ile chcesz usermod -G. Następnie jako użytkownik z uruchomioną sesją uruchom newgrp -tylko argument „-”.

Powoduje to ponowne ustawienie identyfikatora grupy na wartość domyślną, ale spowoduje także ustawienie grup pomocniczych. Możesz to sprawdzić, uruchamiając groupsz bieżącej sesji, przed i po usermodoraz newgrp.

To musi być uruchamiane z każdej otwartej sesji - niewiele wiem o ekranie. Jeśli jednak można iterować wszystkie otwarte sesje i biegać newgrp, powinieneś być dobry. Nie musisz się martwić o znajomość grup lub identyfikatorów grup.

Powodzenia.

lunchmeat317
źródło
11
próbowałem xtermu w sesji X, ale nie zadziałało
dw
3
przymierzyłem sesję w tmux i tam też to nie działało
Michael
2
Wypróbowany na Amazon linux 2, nie zadziałał
Cyril Duchon-Doris
1
newgrp -rozpoczyna nowy proces powłoki
Piotr Findeisen
W świetle twojego komentarza do odpowiedzi Mister_Tom jest to, podobnie jak wszystkie inne odpowiedzi, obejście. Odpowiedź Mister_Tom jest nadal poprawna.
scravy
4

Podsumowując:

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

Użycie „exec” oznacza zastąpienie istniejącej powłoki nową powłoką uruchomioną przez komendę newgrp (więc wyjście z nowej powłoki powoduje wylogowanie).

Wersja ostateczna newgrp -jest potrzebna do przywrócenia normalnej grupy podstawowej, więc pliki, które później utworzysz, będą miały tego właściciela.

Uwaga: pytanie oryginalnego plakatu brzmiało, jak sprawić, by nowo dodane grupy były widoczne w istniejących procesach. gpasswdI usermodpolecenia nie wpływa na istniejące procesy; nowo dodane (lub usunięte!) grupy pojawiają się w (znikają) z twojego konta, tj. w plikach / etc / group i / etc / gshadow, ale uprawnienia dla istniejących procesów nie są zmieniane. Aby usunąć uprawnienia, musisz zabić wszystkie uruchomione procesy; newgrp -nie odczyta ponownie pliku / etc / group i nie zresetuje listy grup; zamiast tego wydaje się po prostu korzystać z grup wcześniej powiązanych z procesem.

jimav
źródło
Nawiasem mówiąc, exec su - <username>można go użyć do uzyskania nowej powłoki logowania z ustawionymi grupami, ale to nie zadziała w skryptach, ponieważ nowa powłoka odczyta polecenia z terminala. Możesz użyć su -c "command ..." <myusername>do zrestartowania skryptu, ale wynikowy proces nie ma kontrolującego terminala, więc wystąpi błąd, jeśli spróbujesz użyć edytora ekranu lub innego interaktywnego polecenia.
jimav
Dlaczego zostało to zanegowane? Czy ktoś może wyjaśnić, co jest w tym złego, ponieważ to właśnie przyszło mi do głowy i myślę, że najbardziej mi się podoba?
jasonmp85
Gah, zagłosowałem przed testem. newgrp -czy nie zastąpić „pierwotną grupę”. Odpowiedź Patricka Conheady'ego jest tutaj najlepsza, ponieważ nie rozwidla ani nie zmienia grupy podstawowej.
jasonmp85
1

Miałem podobny problem, ale także dla niezalogowanych użytkowników. Restart nscd nie pomogło, ale wykonanie tego polecenia nie: nscd -i group. To powinno poinstruować nscd (demona buforowania), aby ponownie załadował plik grup.

Marki555
źródło
1

Nie mogłem uruchomić polecenia newgrp. Nie jestem pewien, czy zależy to od / etc / sudoers, ale zwykle muszę wpisać hasło do sudo, i działało to bez wymagania hasła:

[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
źródło
0

To załatwia sudosprawę, jeśli masz, i może uchronić Cię przed ponownym wprowadzeniem hasła w niektórych przypadkach:

sudo su $USER
guaka
źródło