在更大的努力中,我遇到了一个令我困惑的特殊问题。
在 Mac OS X 10.6.7 上,使用系统提供的 Apache 和 PHP,我创建了一个简单的HelloWorld.php
脚本,不出所料,它只打印Hello, World!
而不执行其他任何操作。
如果我将其作为 执行,则效果很好php helloworld.php
。
但是,如果我:
sudo su
su _www php helloworld.php
它什么也不发出; php
几乎立即返回,没有任何执行迹象。
我哪里出轨了(而且更重要的是,我应该收集哪些诊断信息来帮助推断问题)?
没有骰子。
bash-3.2$ls -alF foo.php
-rw-r--r-- 1 _www _www 37 Apr 4 21:08 foo.php
bash-3.2$ ls -dalF .
drwxr-xr-x 56 _www _www 1904 Apr 4 21:08 ./
bash-3.2$ whoami
bbum
bash-3.2$ php foo.php
Hello, World!
bash-3.2$ sudo sh
sh-3.2# php foo.php
Hello, World!
sh-3.2# su _www php foo.php
sh-3.2#
如果我将其复制foo.php
到我的 Web 服务器的文档根目录,它就可以正常工作。就像在我用户的文档根目录中一样;它可以通过 Web 服务器正常执行,无论位置如何。
甚至su _www php -v
没有喷出任何东西。这里面有些蹊跷。
糟糕。_www 用户刚刚被破解;没有 shell。从 shell 尝试执行时,即使是最简单的命令也会出错。
答案1
这和我的问题非常相似“以用户 www 的身份在命令行上运行 cgi 脚本?”(FreeBSD)。
问题如下:用户 '_www' 的 shell 设置为/usr/bin/false
。根据手册页,“false 实用程序始终以非零退出代码退出。”su _www
根据设计,它将始终失败。
这样做是出于安全原因。如果有人能够成功对 _www(用于运行您的 Web 应用程序的帐户)进行远程攻击,那么他们将遇到一个立即退出的 shell。如果此 shell 保留为类似 的内容/bin/sh
,则 _www 用户将能够在命令行上运行许多命令,这对安全性不利。因此,将其设置为/usr/bin/false
以限制任何对您的 Web 服务器的损害。禁用此功能是不明智的。
但是,将 _www shell 设置为/usr/bin/false
也意味着用户 '_www' 无法在命令行上执行命令。即使是像这样的简单命令whoami
也会失败:
# su _www whoami
# echo $?
1
解决方案是使用sudo
,而不是su
。这个简单的例子表明,我现在可以以用户 '_www' 的身份执行简单的命令:
# sudo -u _www id
uid=70(_www) gid=70(_www) groups=70(_www)
您还需要确保用户 _www 能够读取该文件。但是,如果您能够使用 Apache Web 服务器执行此文件,则权限已正确。
答案2
首先要查看的是文件的权限。一般来说,Web 文件应该归 Apache 用户所有。
尝试 chown _www:_www helloworld.php
然后尝试以 _www 用户身份运行 php。