Scripting

如何獲得似乎需要 root 權限才能通過 www-data 使用者執行的簡單腳本?

  • December 19, 2016

我正在編寫一個小型 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 4755chown腳本。它仍然沒有工作。

此時我很好奇問題出在哪裡,我將 STDERR 重定向到一個文件。我執行了一個小腳本,它會呼叫cp,smbpasswduserdel刪除使用者並存檔他的共享。所有呼叫都返回退出程式碼 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

如果我理解正確,您希望使用者以rootwww-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部分。

引用自:https://unix.stackexchange.com/questions/47808