PHP : 为文件添加新权限
PHP : add new permission to a file
在我的服务器上,我有一些具有不同权限的文件。
在我的 php
脚本中,我想为每个文件添加 写入 到 组 的权限。
使用 linux 命令,chmod g+w file
完成工作。
但是如何使用 php chmod()
做到这一点?
这是我目前尝试的方法:
$filePermission = fileperms('myFile.txt');
# g+w = 020
chmod('myFile.txt', $filePermission+20);
这给了我想要的,但是 linux chmod g+w
有 php
替代方案吗?
语法 g+w
对 PHP 无效,大多数编程语言也无效,因为底层操作系统没有这些值的概念。 chmod
系统调用只接受八进制值,不接受字符串。在您的系统上,chmod
命令行可执行文件已实现解析器来实现此自定义功能。
虽然您的示例 "works",但如果文件已经具有 g+w,则会导致不良结果,因为再添加 20 将打开额外的位并授予文件您不想要的额外权限。例如,如果文件权限是 020
并且您向其添加 020
,它将变为 040
.
Posix 文件权限是八进制位,其中每个数字代表读取、写入和执行的组合。因此加法运算 (+
) 是不正确的,您需要使用 AND
和 OR
等按位运算来打开或关闭各个位。对于 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
如果您希望像命令行二进制文件那样拥有友好的菜单支持,您将需要自己实现解析器,或者从 PHP 调用命令行二进制文件,例如:
exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));
但是请注意,这种用法比直接使用 PHP 中的内置 chmod
函数要慢得多。它还可能使您面临潜在的安全问题。
在我的服务器上,我有一些具有不同权限的文件。
在我的 php
脚本中,我想为每个文件添加 写入 到 组 的权限。
使用 linux 命令,chmod g+w file
完成工作。
但是如何使用 php chmod()
做到这一点?
这是我目前尝试的方法:
$filePermission = fileperms('myFile.txt');
# g+w = 020
chmod('myFile.txt', $filePermission+20);
这给了我想要的,但是 linux chmod g+w
有 php
替代方案吗?
语法 g+w
对 PHP 无效,大多数编程语言也无效,因为底层操作系统没有这些值的概念。 chmod
系统调用只接受八进制值,不接受字符串。在您的系统上,chmod
命令行可执行文件已实现解析器来实现此自定义功能。
虽然您的示例 "works",但如果文件已经具有 g+w,则会导致不良结果,因为再添加 20 将打开额外的位并授予文件您不想要的额外权限。例如,如果文件权限是 020
并且您向其添加 020
,它将变为 040
.
Posix 文件权限是八进制位,其中每个数字代表读取、写入和执行的组合。因此加法运算 (+
) 是不正确的,您需要使用 AND
和 OR
等按位运算来打开或关闭各个位。对于 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
如果您希望像命令行二进制文件那样拥有友好的菜单支持,您将需要自己实现解析器,或者从 PHP 调用命令行二进制文件,例如:
exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));
但是请注意,这种用法比直接使用 PHP 中的内置 chmod
函数要慢得多。它还可能使您面临潜在的安全问题。