我有这个暴发户脚本看起来有点像这样:
setuid userA
setgid userB
script
# ... bunch of stuff run as userA
end script
post-start script
# ... command run as userA
# ... the following command needs to be run as root
setuid root # <---- this is not legal syntax
service myservice restart # <---- I need to run this as root
end script
所以,我浏览了文档,发现 setuid 在内部不起作用post-start
,并且userA
不在 sudoer 列表中,所以我不能这样做sudo service myservice restart
。事实上,在最理想的情况下,我实际上应该myservice
以另一个用户的身份运行。
我该如何解决这个问题?我一整天都在挠头,没有任何解决方案。
正如答案所建议的,一种方法是创建其他当上一个 upstart 脚本运行时运行的 upstart 作业。因此,service myservice restart
我们不是在 jobA 中创建它,而是在 jobA 运行时创建/etc/init/myservice-hook.conf
并触发它(根据答案)。
在我这边,我设法通过删除两者来解决问题setuid
,setgid
以便脚本以 root 身份运行,然后有选择地放入sudo -u userA <command>
脚本中。我将使用提供的答案,因为我认为它可以更好地隔离关注点。
答案1
一种选择是创建另一项工作,如下所示:
start on started jobA
task
exec service myservice restart
然后在启动后脚本中删除 setuid root 位及其下方的内容。