当您从 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 上测试]