在PHP中打开Linux终端命令

syr*_*ull 5 php linux

我有一台在Linux上运行的服务器,它可以执行12个节点的命令(其中12个运行Linux的计算机).我最近在服务器上下载了PHP,以创建可以通过打开特定的PHP文件来执行命令的网页.

我用exec(),passthru(),shell_?exec(),和system().system()是唯一一个返回我的代码的一部分.我希望PHP在linux中像开放的termainal命令一样,我无法弄清楚如何做到这一点!

下面是一个现在正在发生的事情的例子(Linux直接与PHP):当直接使用linux open terminal命令时:

user@wizard:/home/hyperwall/Desktop> /usr/local/bin/chbg -mt
Run Code Online (Sandbox Code Playgroud)

我得到一个输出:

The following settings will be used:
  option = mtsu   COLOR =    IMAGE = imagehereyouknow!
  NODES  = LOCAL
and additional code to send it to 12 nodes.
Run Code Online (Sandbox Code Playgroud)

现在使用PHP:

switch($_REQUEST['do'])
{ case 'test':
    echo system('/usr/local/bin/chbg -mt');
    break;
}
Run Code Online (Sandbox Code Playgroud)

输出:

The following settings will be used:
  option = mtsu   COLOR =    IMAGE = imagehereyouknow!
  NODES  = LOCAL
Run Code Online (Sandbox Code Playgroud)

然后停下来!任何人都有解释发生了什么?以及如何解决它?只有系统显示部分代码,其他功能不显示任何内容!

mad*_*adz 4

我的第一个想法是这可能与标准和输出错误有关。某些软件将一些信息转储到标准输出上,并将一些信息转储到标准错误中。当您不将 std 错误重定向到 std out 时,大多数系统调用仅返回 stdout 部分。听起来这就是为什么您在终端中看到整个输出而不能在系统调用中看到的原因。所以尝试用

 /usr/local/bin/chbg -mt 2>&1  
Run Code Online (Sandbox Code Playgroud)

编辑: 另外,对于临时工作,您可以尝试其他一些操作。例如,将输出重定向到脚本旁边的文件,并在执行命令后读取其内容,这样您可以使用 exec:

exec("usr/local/bin/chbg -mt 2>&1 > chbg_out");
//Then start reading chbg_out and see is it work
Run Code Online (Sandbox Code Playgroud)

Edit2 另外,为什么其他人不为你工作也是没有意义的。例如,这段用 c 编写的代码,在 stderr 中转储一个字符串,在 stdout 中还有其他字符串。

#include <stdio.h>
#include<stdlib.h>
int main()
{

    fputs("\nerr\nrro\nrrr\n",stderr);
    fputs("\nou\nuu\nuttt\n",stdout);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个 php 脚本尝试通过 exec 运行它:

<?php

exec("/tmp/ctest",&$result);

foreach ( $result as $v )
{
echo $v;
}
#output ouuuuttt
?>
Run Code Online (Sandbox Code Playgroud)

看到它仍然转储标准输出。但它没有收到stderr。现在考虑一下:

<?php

exec("/tmp/ctest 2>&1",&$result);

foreach ( $result as $v )
{
    echo $v;
}
//output: errrrorrrouuuuttt
?>
Run Code Online (Sandbox Code Playgroud)

看,这次我们得到了全部输出。

这次系统:

<?php
     echo system("/tmp/ctest 2>&1");
     //output: err rro rrr ou uu uttt uttt
?>
Run Code Online (Sandbox Code Playgroud)

等等 ...