如何獲得似乎需要 root 權限才能通過 www-data 使用者執行的簡單腳本?
我正在編寫一個小型 Web 界面來控制 Debian(核心 2.6.32-5-686)上的 samba。我首先編寫簡單的腳本來添加使用者、創建文件夾等。它們在以 root 身份執行時執行良好。但是,當使用其中一些通過網路(apache + php)執行時
php: shell_exec()
,它們不起作用。它們看起來像這樣:#!/bin/sh #archive the userprofile cp /home/samba/profile/$1 /home/samba/archive/$1 smbpasswd -LU $1 -x userdel $1 exit 0
我嘗試使用 sudo 執行腳本,這似乎不起作用。我添加了這一行:(jupiter 是伺服器名稱)
%sudo jupiter=(ALL)NOPASSWD:/bin/<script>
到 /etc/sudoersfile,給我的 www-data 使用者 sudo 組,什麼都沒有。
然後我讀了我應該讀的地方
chmod 4755
和chown
腳本。它仍然沒有工作。此時我很好奇問題出在哪裡,我將 STDERR 重定向到一個文件。我執行了一個小腳本,它會呼叫
cp
,smbpasswd
並userdel
刪除使用者並存檔他的共享。所有呼叫都返回退出程式碼 1,AFAIK 表明出現問題。STDERR 給了我一點線索:userdel: cannot lock /etc/passwd; try again later.
這似乎是由一些 *.lock 文件引起的,但我的 /etc/ 文件夾中沒有。
在這一點上,我有點沮喪,並嘗試通過將 www-data 添加到根組來賦予它更多的根權限。事情仍然沒有奏效。
到目前為止,我的進步,我不知道下一步該做什麼。我的問題是:**如何獲得似乎需要 root 權限才能通過 www-data 使用者執行的簡單腳本?**我認為這可能是 /etc/passwd 文件的問題,因為我可以想像只有 root 使用者有權更改它。
我的回答只與這條線有關
sudo jupiter=(ALL)NOPASSWD:/bin/<script>
使用此行,您允許使用者在主機上作為任何使用者
sudo
執行而無需身份驗證。我不認為你想要這個。/bin/<script>``juptier
如果我理解正確,您希望使用者以root
www-data
身份執行。/bin/<script>
在這種情況下,適當的行看起來像www-data jupiter=(root) NOPASSWD:/bin/<script>
現在您可以通過呼叫以
/bin/<script>
特權方式執行www-data``root
www-data:~ $ sudo /bin/<script>
或通過
shell_exec("sudo /bin/<script>")
您的 php 腳本(我希望您關心安全問題)。有關詳細資訊,請查看
man sudoers
或線上版本sudoers.man。為了快速理解,我建議查看該EXAMPLES
部分。