以其他用户身份执行Jobs

时间:2016-10-22 08:27:42

标签: node.js unix ubuntu forever setuid

通常以其他用户身份执行Jobs $qry="INSERT INTO ".$prefix."membersd (SELECT * FROM ".$prefix."members WHERE Id=".$_SESSION[userid].")"; mysql_query($qry); mysql_query("DELETE FROM ".$prefix."members WHERE Id = ".$_SESSION[userid]); 。但是,如果是永久过程,我们必须这样做:

sudo -u <user> <cmd>

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

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

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

似乎不起作用!

1 个答案:

答案 0 :(得分:1)

第一个:

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

用于以非root用户身份启动upstart作业,旨在允许更改用户标识,而不会留下中间进程;所以它以下列方式运行:

  • exec su -s sh
    用su替换调用此命令的进程,运行shell sh
  • -c 'exec "$0" "$@"'
    从调用shell sh exec开始,在--之后传递的命令和参数($0是命令行中的第一个参数,在{{1}之后} {},--就是之后的一切)

最终产品正在运行$@ ,就像直接从命令调用/path/to/command指定的那样;让进程树看起来像:

username

如果您没有使用su [as root] -> /path/to/command [as username] 调用它,那么您最终会得到一个过程树,如下所示:

exec

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

现在,一个重要的元素就是它只调用upstart_launcher [as root] -> su [as root] -> sh [as username] -> /path/to/command [as username] ,好像它是从命令行输入的那样。

当我们将它与第二个命令行进行比较时;发生的大部分内容都是类似,但不完全相同:

exec /path/to/command [arguments…]

为什么它不起作用?嗯,你已经要求它做一些不同的事情;在这种情况下;您要求它从shell su -s /bin/bash -c bash username -- /path/to/command [parameters...] 运行命令bash

由于您没有通过bash$0$@之后的所有内容都会被忽略,因为它未被传递到{{1}对于被调用的shell。

有和没有exec的例子

这会折叠流程树,删除中间-- - 它是一个内务处理机制,以防止深层流程树。

跳过所有高管(-c):

sh

添加内部执行(su -s /bin/sh -c '"$0" "$@"' proxy -- pstree -aApl) - 请注意缺少的第二级bash,1 `-bash,1014 `-su,1017 -s /bin/sh -c "$0" "$@" proxy -- pstree -aApl `-sh,1018 -c "$0" "$@" pstree -aApl `-pstree,1019 -aApl

su -s /bin/sh -c 'exec "$0" "$@"' proxy -- pstree -aApl

添加内部和外部执行(sh) - 注意缺少的外部级bash,1 `-bash,1014 `-su,1020 -s /bin/sh -c exec "$0" "$@" proxy -- pstree -aApl `-pstree,1021 -aApl ,以及exec su -s /bin/sh -c 'exec "$0" "$@"' proxy -- pstree -aApl pid与已存在的pid相同的事实上一个bash调用:

bash