我有一个网络服务器,也可以播放互联网广播。作为 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
这就是我最终做的事情:
- 运行以下命令安装 apache2
sudo apt-get install apache2
- 确保 apache 可以运行 cgi 脚本,方法是运行
sudo a2enmod cgi
- 重启 Apache
sudo service apache2 restart
通过在以下位置创建以下脚本来验证我是否可以运行 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"
使脚本可执行
chmod +x /usr/lib/cgi-bin/test.sh
验证我是否能够执行脚本
curl localhost/cgi-bin/test.sh
并收到以下响应:Today is Wed Sep 6 12:19:34 PDT 2017 Current user is www-data
因为用户是 www-data,所以我将该用户添加为 sudoer。然后我
/etc/sudoers
在文件末尾添加以下行来修改文件:www-data ALL=(ALL) NOPASSWD: ALL
现在该用户应该具有 root 权限。然后我修改 test.sh 脚本如下:
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(sudo whoami)
然后,当你再次执行 get 请求时,你应该看到以下响应
localhost/cgi-bin/test.sh
:Today is Wed Sep 6 12:28:38 PDT 2017 Current user is root