来自shell_exec的PHP多行输入未按预期工作
我有以下来自HTML的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
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>";