無需密碼即可以 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. 重新啟動阿帕契sudo 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
    

相關內容