以其他用户身份执行作业
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
通常我们可以以其他用户身份执行作业 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 shellsh
-c 'exec "[=20=]" "$@"'
从调用 shellsh
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