【问题标题】:Permissions set to 777 and file still not writeable权限设置为 777 并且文件仍然不可写
【发布时间】:2021-02-07 13:36:58
【问题描述】:

我已将文件权限设置为 777,但我无法使用 PHP 写入文件。

我可以在我的 FTP 客户端中清楚地看到该文件具有 0777 权限,并且当我这样做时:

echo (true === is_writable('file.txt')) ? 'yes' : 'no';

我得到“不”;

我也试过了:

echo (true === chmod('file.txt', 0777)) ? 'yes' : 'no';

结果相同。

目录列表如下所示:

public_html
    public          0777
        css         0755
        js          0755
        file.txt    0777

我正在使用 .htaccess 文件将所有流量重定向到公共子文件夹。当然,我已经将文件排除在重写之外(可以从我检查的浏览器访问):

RewriteRule  ^(file).*  - [L]

为什么会这样?

【问题讨论】:

  • 你有文件夹的写权限吗?
  • 您能提供文件的目录列表吗?有没有可能你不是楼主?另外,可能是FTP服务器配置问题。
  • 你为什么要做 === 操作符?
  • 您可以使用普通文本编辑器或终端命令(触摸)写入文件吗?
  • @Daniel A. White:=== 运算符也检查类型相等性,既然我们已经知道 is_writable 返回一个布尔值,那么它应该与使用 == 的效果相同

标签: php apache mod-rewrite


【解决方案1】:

我猜 Apache 以不同于拥有该文件的用户/组的身份运行。在这种情况下,文件本身需要是0777

public 只需要0777 如果您打算使用 PHP 将文件添加到文件夹中。即使文件夹本身不是0777,如果文件是并且文件夹至少有5 供用户(read/execute)使用,您应该可以写入文件。

最后,你的文件树应该是这样的:

public_html
    public
        file.txt  0777

当然,您无法使用 PHP 更改这些权限,但您可以通过 FTP 客户端进行更改。

如果仍然无法正常工作,PHP 可能正在安全模式下运行,或者您可能正在使用诸如 PHP Suhosin 之类的扩展程序。将文件的所有者更改为运行脚本的同一用户/组可能会获得更好的结果。

要获取执行用户的用户/组 ID,您可以使用以下命令:

<?php
echo getmyuid().':'.getmygid(); //ex:. 0:0
?>

然后,您可以使用chown(在终端中)更改文件的所有者:

> chown 0:0 file.txt

【讨论】:

  • 实际上它是一个共享主机环境,所以我无法访问外壳。但无论如何,感谢您提供非常有用的答案。我决定修改我的脚本,以便它使用数据库而不是文本文件来写入数据。现在可以了。
  • 我只想补充一点,我设置了正确的所有者,但我的文件仍然不可写。原因是 SELinux,如此答案 stackoverflow.com/a/9819118/2522817 中所述
【解决方案2】:

在安装 vqmod 并授予所有必要权限后,我在 opencart 中遇到了这个错误。

研究了一下,找到了。

“MODS CACHE PATH NOT WRITEABLE”实际上是指 vqmod 文件夹本身,而不是缓存文件夹。

sudo chmod -R 777 vqmod 

在你的根目录中.....

【讨论】:

    【解决方案3】:

    您必须在创建文件后立即对其进行 chmod。

    function Doo_Chmod($path, $chmod = null)
    {
        if (file_exists($path) === true)
        {
            if (is_null($chmod) === true)
            {
                $chmod = (is_file($path) === true) ? 644 : 755;
    
                if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true)
                {
                    $chmod += 22;
                }
            }
    
            return chmod($path, octdec(intval($chmod)));
        }
    
        return false;
    }
    

    【讨论】:

    • 我上传了文件。我没有在 PHP 中创建它。
    • 这样做:var_dump(get_current_user());当前用户是否与上传文件的 FTP 用户相同?如果不是,那是您的问题,您需要使用 FTP 客户端对其进行 CHMOD,然后您可以使用我上面发布的功能(或手动 CHMOD)。
    【解决方案4】:

    与上面的问题没有严格的关系,不过,我会把它放在这里供以后的访问者使用,因为我是来这里阅读标题的。 来自arch wiki

    文件属性

    除了控制用户和组读、写的文件模式位 和执行权限,几个文件系统支持文件属性 允许进一步定制允许的文件操作。这个 部分描述了其中一些属性以及如何使用它们。

    警告:默认情况下,cp、rsync、 和其他类似的程序。 chattr 和 lsattr

    对于 ext2 和 ext3 文件系统,e2fsprogs 包包含 列出和更改文件属性的 lsattr 和 chattr 程序, 分别。尽管有些文件系统并不支持所有文件系统,但 可用的属性是:

    a: append only
    c: compressed
    d: no dump
    e: extent format
    i: immutable
    j: data journalling
    s: secure deletion
    t: no tail-merging
    u: undeletable
    A: no atime updates
    C: no copy on write
    D: synchronous directory updates
    S: synchronous updates
    T: top of directory hierarchy
    

    例如,如果您想在某个文件上设置不可变位,请使用 以下命令:

    # chattr +i /path/to/file

    要删除文件的属性,只需将 + 更改为 -。

    对于没有附加属性的文件,lsattr 如下所示:

    $ lsattr /etc/hosts
    -------------e- /etc/hosts
    

    【讨论】:

      猜你喜欢
      • 2014-12-31
      • 2014-02-10
      • 2015-06-04
      • 2015-03-24
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      相关资源
      最近更新 更多