【发布时间】:2018-07-31 14:49:01
【问题描述】:
我正在使用以下 php 代码:
<?php
exec ("awk -F'|' -vOFS='|' '(NR==FNR){a[$1]=$0; next}{if(a[$1]){print $2,a[$1]}}' /var/log/apache2/forensic_log.log /var/log/apache2/access.log | cut -d'|' -f1,3- > i/content/other/LOG_FILE.log");
?>
它与日志文件进行比较,如果日志 ID 匹配,则连接内容并将其输出到 LOG_FILE.log。因此,我应该在 LOG_FILE.log 中有类似的东西
[14/May/2018:06:37:07 +0300]|HEAD /favicon.ico HTTP/1.0|Host:host.com|Connection:close
这段代码运行了很长时间,但现在它似乎在某个地方失败了,因为 LOG_FILE.log 是空白的。
- 我检查了脚本中提到的路径 - 它们是正确的。
- 使用两个日志文件在本地尝试了脚本 - 它可以正常工作并产生预期的输出到 LOG_FILE.log
- 问题似乎是我们将 apache2 更新为 'Apache/2.4.34' 时出现的
- 为文件添加权限: LOG_FILE.log - 777 执行 PHP 代码的文件 - 664 访问日志 - 640 forensic_log.log - 640
添加简化代码:
<?php
$output=exec("awk -F'|' -vOFS='|' '(NR==FNR){a[$1]=$0; next}{if(a[$1]){print $2,a[$1]}}' /var/log/apache2/forensic_log.log /var/log/apache2/access.log");
echo $output;
?>
此代码不回显任何内容。
对于这么混乱的问题我很抱歉,但我不是代码的作者,也不熟悉 PHP,但我仍然必须以某种方式处理这个问题。
【问题讨论】:
-
在执行 awk 命令之前,awk 变量“$0”、“$1”和“$2”是否被 PHP 替换?
-
尝试使用 exec 函数的
$output和$return_var值来调试:string exec ( string $command [, array &$output [, int &$return_var ]] )。 (您也可以简单地将exec替换为echo以确认 PHP 不会弄乱命令文本。) -
为方便起见,您可以先尝试调试 AWK 命令以确保它产生非空输出:
exec ("awk -F'|' -vOFS='|' '(NR==FNR){a[$1]=$0; next}{if(a[$1]){print $2,a[$1]}}' /var/log/apache2/forensic_log.log /var/log/apache2/access.log", $output, $return_var); -
我试图简化代码,但命令的输出似乎是空白:
$output=exec("awk -F'|' -vOFS='|' '(NR==FNR){a[$1]=$0; next}{if(a[$1]){print $2,a[$1]}}' /var/log/apache2/forensic_log.log /var/log/apache2/access.log"); echo $output;- 此命令不回显任何内容。 -
@AndriyMakukha 我已经按照你的建议用简化的代码更新了描述,它没有任何回应,你有什么建议吗?