【问题标题】:php proc_open 'su: must be run from a terminal'php proc_open 'su: 必须从终端运行'
【发布时间】: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


【解决方案1】:

su 命令只会在执行它的 bash shell 仍在运行时更改当前用户。即使您要执行 $cmd = 'bash -c "sudo su testuser"' (将按预期执行),您也只会更改当前用户,直到执行 proc_close,所以 exec(' whoami') 将始终为您提供最初启动您的 php 脚本的用户的用户名。但是您可以使用粗体命令执行 bash shell,该 shell 将以 testuser 身份执行,然后通过管道将命令传递给它。例如,如果您使用管道 'whoami' 而不是 'nirvana3105\r' whoami 应该返回 'testuser'。希望对您有所帮助。

试试这个代码(用你的密码替换密码):

<?php
    $cmd = "sudo -S su testuser";

    echo $cmd;

    $desc = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w'));
    $pipes = array();

    $process = proc_open($cmd, $desc, $pipes);
    fwrite($pipes[0], "password\n");
    fwrite($pipes[0], "whoami");
    fclose($pipes[0]);
    $string = array(stream_get_contents($pipes[1]), stream_get_contents($pipes[2]));
proc_close($process);

    print_r($string);
 ?>

【讨论】:

  • 当我从终端运行该代码时,它可以工作。由于在您的上述问题中 whoami 返回 www-data 我假设您正在通过 apache 运行它?如果是这样,您需要使用“sudo adduser www-data sudo”将 www-data 添加到 sudo 组。但是请注意,这可能不推荐,因为您不希望 apache 网络用户拥有这种权限。如果这仅适用于您拥有的本地 Intranet 站点或类似站点,则应该没问题,否则这会对您的系统构成一些安全威胁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多