以其他用户身份执行作业

Executing Jobs as other user

通常我们可以以其他用户身份执行作业 sudo -u <user> <cmd>。但是,如果是永远的过程,我们必须这样做:

exec su -s /bin/sh -c 'exec "[=10=]" "$@"' username -- /path/to/command [parameters...]

参考:https://superuser.com/questions/213416/running-upstart-jobs-as-unprivileged-users

这有什么不同?这是什么意思?此外:

su -s /bin/bash -c bash username -- /path/to/command [parameters...]

好像不行!

第一个:

exec su -s /bin/sh -c 'exec "[=10=]" "$@"' username -- /path/to/command [parameters]

以 root 以外的用户身份启动 upstart 作业旨在允许更改用户 ID,而不会留下中间进程;所以它 运行 如下所示:

  • exec su -s sh
    将调用此命令的进程替换为 su,运行ning shell sh
  • -c 'exec "[=20=]" "$@"'
    从调用 shell sh exec -- 之后传递的命令和参数([=24=] 是命令行上的第一个参数,在--$@ 就是之后的一切)

最终结果是 运行ning /path/to/command 好像 它是直接从指定的 username 命令中调用的;留下一个看起来像这样的过程树:

su [as root] -> /path/to/command [as username]

如果您没有使用 exec 调用它,那么您最终会得到一个如下所示的进程树:

upstart_launcher [as root] -> su [as root] -> sh [as username] -> /path/to/command [as username]

(我不知道 upstart_launcher 进程在这一点上会是什么样子;我没有带有 upstart 的系统来检查这个;但是会有一个进程遗留下来)

现在,它的一个重要元素是它只是调用 exec /path/to/command [arguments…],就好像它是从命令行输入的那样。

当我们将此与第二个命令行进行比较时;大多数情况是 相似,但不完全相同:

su -s /bin/bash -c bash username -- /path/to/command [parameters...]

为什么不起作用?好吧,您已经要求它做一些不同的事情;在这种情况下;你要求它从 shell bash.

运行 命令 bash

因为您没有传入 [=24=]$@,所以 -- 之后的所有内容都将被忽略,因为它没有传入 -c shell 正在被调用。

使用和不使用 exec 的示例

这会折叠进程树,移除中间进程 sh - 这是一种防止深层进程树的管家机制。

跳过所有执行程序 (su -s /bin/sh -c '"[=38=]" "$@"' proxy -- pstree -aApl):

bash,1
  `-bash,1014
      `-su,1017 -s /bin/sh -c "[=14=]" "$@" proxy -- pstree -aApl
          `-sh,1018 -c "[=14=]" "$@" pstree -aApl
              `-pstree,1019 -aApl

添加内部执行程序 (su -s /bin/sh -c 'exec "[=39=]" "$@"' proxy -- pstree -aApl) - 注意缺少的二级 sh:

bash,1
  `-bash,1014
      `-su,1020 -s /bin/sh -c exec "[=15=]" "$@" proxy -- pstree -aApl
          `-pstree,1021 -aApl

添加内部和外部 exec (exec su -s /bin/sh -c 'exec "[=41=]" "$@"' proxy -- pstree -aApl) - 注意缺少的外部级别 bash,以及 1014 pid 与之前的 pid 相同的事实出现在之前的 bash 调用中:

bash,1
  `-su,1014 -s /bin/sh -c exec "[=16=]" "$@" proxy -- pstree -aApl
      `-pstree,1022 -aApl