新贵:允许普通用户停止并启动我的自定义服务


16

我已经使用upstart在启动时启动了Web服务器应用程序。这是新贵的脚本:

# web app node upstart file at /etc/init/webapp.conf

description "web application"

start on started mongodb
stop on runlevel [06]

respawn
respawn limit 10 100

env NODE_ENV=production

pre-start script
    ulimit -n 2048
end script

exec start-stop-daemon --start -c mainuser --exec /usr/bin/make -- -C /home/mainuser/app start-prod

这在Ubuntu服务器10.04 LTS上完美运行,对此我感到非常高兴。

但是,我有一个部署外壳脚本,该脚本使用SSH作为登录名mainuser(这不是sudoer),然后将工作目录更新为最新的部署版本。

这里的问题是该服务需要重新启动,以便应用程序加载新的源文件。但是,mainuser得到...

mainuser@Saturn101:~$ stop webapp
-bash: stop: command not found

...当试图阻止它时。我必须运行sudo stop webapp,但是此用户不能执行此操作,因为他不是sudoer。出于安全原因,我也不希望他成为sudoer,而且我也不想插入sudo密码。

所以,我怎么让mainuser运行stop webappstart webapp


1
通过将用户添加到sudoers中,您担心哪些安全问题?您可以编写一条规则,该规则仅允许用户使用特定命令,而不能再允许其他用户使用,还可以包括nopasswd选项以免密码提示。至于您得到的特定错误,那是因为开始/停止在/ sbin中,这通常不是普通用户路径的一部分。因此,您可以执行“ / sbin / stop”,或将sbin添加到路径。只要开始/停止脚本中没有其他需要root的项目,此方法就可能起作用。
Derek Pressnall 2012年

@DerekPressnall,谢谢,但是当我运行时,/sbin/stop webapp我得到了stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory。我怎么mainuser只允许执行此命令?
汤姆(Tom)

该错误是由于该用户没有管理员权限而导致的。
汤姆(Tom)

Answers:


31

sudo是非常可配置的,您可以允许该用户执行一组有限的命令,而无需提示输入密码。下面的行/etc/sudoers应执行您想要的操作:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp

1
太好了,非常感谢。您真的从中学到了man sudoers吗?我发现很难解析。
汤姆(Tom)

1
不,我以前做过。这不是最容易破译的手册:-)
mgorven

失败Unable to connect to system bus。更多:允许非sudo组控制Upstart作业
ciastek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.