bash의 하위 프로세스에 사용자 그룹을 전달하는 방법은 무엇입니까?

bash의 하위 프로세스에 사용자 그룹을 전달하는 방법은 무엇입니까?

아시다시피, 새 그룹에 자신을 추가하면 로그아웃했다가 다시 로그인할 때까지 변경 사항이 반영되지 않습니다.

$ sudo adduser me newgroup
$ groups
me sudo
$ groups me
me sudo newgroup
$

이 이상한 동작은 groups새 그룹 멤버십이 해석되어 셸에서 표시되지 않기 때문에 발생합니다. 하지만 groups me실제로는 참조 /etc/group이므로 새 멤버십이 표시됩니다.

하지만 새 쉘이 이 변경 사항을 인식하지 못하는 것이 이상하다고 생각합니다.

$ bash
$ groups
me sudo

제가 아는 한 , 새로운 그룹 멤버십을 반영하는 방법은 (1) newgrp또는 (2) 로그아웃 후 다시 로그인하는 것입니다. sgsu

따라서 bash그룹 목록은 어떻게든 해당 하위 항목에 전달되어야 합니다. 환경(시도해 보았음 printenv)이나 커널의 task_struct(gid, egid, sgid 및 fsgid에만 해당)에도 없습니다 .

나는 무엇을 해야할지 모르겠습니다.

답변1

그룹은 상위 프로세스의 프로세스에 의해 상속됩니다. Bash는 이 문제에 대해 선택의 여지가 없었습니다. 루트로 실행되는 프로세스는 요청 시 새로운 보충 그룹을 얻을 수 있습니다. 루트로 실행되지 않는 프로세스는 보충 그룹만 삭제할 수 있습니다.

매개변수가 없는 명령은 groups자체 명령을 반환합니다.그룹 목록(부모로부터 상속됨): 실제 그룹, 유효 그룹 및 보충 그룹. 이 명령은 사용자 및 그룹 데이터베이스에서 group SOMEUSER연관된 그룹을 찾습니다 .SOMEUSER

로그인 시 로그인 프로세스가 루트 사용자에서 대상 사용자로 전환되기 전에 로그인 프로세스의 일부로 사용자 및 그룹 데이터베이스를 기반으로 그룹이 할당됩니다. 명령을 사용 하며 런타임에 추가 그룹을 얻을 수 있습니다 newgrp.susg설정값루트; 해당 코드는 로그인 시 사용자에게 부여되는 그룹만 부여하는 방식으로 작성됩니다(루트는 원하는 모든 그룹을 얻을 수 있음 제외).

Linux 커널에서는 프로세스의 UID와 GID가 다음 위치에 기록됩니다.struct cred. 보충 그룹은 group_info다음을 가리키는 필드에 있습니다.struct group_info그룹 ID 배열을 포함합니다.

답변2

이러한 그룹은 권한이 제거되기 전에 로그인 중에 할당됩니다. 쉘은 단순히 새로운 그룹을 할당할 수 없으며, 그렇지 않으면 프로세스가 속한 그룹이 커널에 의해 유지 관리되므로 보안 시스템으로는 쓸모가 없습니다. 예제의 출력을 보고 cat /proc/$$/statusGroups: 행을 살펴보십시오. 이는 쉘이 속한 그룹의 명시적인 목록입니다($$는 쉘 프로세스 ID의 바로가기입니다).

groups username명령은 (말씀하신 대로) /etc/groups를 살펴보고 사용자 구성이 속한 그룹만 표시합니다. 사용자 이름이 없으면 groups 명령은 단순히 프로세스가 속한 실제 현재 그룹인 /proc/$$/status 그룹 목록을 표시합니다.

관련 정보