如何从 POSIX shell 脚本中删除 root 权限?

Hel*_*hne 5 shell root

存在哪些可移植选项来放弃 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。

Gil*_*il' 3

如果您想要 POSIX,那么这su是您唯一的选择(除非您想编写 C 程序)。su有几个优点(或没有,取决于您的要求):

\n\n
    \n
  • 它是一个系统工具,不会忘记 Linux 3.42 中引入的新咖啡 UID(用于饮料饮用目的的 UID),也不会因为在组权限之前删除用户权限或忘记而犯错误关于能力。
  • \n
  • 它将权限设置为已知状态:用户 ID、用户和组数据库中记录的用户组,没有额外的功能。
  • \n
  • 它记录日志条目。
  • \n
  • 而且,它是完全标准的,保证在任何地方都可用,但在最坏的系统上除外。
  • \n
\n\n

现在,在实践中,有些系统不是 POSIX \xe2\x80\x94\xc2\xa0,就像这个旧版 Linux 一样,它在用户命名空间中失败。他们就是休息时间。

\n\n

如果您想要在实践中(在非嵌入式平台上)具有相当可移植性并且为您提供更大控制权的东西,请使用 Perl(或 Python,安装较少)。作为首选,请使用实体模块:Privilege::Drop

\n\n
perl -e \'use Privileges::Drop; drop_uid_gid(123, 456); exec("/path/to/command", "--option", "an argument")\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

Privilege::Drop负责把事情做好(删除补充组、检查错误)。然而,它可能并不完整;例如,它不知道功能。

\n\n

如果您必须手动完成,请注意以下几点:

\n\n
    \n
  • 在用户权限之前删除组权限。
  • \n
  • 要删除补充组,请设置$) = "456 456"456 为目标 GID($) = 456仅设置 EGID,而不影响补充组)。
  • \n
  • 之后检查 (E)[UG]ID 并在失败时中止。
  • \n
\n