【问题标题】:PHP 'is_writable' returning false, although viewing it from the terminal shows 775PHP 'is_writable' 返回 false,尽管从终端查看它显示 775
【发布时间】:2015-03-18 21:29:25
【问题描述】:

我无法根据生产服务器的克隆设置开发服务器。我们使用 CMS,它的某些脚本似乎存在权限问题。为了深入了解它,我们设置了一个 PHP 脚本来测试权限,并进入终端比较它的发现。

我们的测试脚本如下

//try one of the essential folders of the CMS
$path= '[our_base_dir]/html/cms/content'

echo $path.' is'.(!is_writable($path) ? ' NOT' : '').' writable.<br/>';

打印出来的

[our_base_dir]/html/cms/content is NOT writable.

但是,当进入航站楼时,我不明白为什么会这样。这是它的输出:

$ getfacl content
# file: content
# owner: cchapman
# group: cchapman
user::rwx
user:apache:rw-
group::rwx
mask::rwx
other::r-x

$ grep 'cchapman' /etc/group
cms:x:510:cchapman,apache
cchapman:x:512:cms,apache

我相信apache 用户是需要具有写入权限的用户,而cmscchapman 用户只是文件所有者,具体取决于它们的创建方式。无论如何,这三个应该能够根据组权限读取和写入彼此的文件。

这在文件级别和目录级别都是一样的。我唯一的想法是在文件级别处理 Apache 用户的方式有问题。会是这样吗?或者还有什么会赋予不同的访问权限?

【问题讨论】:

  • absolute 路径 /html/cms/content 是否正确?正确如:不是./html/cms/content,而是和realpath('/html/cms/content');一样?因为作为绝对路径,/html/cms/content 对我来说没有多大意义
  • 同时检查apache是​​否没有使用www-datauser
  • 添加到 cchpman 组后是否重启了 apache?
  • @Marek 我们确实尝试重新启动 apache,但似乎没有任何变化
  • 我的意思是httpd.conf,或者任何加载的conf。可能有User apache 设置,也可以有Group 设置。

标签: php apache terminal file-permissions


【解决方案1】:

我怀疑我的评论实际上是答案,所以我将它作为一个发布:

通过在路径字符串/html/cms/content 上调用is_writable,您正在检查绝对 路径/html/cms/content 是否可写。我相信你想要的是:

$path = realpath('./html/cms/content');//note the .
if (is_writable($path))
    printf('"%s" is writable', $path);

如果您要检查的路径真的 /html/cms/content,这对我来说似乎很奇怪(我希望/var/www/base_dir/html/cms/content 或其他东西),那么请确保获得realpath(即:没有符号链接等等)。所以总是打电话给realpath(就像我在上面的sn-p中所做的那样)。

除此之外:您有一个apache 用户,这很好,但您确定该用户正在执行该脚本吗? www-datanobody 也很常见。检查实际运行您的代码的用户,并确保该用户也具有适当的权限。

【讨论】:

  • 抱歉回复评论延迟。不过你是对的,我确实解释了尝试简化它的路径,我发现我已经过度简化了它。我已将问题中的代码从/html/cms/content 编辑为'[our_base_dir]/html/cms/content'
  • 关于检查哪个用户正在运行脚本...get_current_user() 是获得该脚本的合适方法吗?从我到目前为止运行的情况来看,这显示了运行该方法的 test.php 文件的所有者。在这种情况下,cchapman 将是目录的所有者,因此肯定是可写的……但我不确定这是否正确……
  • @cchapman900 你需要使用posix函数:php.net/manual/en/ref.posix.php
  • @cchapman900: 使用get_current_user 应该没问题,但这取决于你如何执行你的代码。如果您运行命令行测试脚本,则当前用户将是运行 cli 脚本的用户。只需转储当前用户,并使用浏览器获取 apache 正在使用的用户(并使用var_dump(exec('whoami'));,只是为了安全起见)
猜你喜欢
  • 2012-06-29
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
相关资源
最近更新 更多