存在哪些可移植选项来放弃 root 权限并以与 shell 脚本不同的用户身份执行给定命令?
经过一些研究后,这里有一些非选项:
su $USER -c "$COMMAND"使用 PAM 堆栈并创建一个新的 cgroup(在 systemd 下运行时)。它在用户命名空间中也会失败,因为审核调用在旧版本的 Linux 上返回 -EPERM。sudo -u $USER $COMMAND许多系统上默认情况下不安装。start-stop-daemon --pidfile /dev/null --start --chuid $USER --startas /bin/sh -- -c "$COMMAND"非常难用并且只能在 Debian 系统上使用。chpst -u $USER $COMMAND在许多系统上都缺失。runuser -u $USER -- $COMMANDsu在不能工作的地方可以工作,但需要最新的 util-linux。如果您想要 POSIX,那么这su是您唯一的选择(除非您想编写 C 程序)。su有几个优点(或没有,取决于您的要求):
现在,在实践中,有些系统不是 POSIX \xe2\x80\x94\xc2\xa0,就像这个旧版 Linux 一样,它在用户命名空间中失败。他们就是休息时间。
\n\n如果您想要在实践中(在非嵌入式平台上)具有相当可移植性并且为您提供更大控制权的东西,请使用 Perl(或 Python,安装较少)。作为首选,请使用实体模块:Privilege::Drop。
\n\nperl -e \'use Privileges::Drop; drop_uid_gid(123, 456); exec("/path/to/command", "--option", "an argument")\'\nRun Code Online (Sandbox Code Playgroud)\n\nPrivilege::Drop负责把事情做好(删除补充组、检查错误)。然而,它可能并不完整;例如,它不知道功能。
如果您必须手动完成,请注意以下几点:
\n\n$) = "456 456"456 为目标 GID($) = 456仅设置 EGID,而不影响补充组)。