允许Apache以不同的用户身份运行命令

我有一个脚本,在用户的主目录中执行几个命令。 这些文件由用户拥有,Apache( www-data组)只具有对其的读取权限。 该脚本需要通过exec()PHP按需exec() ,并执行一些文件的删除/解压操作,由于Apache没有对目录的写权限,因此失败了。

我试过编辑这样的sudoers文件:

 www-data ALL=(user) NOPASSWD: /bin/su user -c /home/user/bin/script.sh 

但它会提示我input用户的密码

我也试过了

 www-data ALL=(root) NOPASSWD: /usr/bin/sudo su user -c /home/user/bin/script.sh 

但是提示inputwww-datasudo密码

如何让这个工作没有密码?

最后得到它与这一行工作:

 www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh 

由于我需要参数给我的脚本,我不得不在行尾添加一个“shell风格的通配符”:

 www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh [[\:alpha\:]]* 

这不是我正在寻找的东西,但它的工作原理(即,我的论点发生在字母字符开始,但实际上我希望expression式只匹配字母数字字符,破折号和句点)。

我不太熟悉shell通配符和POSIX字符类,我使用的基本上是从sudoers手册复制粘贴的。 任何人知道这些问题如何适用,请留下您的意见!

你为什么在sudo里面运行su? (或者更糟,sudo里面的sudo)

www-data ALL=(user) NOPASSWD: /bin/bash /home/user/bin/script.sh

这应该工作。

如果它不是一个脚本,那么你可以直接使用可执行文件,并设置组的权限,这样只有networking服务器才能执行它。

您也可以使用suExec (仅限Apache)或suExec (任何networking服务器)在其他用户下运行CGI。 在Apache上也有非CGI模式的专门用于PHP的suPHP

它们提供的选项略有不同(例如,CGIwrap可以设置资源限制),但一般情况下,它们将作为备用用户运行程序。

我已经做了一个不同的方法,以允许apache用户sudo到一个指定的用户,然后可以运行所有的命令(或者你可以指定一个列表,如果你只需要一个或几个。

 APACHEUSER ALL=(USERNAME) ALL Defaults:APACHEUSER targetpw Defaults:APACHEUSER !requiretty 

这允许密码从代码发送(例如从数据库读取)使用:

echo password | sudo -u username -S bash -c command_here arguments_here

只要确保你使用这个专用的用户,而不要把这个用户放在wheel组里。

也请看这里

海尔特