“su _www helloworld.php”什么也没做

“su _www helloworld.php”什么也没做

在更大的努力中,我遇到了一个令我困惑的特殊问题。

在 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。

相关内容