如何在 Linux ubuntu 上配置 PHP CLI 以作为 www-data 运行?

如何在 Linux ubuntu 上配置 PHP CLI 以作为 www-data 运行?

我的 ubuntu 上有一个 symfony2 应用程序。Symfony 有很多有用的控制台命令(例如php app/console cache:clearphp app/console assets:install web)。

问题是,如果我以root用户身份运行它们,新生成的文件将具有root:root用户/组,并且如果我访问我的网站,我会出现错误(因为 apache 无法读取/修改这些文件 - >它们应该有www-data:www-data)。

运行chown www-data:www-data可以解决问题,但是每次清除缓存时运行它并不是解决方案。

如何配置 PHP CLI 以始终以 www-data 用户/组身份运行?

或者

我如何以不同的用户身份运行命令(作为 root 用户,以 www-data 身份运行)?

答案1

以另一个用户身份运行一次命令:

sudo -u www-data php script.php

如果您已经sudo安装并且root(或有其他被允许这样做的用户;请参阅sudoman sudoersvisudo),这应该可以工作。

为了可重复使用,请添加别名。将其放入您的 或类似文件中.bashrc.profile然后重新加载 shell 以使其生效):

alias phpwww='sudo -u www-data php'

然后您就可以输入phpwww script.php,它将真正sudo -u www-data php script.php为您执行。


要了解其他更复杂且容易出错的方法,请继续阅读。

至于始终以 身份运行 php www-data,有几种可能性。您可以创建一个简单的包装器 shellscript。如果/usr/bin/php只是 或类似的软链接,那就更简单了。只需用如下脚本/usr/bin/php5替换软链接(而不是文件):php5

#!/bin/sh

sudo -u www-data php5 $*

return $?

php5不过这还没有经过测试。还要注意,这将始终尝试以用户身份运行www-data,即使用户可能不是root并且可能没有权限这样做。这也可能不是你真正想要的。一些已安装的服务在尝试执行 php 时可能会遇到问题。

一个(可能更好的)解决方案是只将其应用于 root,保留软链接/usr/bin/php,并将脚本放入其中/root/bin。然后通过 或类似方式将该文件夹添加到 PATH .bashrc.profile如果您有/etc/skel/.profile,这可能会指出如何完成:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

一旦它出现在您的.bashrc.profile类似的文件中,您打开的每个新 shell 都将允许您直接执行$HOME/bin(/root/bin对于 root) 中的任何可执行文件 (+x)。

提示:您可能希望将包装器脚本命名为类似于phpwww您明确指定的名称php script.php,或者phpwww script.php决定是否需要常规或 sudo 的 php。

答案2

mwargh 在 ##linux (IRC Freenode.net) 上回答


要以不同的用户身份运行命令 -> 使用以下命令切换到该用户:

su www-data

我仍然感兴趣(如果可能的话)配置 PHP 以便运行:

root@mycomp php (php script creating a file)

作为用户

将导致创建一个文件www-数据:www-数据用户/组

(这样我就不必从 root 切换到 www-data 来运行我的命令)

答案3

我会尝试让 /usr/bin/php 归 www-data 所有,并设置 suid 权限,强制文件所有者执行该命令。您可以使用以下命令执行此操作:

chmod u+s /usr/bin/php

你喜欢八进制表示法:

chmod 4755 /usr/bin/php

但我必须说,无论何时让 www-data 成为任何东西的所有者,都会让人感到不安,因为 www-data 帐户的意义在于尽可能少地拥有任何东西。

答案4

创建脚本文件:

touch /usr/bin/phpuid
chmod +x /usr/bin/phpuid

添加内容:

#!/bin/bash

UIDX="#"`stat -c '%u' $1`
sudo -u $UIDX php5 $*

从 root 运行你的脚本:

phpuid /path/to/script.php

或者在脚本中使用解释器

#!/usr/bin/phpuid
<?php
phpinfo();

注意:在 Debian 7 上测试,你可能需要安装 sudo

apt-get install sudo

script.php 创建的所有文件都具有与该脚本相同的 uid

相关内容