아시다시피, 새 그룹에 자신을 추가하면 로그아웃했다가 다시 로그인할 때까지 변경 사항이 반영되지 않습니다.
$ sudo adduser me newgroup
$ groups
me sudo
$ groups me
me sudo newgroup
$
이 이상한 동작은 groups
새 그룹 멤버십이 해석되어 셸에서 표시되지 않기 때문에 발생합니다. 하지만 groups me
실제로는 참조 /etc/group
이므로 새 멤버십이 표시됩니다.
하지만 새 쉘이 이 변경 사항을 인식하지 못하는 것이 이상하다고 생각합니다.
$ bash
$ groups
me sudo
제가 아는 한 , 새로운 그룹 멤버십을 반영하는 방법은 (1) newgrp
또는 (2) 로그아웃 후 다시 로그인하는 것입니다. sg
su
따라서 bash
그룹 목록은 어떻게든 해당 하위 항목에 전달되어야 합니다. 환경(시도해 보았음 printenv
)이나 커널의 task_struct(gid, egid, sgid 및 fsgid에만 해당)에도 없습니다 .
나는 무엇을 해야할지 모르겠습니다.
답변1
그룹은 상위 프로세스의 프로세스에 의해 상속됩니다. Bash는 이 문제에 대해 선택의 여지가 없었습니다. 루트로 실행되는 프로세스는 요청 시 새로운 보충 그룹을 얻을 수 있습니다. 루트로 실행되지 않는 프로세스는 보충 그룹만 삭제할 수 있습니다.
매개변수가 없는 명령은 groups
자체 명령을 반환합니다.그룹 목록(부모로부터 상속됨): 실제 그룹, 유효 그룹 및 보충 그룹. 이 명령은 사용자 및 그룹 데이터베이스에서 group SOMEUSER
연관된 그룹을 찾습니다 .SOMEUSER
로그인 시 로그인 프로세스가 루트 사용자에서 대상 사용자로 전환되기 전에 로그인 프로세스의 일부로 사용자 및 그룹 데이터베이스를 기반으로 그룹이 할당됩니다. 명령을 사용 하며 런타임에 추가 그룹을 얻을 수 있습니다 newgrp
.su
sg
설정값루트; 해당 코드는 로그인 시 사용자에게 부여되는 그룹만 부여하는 방식으로 작성됩니다(루트는 원하는 모든 그룹을 얻을 수 있음 제외).
Linux 커널에서는 프로세스의 UID와 GID가 다음 위치에 기록됩니다.struct cred
. 보충 그룹은 group_info
다음을 가리키는 필드에 있습니다.struct group_info
그룹 ID 배열을 포함합니다.
답변2
이러한 그룹은 권한이 제거되기 전에 로그인 중에 할당됩니다. 쉘은 단순히 새로운 그룹을 할당할 수 없으며, 그렇지 않으면 프로세스가 속한 그룹이 커널에 의해 유지 관리되므로 보안 시스템으로는 쓸모가 없습니다. 예제의 출력을 보고 cat /proc/$$/status
Groups: 행을 살펴보십시오. 이는 쉘이 속한 그룹의 명시적인 목록입니다($$는 쉘 프로세스 ID의 바로가기입니다).
이 groups username
명령은 (말씀하신 대로) /etc/groups를 살펴보고 사용자 구성이 속한 그룹만 표시합니다. 사용자 이름이 없으면 groups 명령은 단순히 프로세스가 속한 실제 현재 그룹인 /proc/$$/status 그룹 목록을 표시합니다.