通常以其他用户身份执行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...]
似乎不起作用!
答案 0 :(得分:1)
第一个:
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters]
用于以非root用户身份启动upstart
作业,旨在允许更改用户标识,而不会留下中间进程;所以它以下列方式运行:
exec su -s sh
sh
-c 'exec "$0" "$@"'
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。
这会折叠流程树,删除中间--
- 它是一个内务处理机制,以防止深层流程树。
跳过所有高管(-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