没有sudo重启nginx?

tes*_*akt 17 deployment capistrano nginx

所以我希望能够限制:部署而无需输入任何密码.我已经设置了所有私钥,所以我可以很好地到达远程服务器,现在我在ssh上使用svn,所以没有密码.

我有最后一个问题,我需要能够重启nginx.现在我有sudo /etc/init.d/nginx重新加载.这是一个问题b/c它使用capistrano密码,我刚刚删除的那个b/c我正在使用密钥.有关如何重新启动nginx的任何想法吗?

小智 43

我花了一个小时看着sudoer通配符等试图解决这个确切的问题.实际上,您真正需要的是一个重新启动nginx的根可执行脚本.

将其添加到/ etc/sudoers文件中

username hostname ALL=NOPASSWD: /path/to/script
Run Code Online (Sandbox Code Playgroud)

以root身份编写脚本

#! /bin/bash
/bin/kill -HUP `cat /var/run/nginx.pid`
Run Code Online (Sandbox Code Playgroud)

使脚本可执行

测试.

sudo /path/to/script
Run Code Online (Sandbox Code Playgroud)

  • 如果有人破坏了运行该应用程序的帐户,他们是否能够编辑此脚本并以root身份运行任意命令? (3认同)
  • 您需要将脚本设置为由包含app用户的相应组执行,但不能由除root之外的任何人写入.也许不希望它也是世界可执行的. (3认同)

Fin*_*inn 16

Stack Overflow上有一个更好的答案,它不涉及编写自定义脚本:

最佳做法是使用 /etc/sudoers.d/myuser

/etc/sudoers.d/文件夹可以包含多个文件,允许用户使用sudo调用内容而不是root.

该文件通常包含用户和用户无需指定密码即可运行的命令列表.

说明:

在所有命令中,将myuser替换为您要用于在没有sudo的情况下重新启动nginx的用户名.

  1. 为您的用户打开sudoers文件:

    $ sudo visudo -f /etc/sudoers.d/myuser
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑将开放.在那里粘贴以下行.这将允许该用户运行nginx启动,重启和停止:

    myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart
    
    Run Code Online (Sandbox Code Playgroud)
  3. 点击ctrl+即可保存o.它将询问您要保存的位置,只需按enter确认默认值即可.然后用ctrl+ 退出编辑器x.

现在你可以在没有密码的情况下重启(并启动和停止)nginx.我们来试试吧.

  1. 打开新会话(否则,您可能根本没有被要求提供sudo密码,因为它没有超时):

    $ ssh myusername@myserver
    
    Run Code Online (Sandbox Code Playgroud)
  2. 停止nginx

    $ sudo /usr/sbin/service nginx stop
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通过检查您的网站或运行来确认nginx已停止 ps aux | grep nginx

  4. 启动nginx

    $ sudo /usr/sbin/service nginx start
    
    Run Code Online (Sandbox Code Playgroud)
  5. 通过检查您的网站或运行来确认nginx已启动 ps aux | grep nginx

PS:确保使用sudo /usr/sbin/service nginx start|restart|stop,而不是sudo service nginx start|restart|stop.