当前位置: 首页 > 知识库问答 >
问题:

php proc_open“su:必须从终端运行”

韩安顺
2023-03-14

我在个人Ubuntu服务器机器中有以下PHP代码:


    $cmd = 'su testuser';
    $descriptorspec = array(
        array('pipe', 'r'),
        array('pipe', 'w'),
        array('pipe', 'w')
    );
    $pipes = array();
    $process = proc_open($cmd, $descriptorspec, $pipes);
    fwrite($pipes[0], 'password\r');
    fclose($pipes[0]);
    $string = array(stream_get_contents($pipes[1]), stream_get_contents($pipes[2]));
    proc_close($process);
    echo exec('whoami') . "\n";
    print_r($string);

我从PHP得到这样的回答:

www-data
Array
(
    [0] =>
    [1] => su: must be run from a terminal

)

很明显,我想改变活跃的用户,但是有没有办法从php中做到这一点?

共有1个答案

南门焱
2023-03-14

su命令只会在当前用户所在的bashshell仍在运行时更改当前用户。即使要执行$cmd='bash-c“sudo su testuser”“(将按预期执行),在执行proc_close之前,您也只会更改当前用户,因此exec('whoami')将始终为您提供最初启动php脚本的用户的用户名。但是您可以使用粗体命令来执行一个bashshell,它将以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);
 ?>
 类似资料:
  • 我使用的是一个安装了Ubuntu的云虚拟机。安装的Java版本为: 在编译java程序时,我必须使用两个jar:和。我使用的终端命令是: 使用将disco和sqlite jar添加到类路径中。 这将在目录中创建我的文件,而不会出现错误。这些JAR包含在目录中。 包含这部分代码,从头开始: 当我在终端中运行以下内容时,问题就开始了: 终端机显示我: 错误:出现JNI错误,请检查您的安装并在线程“ma

  • 因此,我正在运行Sierra,当我在终端输入“r”或“r”时,我得到“-bash:r:command not found”。如果我在终端中键入“which r”,我不会得到任何输出。 以下是“echo$path”的输出:/versions/2.7/bin://usr/local/bin://bin://bin://sbin://sbin://sbin://users/samuelcolon/.rv

  • 我想通过运行以下命令从Mac OSX终端运行/打开Visual Studio代码。我在这里找到了说明: https://code.visualstudio.com/docs/setup 显然我需要在我的文件中包含这一点,所以我做了,但没有用。 我在此处编辑了文件:

  • 我已经使用cp编译了我的代码 导入com。mysql。jdbc。连接 导入com。mysql。jdbc。编制的报表 导入com。mysql。jdbc。声明 导入java。io。* 导入java。sql。DriverManager 导入java。sql。SQLException 导入java。util。ArrayList; 公共类HttpHeaderParser{ 这里有一些java字符串操作。然后

  • 我有以下文件夹结构: null 当我运行Pycharm的fish.py时,它工作得非常好。但是,当我从终端运行fish.py时,我得到错误的模块。 我在终端中使用的命令:来自应用程序文件夹。 我已经研究了这里建议的解决方案:从不同的文件夹导入文件,将应用程序文件夹的路径添加到帮助中。但是,我想知道是否有其他方法可以使它工作,而不在中添加两行代码。这是因为我在/products目录中有许多脚本,不想

  • 我有一个编辑文本。我希望这个编辑文本始终保持焦点和可写性。我怎么能每次都不碰它呢?因为条形码扫描器机器将数据连续发送到此应用程序。 我尝试了很多方法。但它们都不起作用。我可以设置键盘是可见的,但光标不在编辑文本上。