【发布时间】:2018-12-24 00:59:38
【问题描述】:
我尝试使用 PHP 的 chmod 将权限设置为 02775。但由于某种原因,它只在文件中添加了 0775。我认为这可能是 PHP 的 chmod 实现或其他问题,所以我尝试使用 PHP 的 passthru() 函数运行“chmod 02775 路径”,但得到了相同的结果。我在 shell 中尝试了相同的命令,它运行良好。我使用 root 将脚本作为 CLI 运行,所以这不是用户限制问题。
我能想到的唯一原因是 PHP 以某种方式在受控环境中运行?否则 passthru() 至少应该有效。
【问题讨论】:
-
它作为文字直接添加到函数中。 chmod($path, 02775) 另一个就是 passthru("chmod 02775 '$path'")
-
你读过documentation of
chmod()吗?它明确指出:“模式参数由三个八进制数组成”。它不允许更改 setuid、setgit 或stick bit。 -
@axiac 文档声明仅在启用安全模式时:启用安全模式时,PHP 会检查您将要操作的文件或目录是否具有相同的 UID(所有者)作为正在执行的脚本。此外,您不能设置 SUID、SGID 和粘滞位。
-
@axiac,我在下面的答案中找到了解决方案。并且 PHP 的 chmod 接缝完全能够更改粘性位,只要它不会被 chown() 或 chgrp() 重置
-
@axiac 是的,我认为这是手册中的旧信息或错误信息。从当前代码的外观来看,chmod 只是 passes through 为底层系统调用提供的掩码,并且粘性位应该可以通过。 (安全模式在 PHP 5.4 中被移除,因此它与文档或当前 PHP 源代码也不再相关。)
标签: php linux file-permissions chmod