로그 아웃하지 않고 Linux 사용자 그룹 할당 재로드


348

다음을 사용하여 사용자의 보조 그룹 목록을 할당 할 때 :

# usermod -G <grouplist> <user>

실행중인 모든 세션을 로그 아웃하지 않고이 그룹 할당을 강제로 적용 할 수 있습니까?

그룹 할당을 적용하려면 전체 세션을 기본적으로 파괴해야하므로 실행중인 쉘이 많은 Screen 세션이 있는 상황에서 매우 유용 합니다.

newgrp명령을 사용하여 실행중인 셸에서 사용자의 기본 그룹을 변경할 수 있다고 생각 합니다. 보조 그룹에 사용할 수있는 대안이 있습니까?

이상적으로는 모든 쉘에서 수동으로 실행하지 않고 각 쉘에서 적용되는 것을 원하지만 실패하면 Screen이 각각 동일한 명령을 실행하도록 할 수 있습니다.


적어도 일부 창 / 세션 관리자의 경우 세션이 새 그룹을 선택하고 메뉴, 패널 버튼 등에서 시작한 새 프로세스에서 사용할 수 있도록이 작업을 수행 할 수 있다는 것을 알고 있습니다. 나는 지금 그것을 다시 찾으려고 여기에 왔으므로 지금 어떻게 할 수 있는지 말할 수 없으며 아마도 창 관리자와 관련이 있습니다.
mc0e

답변:


205

끔찍한 해 키지 만 두 newgrp그룹을 사용하여 특정 그룹에 대해 이것을 달성 할 수 있습니다 .

id -g

... 현재 기본 그룹 ID를 제공합니다. orig_group이 예제의 목적을 위해 이것을 호출합니다 . 그때:

newgrp <new group name>

...이 그룹을 기본 그룹으로 전환하여 groups또는 로 반환 된 그룹 목록에 추가합니다 id -G. 이제 더 :

newgrp <orig_group>

... 새 그룹을 볼 수있는 쉘을 얻게되며 기본 그룹은 원래 그룹입니다.

이것은 끔찍하며 한 번에 하나의 그룹 만 추가 할 수 있지만, 전체 X 세션에서 로그 아웃 / 로그 아웃하지 않고 그룹을 추가하는 데 몇 번 도움이되었습니다 (예 : 퓨즈를 사용자에게 그룹으로 추가하는 방법) sshfs가 작동하도록).

편집 : 암호를 입력 할 필요가 없습니다 su.


6
좋은 속임수, 나는 그것을 좋아한다
Simon

1
Fedora에서는 newgrp $USER대신에 해야 했습니다 newgrp <orig_group>. 즉, 원래 기본 그룹 ID를 찾을 필요가 없으므로이 솔루션보다 훨씬 쉽습니다.
Richard Turner

2
나는 그것으로 충분하다는 것을 알았습니다 newgrp <new group name>. 이것은 우분투 14.04
에드워드 포크

4
@EdwardFalk 맞아요,하지만 당신은 그 그룹을 당신의 기본으로 남겨두고 싶지 않을 수도 있습니다.
mimoralea

4
각각 newgrp은 새로운 쉘을 생성하므로, 세션에서 완전히 빠져 나가야 할 때는 "나가기 출구
끝내기

371

쉘 내부에서 다음 명령을 실행할 수 있습니다

su - $USER

id는 이제 새로운 그룹을 나열합니다 :

id

3
나는 이것이 대부분의 경우에 가장 좋은 접근법이라고 생각하지만, 원래 포스터는 스크린 세션 내에서 여러 쉘을 업데이트하고 싶었다. 이 솔루션은 각 쉘에서 수행되었을 것입니다.
Adrian Ratnapala

3
좋은 트릭, 잘 작동합니다!
genpfault

4
원래 솔루션은 화면에서 단일 셸 세션 만 수정했습니다. 방금 테스트했습니다. 이 솔루션이 작동하는 이유는 원래 환경에서 상속하지 않고 완전히 새로운 세션을 생성하기 때문입니다.
Dror

4
이것은 정말로 받아 들여지는 대답이어야합니다. 좋은 트릭, 감사합니다!
dotancohen

2
암호를 입력해야하는데, 많은 세션에서 암호를 입력하려고하면 어색하거나 원치 않을 수 있습니다.
Legooolas 2016

156

링크의 멋진 트릭 은 훌륭합니다!

exec su -l $USER

이 작업을 잊어 버릴 때마다 여기에 게시 할 것이라고 생각했습니다. 이것은 Google에서 처음으로 나타나는 링크입니다.


14
사용자를 서브 쉘에 넣지 않은 경우 +1; 평소와 같이 로그 아웃 / 종료 할 수 있습니다. 또한 NOPASSWD :가 / etc / sudoers에 설정되어 있으면 대신 exec sudo su -l $USER암호를 묻는 메시지가 표시되지 않도록 사용할 수 있습니다 .
Ivan X

21
권장 사항 : sudo 비밀번호를 묻는 메시지가 표시됩니다. 잘못되면 터미널이 닫힙니다.
Tyler Collier

1
@TylerCollier Ivan 님 언급했습니다NOPASSWD:
pepoluan

32

1. 로그 아웃 한 후 다시 로그인하지 않고 새 그룹으로 쉘 가져 오기

하나의 그룹 만 추가하는 경우 다음을 사용했습니다.

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

이것은 Legooolas의 2 계층 newgrp 트릭에 대한 변형이지만 한 줄에 있으며 기본 그룹을 수동으로 입력 할 필요가 없습니다.

sgnewgrp이지만 새 그룹 ID로 실행할 명령을 수락합니다. exec두 번 "로그 아웃"할 필요가 없습니다 새로운 쉘, 기존의 쉘을 대체 수단.

su를 사용하는 것과 달리 암호를 입력 할 필요가 없습니다. 또한 그룹을 추가하지 않고 환경을 새로 고치지 않으므로 현재 작업 디렉토리 등을 유지합니다.

2. 세션의 모든 화면 창에서 명령 실행

at화면의 명령은 (이것은 화면의 명령이 아닌 쉘 명령입니다주의) 지정 어떤 창에서 명령을 실행합니다.

다음 명령을 사용하여 기존의 모든 화면 세션으로 명령을 보낼 수 있습니다.

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

idScreen 세션에서 실행 하려면 백틱을 이스케이프 처리해야하며 , 명령이 끝날 때 화면을 '입력'하려면 ^ M을 사용하십시오.

또한 화면의 stuff명령은 단순히 사용자를 대신하여 명령 텍스트를 입력합니다. 따라서 화면 창 중 하나에 명령 프롬프트에서 반으로 작성된 명령이 있거나 쉘 (예 : emacs, top) 이외의 응용 프로그램을 실행중인 경우 이상한 일이 발생할 수 있습니다. 이것이 문제라면 몇 가지 아이디어가 있습니다.

  • 반으로 작성된 명령을 제거하려면 명령 시작 부분에 "^ C"를 추가하면됩니다.
  • emacs 창 등에서 명령을 실행하지 않으려면`at '에게 창 제목 등을 필터링하도록 요청할 수 있습니다 (위의 예에서는 모든 창과 일치하는 "#"을 사용하지만 창 제목, 사용자별로 필터링 할 수 있음) 등).

특정 창 (창 번호로 식별)에서 명령을 실행하려면 다음을 사용하십시오.

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

다른 부작용이없는 것 같은 멋진 라이너. 감사합니다!
Cyril Duchon-Doris


12

그룹은 일반적으로 로그인시 열거되며, 로그 아웃했다가 다시 로그인하지 않고 그룹 열거를 다시 실행하도록 할 방법이 없습니다.

여기에 투표 한 많은 답변은 새로운 환경을 가진 새로운 쉘을 호출하는 해결 방법을 사용하는 것 같습니다 (다시 로그인하는 것과 동일). 부모 셸과 계속 실행되는 다른 모든 프로그램은 일반적으로 클린 로그 아웃 및 로그인 후 새 셸에서 다시 호출 될 때까지 일반적으로 새 그룹 멤버쉽을받지 않습니다.


사실, 나는 이것이 사실이 아니라고 확신합니다. 나는 리눅스 박스에서 전에 그것을 할 수있는 방법을 찾았습니다. 그러나 내 인생에서 나는 그 명령이 무엇인지 기억할 수 없다. 찾으면 게시하겠습니다. 편집 : 방금 찾은 것으로 답으로 게시하고 있습니다.
lunchmeat317

1
이것을 지적 해 주셔서 감사합니다. 이것 또한 저의 이해입니다. 여기에있는 다른 모든 대답은 하나의 열린 쉘을 대체하거나 화면을 다시 시작하는지 여부에 관계없이 단순히 새로운 쉘을 엽니 다. 명령이나 스크립트를 발행하고 X 세션을 포함한 모든 실행중인 세션이 새로운 그룹 멤버쉽을 반영하도록하는 마법의 만병 통치약은 없습니다.
scravy

12

당신은 이것을 할 수 있습니다.

을 사용하여 원하는만큼 그룹을 추가하십시오 usermod -G. 그런 다음 실행중인 세션을 가진 사용자 newgrp -는 '-'인수 만 사용하여 실행 하십시오.

이렇게하면 그룹 ID가 기본값으로 다시 초기화되지만 보조 그룹도 설정됩니다. 다음 명령을 실행하면이를 확인할 수 groups이전과 이후, 현재 세션 usermodnewgrp.

이것은 열린 세션마다 실행해야합니다-화면에 대해 잘 모르겠습니다. 그러나 모든 열린 세션을 반복하고 실행할 newgrp수 있다면 좋을 것입니다. 그룹 또는 그룹 ID를 아는 것에 대해 걱정할 필요가 없습니다.

행운을 빈다


11
X 세션 내에서 xterm을 시도했지만 작동하지 않음
dwery

3
tmux의 세션에서 시도했지만 작동하지 않았습니다.
Michael

2
아마존 리눅스 2에 시도, 그것은 작동하지 않았다
시릴 Duchon - 도리스에게

1
newgrp -새로운 쉘 프로세스 시작
Piotr Findeisen

Mister_Tom의 답변에 대한 귀하의 의견에 비추어, 이것은 다른 모든 답변과 마찬가지로 해결 방법입니다. Mister_Tom의 답변은 여전히 ​​옳습니다.
scravy

4

요약:

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

'exec'를 사용한다는 것은 기존 쉘을 newgrp 명령으로 시작된 새로운 쉘로 교체하는 것을 의미합니다 (따라서 새로운 쉘에서 나가면 로그 아웃됩니다).

최종 newgrp -은 일반 기본 그룹을 복원하는 데 필요하므로 나중에 생성하는 파일은 그룹 소유자가됩니다.

참고 : 원래 포스터의 질문은 기존 프로세스에서 새로 추가 된 그룹을 표시하는 방법이었습니다. gpasswdusermod명령은 기존 프로세스에 영향을 미치지 않습니다; 새로 추가 된 (또는 삭제 된) 그룹은 계정, 즉 / etc / group 및 / etc / gshadow 파일에 표시 (또는 사라짐)되지만 기존 프로세스에 대한 권한은 변경되지 않습니다. 권한 을 제거 하려면 실행중인 프로세스를 모두 종료해야합니다. newgrp -/ etc / group을 다시 읽지 않고 그룹 목록을 재설정합니다. 대신 이전에 프로세스와 연관된 그룹을 사용하는 것 같습니다.


그건 그렇고, exec su - <username>그룹이 설정된 새로운 로그인 쉘을 얻는 데 사용될 수 있지만 새로운 쉘은 터미널에서 명령을 읽으므로 스크립트에서는 작동하지 않습니다. su -c "command ..." <myusername>스크립트를 다시 시작 하는 데 사용할 수 있지만 결과 프로세스에는 제어 터미널이 없으므로 화면 편집기 나 다른 대화식 명령을 시도하면 오류가 발생합니다.
jimav

이것이 왜 하향 조정 되었습니까? 누군가 나에게 무슨 일이 있었는지 설명 할 수 있습니까? 제가 가장 좋아하는 것 같아요.
jasonmp85

가, 나는 테스트하기 전에 투표했다. "기본 그룹"을 대체 newgrp -하지 않습니다 . Patrick Conheady의 답변은 여기에서 가장 좋은 답변입니다. 기본 그룹을 포크하거나 변경하지 않기 때문입니다.
jasonmp85

1

비슷한 문제가 있었지만 로그인하지 않은 사용자에게도 발생했습니다. nscd를 다시 시작해도 도움이되지 않지만이 명령을 실행하면 도움이 nscd -i group됩니다. 그러면 nscd (캐싱 데몬)에게 groups 파일을 다시로드하도록 지시해야합니다.


1

newgrp 명령을 사용할 수 없습니다. 이것이 / etc / sudoers에 의존하는지 확실하지 않지만 sudo에 암호를 입력해야하며 암호를 요구하지 않고 작동했습니다.

[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

이렇게하면 트릭을 수행하고 경우 sudo에 따라 암호를 한 번 더 입력 하지 않아도됩니다 .

sudo su $USER
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.