我的 ubuntu 上有一个 symfony2 应用程序。Symfony 有很多有用的控制台命令(例如php app/console cache:clear
或php 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
(或有其他被允许这样做的用户;请参阅sudo
组man sudoers
和visudo
),这应该可以工作。
为了可重复使用,请添加别名。将其放入您的 或类似文件中.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