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 of chmod()吗?它明确指出:“模式参数由三个八进制数组成”。它不允许更改 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:权限被粘性位拒绝

php 忽略来自ajax调用的粘性帖子

php Botónpublicar粘性

php GeneratePress粘性页脚