我应该使用哪个命令(发行版存储库中提供)启动具有指定数字 uid、gid 和组的 shell?通常su
用于从 root 更改为其他用户,但它会尝试按名称查找组,而当使用外部文件系统、命名空间和 Docker 容器时,名称可能不存在。
我希望它是一个简单的应用程序,只执行setgroups(2)
、setgid(2)
、setuid(2)
和execve(2)
,而不需要任何/etc/passwd
或 nsswitch 。用 C 语言实现这样的程序很容易,但也许这个用例使用了标准的和发行版可用的东西?
答案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,上述操作将会默默失败。