【发布时间】:2014-01-04 03:28:40
【问题描述】:
我在个人 Ubuntu Server 机器上有这个 PHP 代码:
$cmd = 'su testuser'; $descriptorspec = 数组( 数组('管道','r'), 数组('管道','w'), 数组('管道','w') ); $pipes = 数组(); $process = proc_open($cmd, $descriptorspec, $pipes); fwrite($pipes[0], '密码\r'); fclose($pipes[0]); $string = array(stream_get_contents($pipes[1]), stream_get_contents($pipes[2])); proc_close($进程); 回声 exec('whoami') 。 "\n"; print_r($string);我从 PHP 得到这个响应:
www-数据 大批 ( [0] => [1] => su: 必须从终端运行 )很明显我想更改活动用户,但是有什么办法可以从 php 中做到这一点?
【问题讨论】:
-
如果要运行特定命令或脚本,请使用
sudo或设置sticky bit。但是在脚本上要小心,因为它们可能会被中断,而你仍然拥有底层解释器/shell + 环境 + 环境变量。 -
不能改变当前进程的活跃用户,只能在一个new进程中切换到另一个用户。如果您在 bash 中使用
su,您可以看到它对ps f的实际作用:它是一个全新的外壳。同样,您无法更改 php 运行的进程,但您可能能够启动子进程(尽管我通常会在网络服务器中避免这种情况)。根据您对其他用户的需要,suphp之类的软件包或使用SuExec可能是您问题的解决方案。另一种选择是使用正确的用户运行像 gearmand 这样的守护程序,它服从来自 www-data 的请求。
标签: php shell ubuntu-12.04 proc-open