지정된 숫자 uid, gid 및 그룹을 사용하여 셸을 시작하려면 어떤 명령(배포 저장소에서 사용 가능)을 사용해야 합니까? 일반적으로 su
루트에서 다른 사용자로 변경하는 데 사용되지만 외부 파일 시스템, 네임스페이스 및 Docker 컨테이너를 사용할 때 존재하지 않을 수 있는 이름으로 그룹을 찾으려고 시도합니다.
나는 nsswitch나 nsswitch 가 필요 없이 setgroups(2)
, setgid(2)
, setuid(2)
및 , 만 수행하는 간단한 애플리케이션이기를 원합니다 . 이러한 프로그램을 C로 구현하는 것은 쉽지만 이 사용 사례에서는 표준 및 배포 가능한 프로그램을 사용할 수 있습니까?execve(2)
/etc/passwd
답변1
답변2
chroot
chroot --userspec=1000:1000 --groups=1001,1002 / /bin/bash
Chroot에는 옵션이 --userspec
있으며 --groups
일반적으로 배포판에서 사용할 수 있습니다. 대상 디렉토리를 설정하면 /
chroot nil의 주요 목적이 렌더링되지만 uid/gid/groups 재정의 효과는 그대로 유지됩니다.
답변3
Perl이 있고 UID와 GID에만 관심이 있다면 이 작업은 비교적 간단합니다.
# perl -e '$( = 456; $) = "456 1111 2222"; $< = $> = 123; exec("id")'
uid=123 gid=456 groups=456,1111,2222
$(
$)
실제적이고 유효한 GID와 실제적이고 유효한 UID(순서대로) 입니다 $<
. 여러 숫자를 나타내는 문자열을 허용할 수 있으며 보조 그룹도 설정됩니다. (이 목록을 지우려면 예를 들어 마스터 GID를 두 번 설정하십시오.)$>
$)
$) = "456 456"
또는 English
:
# perl -MEnglish -e '$GID = 456; $EGID = "456 1111 2222"; $EUID = $UID = 123; exec("id")'
uid=123 gid=456 groups=456,1111,2222
를 사용할 수도 있으며 POSIX::set[gu]uid()
, 물론 $!
특수변수를 수정한 후 오류가 있는지 확인해야 합니다. 그룹이나 UID를 변경할 수 있는 권한이 없으면 위 작업이 자동으로 실패합니다.