“su _www helloworld.php”什么都不做

在更大的努力背景下,我遇到了一个令我莫名其妙的问题。

在Mac OS X 10.6.7上,使用系统提供的Apache和PHP,我创build了一个简单的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复制到我的foo.php服务器的文档根目录,它就可以工作。 就像我在用户的文档中那样。 它通过networking服务器执行就好,无论位置。


即使su _www php -v没有发现任何东西。 这里有点可疑

DERP。 _www用户只是被破坏了; 没有shell。 当尝试从shell尝试即使最简单的命令。

这和我的问题非常相似: “在用户www的命令行上运行cgi-script?” (FreeBSD的)。

这是问题:用户'_www'有一个shell设置为/usr/bin/false 。 根据手册页“虚假实用程序总是以非零退出代码退出”。 su _www将永远失败,通过devise。

这是出于安全原因而完成的。 如果有人能够成功运行一个针对_www的远程攻击,这个攻击是用来运行你的web应用程序的,那么他们将遇到一个立即退出的shell。 如果这个shell是/bin/sh ,那么_www用户就可以在命令行上运行很多命令,这对安全性是有害的。 因此,它被设置为/usr/bin/false来限制任何妥协造成的损害,你的networking服务器。 禁用这个是不明智的。

但是,将_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服务器执行此文件,则权限已经是正确的。

首先要看的是文件的权限。 一般来说,Web文件应该由Apache用户拥有。

尝试chown _www:_www helloworld.php

然后尝试运行php作为_www用户。