Answers:
initctl --version
以查找您当前的新贵版本。
在freenode上的#upstart频道上提问,对此的官方说法是:
Upstart的未来版本将对此提供本机支持,但是现在,您可以使用类似的方法:
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
su
这意味着expect fork
甚至expect daemon
不捕获最终的PID。
exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
有几种方法可以做到,所有方法的语义都略有不同,尤其是与组成员身份有关的方法:
setuidgid
会将您置于您指定的组中。
setuidgid
会将您置于该组中,因此您将无法访问属于您所属的其他组的文件。setuidgid
从daemontools的,安可和setuidgid
从NOSH工具集都有一个-s
(又名--supplementary
)选项,这将让你在该组中,也把你所有的补充组为您指定的用户。使用newgrp
一旦你成为少特权用户将添加一个组到您的groupset,而且还创建了一个新的子shell,使其成为棘手的脚本内使用。
start-stop-daemon
保留您的组成员身份,并且不仅执行setuid / setgid的功能。
chpst -u username:group1:group2:group3... commandname
可以让您确切指定要采用的组成员身份,但是(在Ubuntu中)它仅随runit
软件包提供,这是的替代方法upstart
。
su -c commandname username
像一样拾取用户名的所有组成员身份,sudo -u username commandname
因此它们可能是使您惊讶最少的途径。
setuidgid
从包装中使用daemontools
。
在Amazon EC2上的Ubuntu 10.10实例上,我最好使用该start-stop-daemon
命令。
我还与其他一些新贵节斗争。我正在调用一个python应用程序,该程序具有virtualenv
对我执行的程序的特定参数。
以下是对我有用的。
script
export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
exec start-stop-daemon --start --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script
该PYTHONPATH
是让从源代码安装一些包到PYTHON模块路径中的新贵作业运行时。我必须在绝对路径中进行所有操作,因为该chdir
节似乎没有起作用。
我使用的是CentOS 6,我无法获得推荐的破解工具(适用于Upstart 0.6.5),也无法使用``su''技巧,因为涉及的分叉数量(我认为是4)没有被``期望分叉''跟踪或“期望守护程序”。
我最终只是做了
chown user:group executable
chmod +s executable
(即设置setuid位并更改所有权)。
这可能不是最安全的方法,但是对于内部研发项目而言,在我们的情况下这并不重要。
chmod 1700
或至少执行一次a chmod u+sx,go-x
,而不是仅执行+s
,那么就算是“足够安全”。:)
根据您要实现的目标,还有第三种可能性。您也许可以放宽有关文件/设备上的访问控制。这可以允许没有特权的用户安装或访问他们通常不被允许的物品。只要确定您没有在此过程中遗失通往王国的钥匙即可。
您还可以更改sudo密码缓存的超时。但是我不建议您这样做,除非您的计算机在物理上是安全的(例如,您认为路人不太可能尝试获得sudo访问权限)。
有充分的理由说明,执行特权操作的方法很少,而且它们执行不必要的 必要日志记录。宽松的限制将对您的系统造成安全隐患,而缺少日志记录将意味着您无法知道受到威胁时所发生的情况。
如果您担心日志文件的大小,则可能是错误的。在正常情况下,Sudo每次使用仅生成一行。
在CentOS 6中,新贵0.6.5对我有用。
script
exec su user_name << EOF
exec /path/to/command [parameters...]
EOF
end script
要么 :
script
exec su user_name << EOF
..... what you want to do ....
EOF
end script
使用时
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
不能停止工作流程initclt stop
。我认为原因是:
1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`