Vi. Asked: 2022-05-04 11:56:50 +0800 CST2022-05-04 11:56:50 +0800 CST 2022-05-04 11:56:50 +0800 CST 我应该以 root 身份使用哪个命令来生成具有覆盖的数字 uid/gid/groups 的进程? 772 我应该使用哪个命令(在发行版存储库中可用)启动具有指定数字 uid、gid 和组的 shell?通常su用于从 root 更改为其他用户,但它会尝试按名称查找组,这在使用外部文件系统、命名空间和 Docker 容器时可能不存在。 我希望它是一个简单的应用程序,只执行、setgroups(2)和,没有任何或 nsswitch。用 C 语言实现这样的程序很容易,但也许这个用例使用了标准和发行版可用的东西?setgid(2)setuid(2)execve(2)/etc/passwd linux users 3 个回答 Voted Best Answer crpb 2022-05-05T02:56:32+08:002022-05-05T02:56:32+08:00 作为备选: 设置隐私 cd /; setpriv --reuid=1000 --regid=1000 --init-groups --reset-env bash 干净简单 Vi. 2022-05-04T11:56:50+08:002022-05-04T11:56:50+08:00 chroot chroot --userspec=1000:1000 --groups=1001,1002 / /bin/bash Chroot 具有--userspec和--groups选项,通常在发行版中可用。将目标目录设置为/呈现 chroot nil 的主要目的,但 uid/gid/groups 覆盖效果仍然存在。 ilkkachu 2022-05-06T03:49:09+08:002022-05-06T03:49:09+08:00 如果您有 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,上述操作将静默失败。
作为备选:
设置隐私
干净简单
chroot
Chroot 具有
--userspec
和--groups
选项,通常在发行版中可用。将目标目录设置为/
呈现 chroot nil 的主要目的,但 uid/gid/groups 覆盖效果仍然存在。如果您有 Perl,并且只关心 UID 和 GID,那么执行此操作相对简单:
$(
$)
是真实有效的 GID ;以及真实有效的 UID(按此顺序)$<
。可以接受一个代表多个数字的字符串,它也会设置补充组。(要清除这些列表,请设置主 GID 两次,例如)$>
$)
$) = "456 456"
或者,在
English
:您也可以使用
POSIX::set[gu]uid()
,当然您应该$!
在修改特殊变量后进行检查以检查错误。如果您无权更改您的组或 UID,上述操作将静默失败。