我想根据需要使用自定义的用户ID和组ID,而无需更改甚至拥有具有此ID的用户帐户。
使用 Docker 可以轻松完成此操作:
> docker run -it --rm -u 10000:10000 bash
bash-5.2$ id
uid=10000 gid=10000
bash-5.2$ whoami
whoami: unknown uid 10000
但是如果没有 Docker 该如何实现呢?
答案1
任何工具都可以通过调用标准setuid()
函数(或setreuid()
等)来实现这一点。它只需要切换 UID 的权限(通常您必须是 root 用户),但不会以任何方式检查帐户数据库中是否存在 UID。
int main(void) {
setuid(1234);
}
(在这种情况下,虽然该docker
工具没有直接设置uid()的权限,但它会与具有此类权限的dockerd守护进程进行通信。)
在 Linux 上常见的一个这样的工具是setpriv
,另一个是chpst
:
# setpriv --reuid 1234 id
uid=1234 gid=0(root) groups=0(root)
它们还允许“真实”和“有效”的 UID 不同(以模拟运行“setuid”工具):
# setpriv --ruid 1234 --euid 5678 --rgid 1234 --egid 5678 --clear-groups id
uid=1234 gid=1234 euid=5678 egid=5678 groups=5678
sudo -u "#1234"
这不起作用的唯一原因runuser -u 1234
是他们故意地检查帐户数据库以检索主目录和其他参数。