允许以 www-data 用户身份通过​​ sudo 运行特定命令,无需密码

允许以 www-data 用户身份通过​​ sudo 运行特定命令,无需密码

我有一个网络服务器,也可以播放互联网广播。作为 www-data 用户,我想运行一些命令,例如,我在/etc/sudoers文件:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer

通过 PHP 我可以通过以下方式无需使用密码来操作卷:

exec('sudo -u user amixer set Master 3%-');

和:

exec('sudo -u user amixer set Master 3%+');

但现在我希望能够通过运行命令来重新启动我自己的服务:

exec('sudo -u user service servicename restart');

所以我尝试了:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service

和这个:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service

甚至这个:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data        ALL=(ALL) NOPASSWD: /bin/service

但似乎都不起作用。请帮帮我。


抱歉,各位,我的错误。我做了一些更改,尝试将 /sbin 链接到 /bin

现在我把它改成了:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service

并且成功了!谢谢!主题已关闭。

答案1

谨慎使用您的解决方案:您可以通过这种方式启动、停止或重新启动任何服务!

最好创建一个运行此命令的 shell 脚本:

echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart

授予足够的权限(550 表示 root 和组 www-data 可以读取和执行,没有人可以写入)

sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart

并允许 apache 在此脚本上使用 sudo:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart

答案2

这就是我最终做的事情:

  1. 运行以下命令安装 apache2sudo apt-get install apache2
  2. 确保 apache 可以运行 cgi 脚本,方法是运行sudo a2enmod cgi
  3. 重启 Apachesudo service apache2 restart
  4. 通过在以下位置创建以下脚本来验证我是否可以运行 bash 脚本/usr/lib/cgi-bin/test.sh

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(whoami)
    
    # headers
    echo "Content-type: text/plain"
    echo ""
    
    # body
    echo "Today is $OUTPUT"
    echo "Current user is $USR"
    
  5. 使脚本可执行chmod +x /usr/lib/cgi-bin/test.sh

  6. 验证我是否能够执行脚本curl localhost/cgi-bin/test.sh并收到以下响应:

     Today is Wed Sep  6 12:19:34 PDT 2017 
     Current user is www-data
    
  7. 因为用户是 www-data,所以我将该用户添加为 sudoer。然后我 /etc/sudoers在文件末尾添加以下行来修改文件:

    www-data ALL=(ALL) NOPASSWD: ALL

  8. 现在该用户应该具有 root 权限。然后我修改 test.sh 脚本如下:

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(sudo whoami)
    
  9. 然后,当你再次执行 get 请求时,你应该看到以下响应localhost/cgi-bin/test.sh

    Today is Wed Sep  6 12:28:38 PDT 2017
    Current user is root
    

相关内容