
我有一個網頁伺服器,也可以播放網路廣播。作為 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
- 重新啟動阿帕契
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