当您从 root 到其他用户执行 posix_setuid 时,您将无法根据其权限访问 root 拥有的文件。例如,如果您更改进程的所有者,并且仍然需要以 600 权限打开 root 拥有的文件进行读写,您将收到权限被拒绝的错误。
有一些方法可以做到这一点(例如,unix 套接字或 tcp 守护进程等),但可能最简单的方法是
在更改进程所有权之前打开文件,将文件指针保存在全局变量中,并在更改所有权后使用它。
例如,假设 /root/test_file 是一个由 root:root 拥有的文件,具有 600 权限,并且您在 root 下运行此脚本。此代码将无法工作
<?php
posix_setgid(99);
posix_setuid(99);
$fd = fopen('/root/test_file','a');
fwrite($fd,"some test strings");
fclose();
?>
但这个代码将可以工作
<?php
$fd = fopen('/root/test_file','a');
posix_setgid(99);
posix_setuid(99);
fwrite($fd,"some test strings");
fclose();
?>
希望这对某些人有帮助。
[在 CentOS 5 - Linux 2.6.x - PHP 5.2.x 上测试]