代码之家  ›  专栏  ›  技术社区  ›  Hamza Abdaoui

php:向文件添加新权限

  •  1
  • Hamza Abdaoui  · 技术社区  · 5 年前

    在我的服务器上,我有一些文件 权限 .

    在我的 php 脚本,我想添加 写作 许可 对于这些文件中的每一个。

    使用linux命令, chmod g+w file 做这项工作。

    但是如何使用 php chmod() ?

    这就是我迄今为止所尝试的:

    $filePermission = fileperms('myFile.txt');
    # g+w = 020
    chmod('myFile.txt', $filePermission+20);
    

    这给了我想要的,但是有没有 PHP Linux的替代方案 chmod g+w ?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Geoffrey    5 年前

    句法 g+w 对于PHP无效,也不是大多数编程语言,因为底层操作系统没有这些值的概念。这个 chmod syscall只接受八进制值,不接受字符串。在你的系统上 CHMOD 命令行可执行文件实现了一个解析器来实现这个自定义功能。

    当您的示例“有效”时,如果文件已经具有g+w,则会导致不希望的结果,因为添加另外20将打开其他位并授予您不希望的文件额外权限。例如,如果文件权限是 020 你补充说 020 对它来说,它会变成 040 .

    POSIX文件权限是八进制位,其中每个数字表示读、写和执行的组合。因此,添加操作( + )不正确,您需要使用位操作,例如 AND OR 打开或关闭单个位。对于PHP、C、C++和最常用的语言,AND运算符是符号和符号。 & )或运算符是管道符号( | )因为我们希望打开位,所以需要使用OR运算符。

    正确的处理方法是:

    $filePermission = fileperms('myFile.txt');
    chmod('myFile.txt', $filePermission | 020);
    

    注意,我在号码前面加了一个 0 这将使PHP将数字解释为八进制,而不是十进制。

    最近我做了一个视频来帮助人们理解 CHMOD 八进制符号是如何工作的,它可以帮助你完成你想要完成的任务。 https://www.youtube.com/watch?v=j8FLsxdl0ns

    如果您希望像命令行二进制文件那样拥有友好的menomic支持,那么您需要自己实现解析器,或者从PHP调用命令行二进制文件,例如:

    exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));
    

    但是请注意,这种用法比使用内置的要慢得多 CHMOD 直接使用php函数。它还可以让您了解潜在的安全问题。