PHP中shell_exec执行mvsce命令多行输出仅显示第二行的解决办法
问题:PHP shell_exec仅显示命令输出的第二行内容
你遇到的情况核心原因和shell命令的输出流有关:shell_exec() 默认只会捕获标准输出(stdout),如果 mvsce 命令的第一行输出("TAR 332")是发送到**标准错误(stderr)**的,就不会被当前代码捕获,所以浏览器只显示了输出到stdout的第二行内容。
解决方法:重定向标准错误到标准输出
只需要在shell命令末尾添加 2>&1,就能把stderr的内容重定向到stdout,让 shell_exec() 捕获到所有输出。修改后的代码如下:
<?php $mvdate = $_POST['fdate']; $mvlevel = $_POST['flevel']; $mvsite = $_POST['fsite']; // 添加 2>&1 实现stderr到stdout的重定向 $mvse = shell_exec('/usr/local/bin/mvsce -d "'.$mvdate.'" -l "'.$mvlevel.'" -s "'.$mvsite.'" 2>&1'); echo $mvse; ?>
重要安全提示:修复命令注入漏洞
这里必须提醒你,当前代码直接把POST参数拼接到shell命令里,存在严重的命令注入风险——恶意用户可以构造特殊参数执行任意shell命令。建议用 escapeshellarg() 转义所有参数,彻底规避这个问题:
<?php // 用escapeshellarg转义每个参数,自动处理特殊字符和引号 $mvdate = escapeshellarg($_POST['fdate']); $mvlevel = escapeshellarg($_POST['flevel']); $mvsite = escapeshellarg($_POST['fsite']); // 转义后的参数无需手动添加引号 $mvse = shell_exec("/usr/local/bin/mvsce -d $mvdate -l $mvlevel -s $mvsite 2>&1"); echo $mvse; ?>
escapeshellarg() 会把参数用单引号包裹,并转义内部的特殊字符,确保传入的参数只会被当作命令的参数,而不会被解析成额外的shell指令。
内容的提问来源于stack exchange,提问作者Justin Cooper-Marsh
相关产品推荐
相关产品推荐

