Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自shell_exec的PHP多行输入未按预期工作_Php_Shell Exec - Fatal编程技术网

来自shell_exec的PHP多行输入未按预期工作

来自shell_exec的PHP多行输入未按预期工作,php,shell-exec,Php,Shell Exec,我有以下来自HTML的PHP帖子 mvsce-d1234-56-78-l1-s1命令的输出在bash中显示如下 TAR 332 PCXLA-TAACC 越过两条线 下面的代码仅输出第二行PCXLA-TAACC <?php $mvdate=$_POST['fdate']; $mvlevel=$_POST['flevel']; $mvsite=$_POST['fsite']; $mvse = shell_exec ('/usr/local/bin/mvsce -d "'.$mvdate

我有以下来自HTML的PHP帖子

mvsce-d1234-56-78-l1-s1
命令的输出在bash中显示如下

TAR 332 
PCXLA-TAACC 
越过两条线

下面的代码仅输出第二行
PCXLA-TAACC

<?php
$mvdate=$_POST['fdate'];
$mvlevel=$_POST['flevel'];
$mvsite=$_POST['fsite'];

$mvse = shell_exec ('/usr/local/bin/mvsce -d "'.$mvdate.'" -l "'.$mvlevel.'" -s "'.$mvsite.'"');

echo $mvse;

?>

如何让代码在浏览器窗口中同时显示这两行

简短回答:您必须呈现最小的HTML页面,并根据HTML设置输出格式。


让您的脚本
makevsce.php
开始向客户端发送一个最小的HTML页面,页面正文为“open”

<?php
header( "Content-Type: text/html; charset=utf-8" );

echo "<!DOCTYPE html>\n";
echo "<html>\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\">\n";
echo "<title>Shell Output (or whatever...)</title>\n";
echo "</head>\n";
echo "<body>\n";

使用而不是
shell\u exec

exec( "/usr/local/bin/mvsce -d $mvdate -l $mvlevel -s $mvsite",
      $mvse,
      $return_value );
$mvse
(通过引用传递)将接收一个数组,其中包含作为调用命令的输出发送的所有行

而(可选)参数
$return\u value
保存shell命令的返回值


显示输出:

foreach( $mvse as $line ) {
    echo htmlspecialchars( $line ) . "<br>\n";
foreach($mvse作为$line){
回显htmlspecialchars($line)。“
\n”;
请注意,在打印之前,每个输出行文本都是正确的HTML转义,因为您谈论的是在浏览器中显示输出

在每行末尾,浏览器将把

解释为换行符


最后关闭HTML页面:

echo "</body>\n";
echo "</html>";
echo“\n”;
回声“;

安全通知:

foreach( $mvse as $line ) {
    echo htmlspecialchars( $line ) . "<br>\n";
请注意,您正在通过shell执行使用客户端输入创建的命令

正确伪造的请求可能会导致以与PHP运行时相同的权限执行任意命令。

OK

这不是PHP代码的问题

如果我将命令的输出写入console以外的任何对象,它只会写入第2行


感谢您的帮助。

仍然只报告了第二行,我已经修改了这个问题,以真正反映bash的输出。@JustinCooper Marsh对我的答案做了一些补充。看一看……您是否可以运行相同的命令(减去任何$\u POST变量),而不是运行相同的东西(您的
shell\u exec()中有引号)
例如,调用。因此我将命令中的变量替换为实际数字。从命令行运行php会将这两行报告到控制台。从浏览器运行php时,只显示第二行。我要说的是,尝试从命令行尝试的确切命令-剪切并粘贴到脚本中。我这样做是为了运行php从控制台,它按预期显示两行。从浏览器运行时,只显示第二行。然后,浏览器的页面呈现出现问题。您呈现的有效HTML页面至少包含
[…]
标签和正文。你呢?。顺便说一下:我编辑了我的答案。你仍然需要呈现一个正确的html页面。这没有多大意义。可能命令正在向
stderr
发送一些输出(第一行)。尝试在命令末尾添加
2>&1
(由PHP发出的命令)
/usr/local/bin/mvsce-d$mvdate-l$mvlevel-s$mvsite2>&1
echo "</body>\n";
echo "</html>";