有哪些便携式选项可用于删除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 -- $COMMAND
适用于su
不在的地方,但需要最近的util-linux。答案 0 :(得分:2)
如果它是你想要的POSIX,那么su
是你唯一的选择(除非你想编写一个C程序)。 su
有几个优点(或不符合您的要求):
现在实际上有些系统不是POSIX - 就像这个旧的Linux,它在用户命名空间中失败了。他们是休息。
如果你想要一些在实践中相当便携的东西(在非嵌入式平台上)并且为你提供更大的控制权,那就使用Perl(或Python,不太常见的安装)。首选,使用实体模块:Privilege::Drop。
perl -e 'use Privileges::Drop; drop_uid_gid(123, 456); exec("/path/to/command", "--option", "an argument")'
Privilege::Drop
负责处理事情(删除补充组,检查错误)。然而,它可能并不完整;例如,它不了解能力。
如果你必须手工完成,请注意以下几点:
$) = "456 456"
,其中456是目标GID($) = 456
只会设置EGID而不会影响补充组。)答案 1 :(得分:1)
对于在“POSIX shell 脚本”的相关含义是“POSIX sh 脚本,在任意 Linux 系统上运行”,而不是“sh 脚本,在保证能够运行的系统上运行”的上下文中阅读本文的人只有POSIX保证的工具”,还有更多的选择。
借用对UNIX & Linux问题How do I drop root privileges in shell scripts的一个很好的回答:
现代的util-linux
有setpriv
,可以这样使用:
setpriv --reuid=user --regid=group --init-groups --inh-caps=-all yourcommand
@JdeBP Don't Abuse su
For Dropping Privileges 的优秀文章也值得一读。