2011-04-17 19:50:06 +0000 2011-04-17 19:50:06 +0000
377
377

Przeładuj przypisania grupowe użytkownika Linuksa bez wylogowania

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

# usermod -G <grouplist> <user>

czy można wymusić, aby przypisanie grupowe stało się skuteczne bez wylogowania wszystkich uruchomionych sesji?

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

Myślę, że mogę zmienić główną grupę użytkownika w działającej powłoce używając komendy newgrp - czy jest jakaś alternatywa, która zadziałałaby dla grup drugorzędnych?

Idealnie, chciałbym czegoś, co zadziałałoby w każdej powłoce bez uruchamiania ręcznego w każdej z nich, ale w przeciwnym razie, może jakiś sposób zmuszenia Screena do wykonania tej samej komendy w każdej.

Antwoorden (12)

400
400
400
2011-11-06 15:28:07 +0000

Z wnętrza powłoki, możesz wydać następującą komendę

su - $USER

id wyświetli teraz nową grupę:

id
221
221
221
2011-10-10 17:36:48 +0000

Strasznie hakky, ale można użyć dwóch warstw newgrp, aby to osiągnąć dla konkretnej grupy:

id -g

…dadzą Ci aktualny identyfikator grupy głównej. Nazywamy to orig_group dla celów tego przykładu. Następnie:

newgrp <new group name>

…przełączymy Cię do tej grupy jako podstawowej i dodamy ją do listy grup zwróconych przez groups lub id -G. Następnie:

newgrp <orig_group>

…dostaniesz muszlę, w której zobaczysz nową grupę, a pierwotna jest oryginalna.

To jest straszne i da ci tylko jedną grupę dodaną na raz, ale pomogło mi to kilka razy w dodaniu grup bez wylogowania w całej mojej sesji X (e. g. dodać bezpiecznik jako grupę do użytkownika, aby sshfs działał).

Edit : To nie wymaga również wpisania hasła, które su will.

168
168
168
2013-06-18 16:27:30 +0000

Ta sprytna sztuczka z ten link działa świetnie!

exec su -l $USER

Pomyślałem, że umieszczę ją tutaj, ponieważ za każdym razem gdy zapomnę jak to zrobić, jest to pierwszy link, który pojawia się w google.

35
35
35
2014-12-17 21:33:21 +0000

1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania

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

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

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

sg jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. exec oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz “wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie at w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania 

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


exec sg newgrp id -gn “`

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

id jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. stuff oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz "wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie &007 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

id -gn### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania

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

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

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

&007 jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. &007 oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz “wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie [ &007 ]&003 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

^M" “`

Zauważ, że trzeba uciec od backtick'ów, aby uzyskać &007 do uruchomienia w sesji Screen, a ^M do uzyskania Screen'a, aby uzyskać ‘enter’ na końcu Twojej komendy.

Zauważ również, że komenda ekranowa [ &007 ]&003 po prostu wpisuje tekst komendy w Twoim imieniu. Dlatego coś dziwnego może się zdarzyć, jeśli jedno z okien ekranu ma napisane w połowie polecenie w wierszu poleceń lub uruchamia aplikację inną niż powłoka (np. emacs, top). Jeśli jest to problem, mam kilka pomysłów:

  • Aby pozbyć się dowolnego półpisanego polecenia, możesz dodać ”^C" do początku polecenia.
  • Aby uniknąć uruchamiania komendy w oknie emacsa, itp., możesz poprosić `at’ o filtrowanie po tytule okna, itp. (w powyższym przykładzie używam “#”, który pasuje do wszystkich okien, ale możesz filtrować po tytule okna, użytkowniku, itp.

Aby uruchomić komendę w konkretnym oknie (identyfikowanym po numerze okna), użyj następującego:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp ### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania 

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


exec sg newgrp id -gn “`

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

&007 jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. &007 oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz "wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie [ &007 ]&003 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania 

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


exec sg newgrp id -gn “`

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

&007 jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. &007 oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz "wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie [ &007 ]&003 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

id -gn### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania

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

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

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

&007 jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. &007 oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz “wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie [ &007 ]&003 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

^M" “`

Zauważ, że trzeba uciec od backtick'ów, aby uzyskać &007 do uruchomienia w sesji Screen, a ^M do uzyskania Screen'a, aby uzyskać ‘enter’ na końcu Twojej komendy.

Zauważ również, że komenda ekranowa [ &007 ]&003 po prostu wpisuje tekst komendy w Twoim imieniu. Dlatego coś dziwnego może się zdarzyć, jeśli jedno z okien ekranu ma napisane w połowie polecenie w wierszu poleceń lub uruchamia aplikację inną niż powłoka (np. emacs, top). Jeśli jest to problem, mam kilka pomysłów:

  • Aby pozbyć się dowolnego półpisanego polecenia, możesz dodać ”^C" do początku polecenia.
  • Aby uniknąć uruchamiania komendy w oknie emacsa, itp., możesz poprosić `at’ o filtrowanie po tytule okna, itp. (w powyższym przykładzie używam “#”, który pasuje do wszystkich okien, ale możesz filtrować po tytule okna, użytkowniku, itp.

Aby uruchomić komendę w konkretnym oknie (identyfikowanym po numerze okna), użyj następującego:

id -gn### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania

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

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

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

&007 jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. &007 oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz “wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie [ &007 ]&003 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania 

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


exec sg newgrp id -gn “`

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

&007 jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. &007 oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz "wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie [ &007 ]&003 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

id -gn### 1. Uzyskanie powłoki z nową grupą bez wylogowania i ponownego logowania

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

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

Jest to wariacja na dwuwarstwową sztuczkę Legooolas newgrp, ale jest w jednej linii i nie wymaga ręcznego wpisywania grupy głównej.

&007 jest newgrp, ale akceptuje polecenie do wykonania z nowym ID grupy. &007 oznacza, że nowa powłoka zastępuje istniejącą powłokę, więc nie musisz “wylogować się” dwa razy.

W przeciwieństwie do użycia su, nie musisz wpisywać swojego hasła. Nie odświeża też Twojego środowiska (poza dodaniem grupy), więc zachowujesz swój aktualny katalog roboczy itd.

2. Wykonanie polecenia we wszystkich oknach Screen w sesji

Polecenie [ &007 ]&003 w Screen uruchamia polecenie w dowolnie wybranych oknach (zauważ, że jest to polecenie Screen, a nie polecenie powłoki).

Możesz użyć następującej komendy do wysłania komendy do wszystkich istniejących sesji ekranowych:

^M" “`

Zauważ, że trzeba uciec od backtick'ów, aby uzyskać &007 do uruchomienia w sesji Screen, a ^M do uzyskania Screen'a, aby uzyskać ‘enter’ na końcu Twojej komendy.

Zauważ również, że komenda ekranowa [ &007 ]&003 po prostu wpisuje tekst komendy w Twoim imieniu. Dlatego coś dziwnego może się zdarzyć, jeśli jedno z okien ekranu ma napisane w połowie polecenie w wierszu poleceń lub uruchamia aplikację inną niż powłoka (np. emacs, top). Jeśli jest to problem, mam kilka pomysłów:

  • Aby pozbyć się dowolnego półpisanego polecenia, możesz dodać ”^C" do początku polecenia.
  • Aby uniknąć uruchamiania komendy w oknie emacsa, itp., możesz poprosić `at’ o filtrowanie po tytule okna, itp. (w powyższym przykładzie używam “#”, który pasuje do wszystkich okien, ale możesz filtrować po tytule okna, użytkowniku, itp.

Aby uruchomić komendę w konkretnym oknie (identyfikowanym po numerze okna), użyj następującego:

^M" “`

18
18
18
2016-10-07 04:53:42 +0000

Użycie komendy newgrp rozwiązało dla mnie problem:

newgrp <GroupName>

Ten post na blogu ma szczegółowe wyjaśnienie.

12
12
12
2012-01-30 16:17:03 +0000

Możesz to zrobić.

Dodaj tyle grup, ile chcesz za pomocą usermod -G. Następnie, jako użytkownik z uruchomioną sesją, uruchom newgrp - tylko z argumentem ‘-’.

To reinicjalizuje id grupy do domyślnego, ale ustawi także grupy drugorzędne. Możesz to sprawdzić uruchamiając groups z bieżącej sesji, przed i po usermod oraz newgrp.

To musi być uruchamiane z każdej otwartej sesji - nie wiem zbyt wiele o ekranie. Jednakże, jeśli możliwe jest iterowanie wszystkich otwartych sesji i uruchomienie newgrp, powinieneś być dobry. Nie będziesz musiał się martwić o znajomość grup lub identyfikatorów grup.

Powodzenia.

11
11
11
2011-04-25 17:56:34 +0000

Grupy są zazwyczaj wyliczane przy logowaniu, nie ma sposobu, o którym wiem, aby zmusić je do ponownego wyliczenia grupy bez wylogowywania się i ponownego logowania.

Wiele odpowiedzi przegłosowanych tutaj wydaje się używać obejścia, które wywołuje nową powłokę ze świeżym środowiskiem (takim samym jak ponowne logowanie). powłoka macierzysta i wszystkie inne stale działające programy zazwyczaj 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.

4
4
4
2017-02-10 23:21:38 +0000

Podsumowując:

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

Używanie ‘exec’ oznacza zastąpienie istniejącej powłoki nową powłoką uruchomioną przez polecenie newgrp (więc wyjście z nowej powłoki wylogowuje cię).

Końcowy newgrp - jest potrzebny do przywrócenia twojej normalnej grupy głównej, więc pliki, które później utworzysz będą miały to jako właściciel ich grupy.

Uwaga: Pierwotnym pytaniem na plakacie było jak uczynić nowo dodane grupy widocznymi w istniejących procesach. Polecenia gpasswd i usermod nie mają wpływu na istniejące procesy; nowo dodane (lub usunięte!) grupy pojawiają się (znikają) na Twoim koncie, tj. w plikach /etc/group i /etc/gshadow, ale uprawnienia dla istniejących procesów nie są zmieniane. Do remove uprawnień musisz usunąć wszystkie uruchomione procesy; newgrp - nie odczyta ponownie /etc/group i nie zresetuje listy grup; zamiast tego, wydaje się, że używa tylko grup wcześniej powiązanych z procesem.

1
1
1
2018-04-28 13:30:22 +0000

Nie mogłem zmusić dowództwa Newgrp do pracy. Nie jestem pewien, czy to zależy od /etc/sudoers, ale normalnie muszę wpisać moje hasło do sudo, a to działało bez konieczności wpisywania mojego 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
0
0
0
2014-08-06 14:03:21 +0000

To robi sztuczkę, jeśli masz sudo i może zaoszczędzić od wprowadzenia hasła jeszcze raz w niektórych przypadkach:

sudo su $USER
0
0
0
2019-10-21 22:03:04 +0000

Musiałem to zrobić w skrypcie powłoki (skrypt dodaje aktualnego użytkownika do grupy, wykonuje późniejsze polecenia, które wymagają tego członkostwa w grupie). Polecenie newgrp jest kruche w tym sensie, że może uruchomić tylko nową powłokę, a nie dowolne polecenie (chcę ponownie uruchomić aktualny skrypt powłoki z oryginalnymi argumentami z wiersza poleceń).

Oto moje rozwiązanie, które wykorzystuje wiele bash-izmów: (zauważ, że otaczający go skrypt potrzebuje jakiejś gałęzi, aby uruchomić tę funkcję tylko wtedy, gdy wymagana grupa nie jest aktualnie aktywna):

(zauważ, że skrypt sugeruje, że uruchomił sudo adduser $user docker, co oznacza, że mógł też po prostu uruchomić wszędzie sudo docker zamiast docker, ale to było niepożądane w tym przypadku)

# save these for later
ORIGINAL_ARGS=("$@")

# This function is a little insane. The problem is this: user running
# this script is not a member of docker group, but used 'sudo' to add
# themselves to group. Without logging out and back in, the only way
# to gain access to that group is via the 'newgrp' command, which
# unfortunately starts a new shell rather than an arbitrary command...
#
# Also, we're going to newgrp twice: first to add the new group and
# again to restore the original group (but the new group remains in
# the 'groups' output).
#
# So this horrendous hack dups stdin to fd3 for later. Then runs
# 'newgrp' piping in a script that runs 'newgrp' a second time, piping
# in another script that restores stdin from fd3 and execs the
# original command...
restart-newgrp-newgrp() {
  # dup original stdin to fd3
  exec 3<&0

  local group="$1"
  local command="$0"
  local arg
  for arg in "${ORIGINAL_ARGS[@]}"; do
    printf -v command "%s %q" "$command" "$arg"
  done

  # restore original stdin from fd3; also replace any single-quote in
  # command with '"'"' to embed it in a single-quoted string
  local script
  printf -v script "exec newgrp %q <<<'exec <&3-; exec %s'" "$(id -gn)" "${command///\"\"}"

  exec newgrp "$group" <<<"$script"
}
0
0
0
2014-11-13 16:07:46 +0000

Miałem podobny problem, ale także dla niezalogowanych użytkowników. Restart nscd nie pomógł, ale wykonanie tej komendy spowodowało: nscd -i group. To powinno poinstruować nscd (buforowanie demona), aby ponownie załadował plik z grupami.