我在我的Ubuntu上有一个symfony2应用程序。 Symfony有很多有用的控制台命令(如php app/console cache:clear或php app/console assets:install web )。
问题是如果我以root用户身份运行它们,新生成的文件将具有root:root用户/ root:root组,如果我访问我的网站,我会得到错误(因为apache无法读取/修改这些文件 – >他们应该有www-data:www-data )。
运行chown www-data:www-data解决了这个问题,但是每次运行我清除caching都不是一个解决scheme。
要么
作为另一个用户运行一次命令:
sudo -u www-data php script.php
这应该工作,如果你是root 。
至于总是运行php作为www-data ,有几种可能性。 你可以创build一个简单的包装shellcript。 如果/usr/bin/php只是一个到/usr/bin/php5或类似的软链接,那就更简单了。 只要用这样的脚本replace软链接(不是文件php5 ):
#!/bin/sh sudo -u www-data php5 $* return $?
这还没有testing。 另外请注意,这将始终尝试以用户www-data身份运行php5 ,即使用户可能不是root ,也可能没有权限这样做。 也可能不是你真正想要的。 尝试执行php时,某些安装的服务可能会遇到问题。
一个(可能更好的)解决scheme只适用于根目录可能是单独的软链接/usr/bin/php ,而是将脚本放在/root/bin 。 然后通过.bashrc , .profile或类似的方式将该文件夹添加到PATH。 如果你有/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 for root)中执行任何可执行文件(+ x)。
提示:您可能想要命名包装脚本,如phpwww所以你明确指定php script.php或phpwww script.php来决定是否要定期或sudo'ed PHP。
另一个解决scheme是一个简单的别名。 将其放置在.bashrc , .profile或类似文件中:
alias phpwww='sudo -u www-data php'
以不同的用户身份运行命令 – >切换到该用户使用:
su www-data
我仍然有兴趣(如果可能的话)在configurationPHP,以便运行:
root@mycomp php (php script creating a file)
作为root用户
将导致使用www-data创build文件:www-data用户/组
(这样我就不必从根切换到万维网数据来运行我的命令)
我会尝试让www-data拥有/ usr / bin / php,并设置suid权限,强制命令由文件所有者执行。 你可以这样做:
chmod u+s /usr/bin/php
你喜欢八进制符号:
chmod 4755 /usr/bin/php
虽然我必须说,只要你把万维网数据作为任何东西的拥有者,就应该让人感到不安,因为万维网数据账户的要点是尽可能less的拥有。
如果你有php-fpm(FastCGI进程pipe理器)
你可以在位于(至less为centos)的configuration文件中设置它: /etc/php-fpm.d/www.conf
在第39行你可以设置用户,你可以设置组
创build脚本文件:
touch /usr/bin/phpuid chmod +x /usr/bin/phpuid
添加内容:
#!/bin/bash UIDX="#"`stat -c '%u' $1` sudo -u $UIDX php5 $*
从根目录运行你的脚本:
phpuid /path/to/script.php
或者在脚本中使用解释器
#!/usr/bin/phpuid <?php phpinfo();
注意:在debian 7上testing过,你可能需要安装sudo
apt-get install sudo
所有由script.php创build的文件将具有与该脚本相同的uid