PHP是不是阻止了粘性位?
Posted
技术标签:
【中文标题】PHP是不是阻止了粘性位?【英文标题】:Is PHP blocking the sticky bit?PHP是否阻止了粘性位? 【发布时间】: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 ofchmod()
吗?它明确指出:“模式参数由三个八进制数组成”。它不允许更改 setuid、setgit 或stick bit。
@axiac 文档声明仅在启用安全模式时:启用安全模式时,PHP 会检查您将要操作的文件或目录是否具有相同的 UID(所有者)作为正在执行的脚本。此外,您不能设置 SUID、SGID 和粘滞位。
@axiac,我在下面的答案中找到了解决方案。并且 PHP 的 chmod 接缝完全能够更改粘性位,只要它不会被 chown() 或 chgrp() 重置
@axiac 是的,我认为这是手册中的旧信息或错误信息。从当前代码的外观来看,chmod 只是 passes through 为底层系统调用提供的掩码,并且粘性位应该可以通过。 (安全模式在 PHP 5.4 中被移除,因此它与文档或当前 PHP 源代码也不再相关。)
【参考方案1】:
好的,找到问题了。 显然 PHP 的 chown() 和 chgrp() 函数将粘性位重置为 0。因此 chmod() 必须是最后一个被调用以保留权限的函数。
【讨论】:
另见unix.stackexchange.com/questions/53665/…;它不一定只是 PHP。 是的,这是有道理的。 PHP 的函数很可能只是 C 函数的包装器,这将使所有依赖这些函数的东西都成为这种情况。 @Daniel B,我似乎无法复制您的解决方案。所有详细信息都是in this new question。我想知道你是否可以帮忙......以上是关于PHP是不是阻止了粘性位?的主要内容,如果未能解决你的问题,请参考以下文章
Sqoop 导入错误:org.apache.hadoop.security.AccessControlException:权限被粘性位拒绝