我想创建这样一种情况:非特权用户执行的某项操作(通过 SSH)会触发一个事件,从而导致 upstart 作业执行某些操作。这些活动依赖于文件系统更改,因此我欢迎使用其他方法。
基本上我想要的是类似这样的东西:
description "Foo job"
exec foo
start on foo
然后让用户触发事件,如 foo。当我说“用户”时,我实际上是指当 git 通过 SSH 推送到主机上的存储库时自动运行的 git hook 脚本。
我尝试过简单地运行initctl emit foo
,但是只有以 root 身份运行才有效。
对于这种特殊情况,我也不能使用用户作业,因为我希望相关作业重新启动服务器并创建发出事件的用户无权访问的目录结构。
关于如何在不给予用户不必要权限的情况下实现此目的,有什么想法吗?
编辑:我刚刚忘记提到了一项要求。这必须是可编写脚本的,因此不能输入密码。
答案1
回答我自己的问题,可以修改 sudoers 文件以允许用户运行带有参数的特定命令。因此,对于所讨论的情况,类似下面的操作可以完成这项工作:
Cmnd_Alias EMIT_CMD = /sbin/initctl emit foo
user ALL=(ALL) NOPASSWD: EMIT_CMD
它可以放在 /etc/sudoers 中,或者放在 /etc/sudoers.d 中的文件中(如果您的操作系统是这样配置的)。
一旦配置了 sudo,非特权用户将能够initctl
在没有密码的情况下调用命令,但只能使用指定的参数,并且任何其他参数集都将失败,因为用户(希望)不以任何其他身份出现在 sudoers 列表中。