【问题标题】:PHP : add new permission to a filePHP:向文件添加新权限
【发布时间】:2019-01-02 17:00:23
【问题描述】:

在我的服务器上,我有一些具有不同权限的文件。

在我的 php 脚本中,我想为每个文件添加 writing 权限到 group

使用 linux cmd,chmod g+w file 完成这项工作。

但是如何使用php chmod() 做到这一点?

这是我迄今为止尝试过的:

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

这给了我我想要的东西,但是有一个php 替代 linux chmod g+w 吗?

【问题讨论】:

  • 根据文档,您不能使用g+w 作为chmod 函数的第二个变量,只允许使用整数。有两种选择:1)使用直接shell(创建新进程,也应该转义文件路径); 2) 使用额外的函数将字符串转换为 int - 具体示例可以在这里找到php.net/manual/en/function.chmod.php#82751
  • 请注意,chmod 采用八进制值,20 与 020 不同。

标签: php chmod


【解决方案1】:

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

虽然您的示例“有效”,但如果文件已经具有 g+w,则会导致不良结果,因为添加另外 20 会打开额外的位并授予文件您不想要的额外权限。例如,如果文件权限为020,而您在其中添加了020,它将变为040

Posix 文件权限是八进制位,其中每个数字代表读、写和执行的组合。因此,添加操作 (+) 不正确,您需要使用按位操作,例如 ANDOR 来打开或关闭各个位。对于 PHP、C、C++ 和最常用的语言,AND 运算符是 & 符号 (&),OR 运算符是管道符号 (|)。由于我们希望打开位,我们需要使用 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));

但是请注意,这种用法比直接在 PHP 中使用内置的 chmod 函数要慢得多。它还可能使您面临潜在的安全问题。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 2018-10-29
    • 2011-11-26
    • 2012-07-13
    • 2017-06-27
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多