【问题标题】:perl: capturing STDOUT- logfile ends up binaryperl:捕获 STDOUT- 日志文件以二进制结尾
【发布时间】:2012-09-07 19:27:46
【问题描述】:

我编写了一个脚本,将数据输入到一个名为 ctffind 的 exe 程序中。 exe 程序将一堆数据输出到我试图在日志文件中捕获的屏幕。

这是我现在正在使用的

my $logout = logfile 
open STDOUT, '>>', "$logout";
open my $PIPE1, '|-', '/opt/ctf/ctffind3_mp.exe' or die $!;

它可以将屏幕上出现的所有内容输出到日志文件中。

如果我more $logfile 文件按预期显示,它大约有 5000 行长,并且有大约 50 行包含字符串“最终值”。在我的下一步中,我执行grep "final values" logfile 它认为日志文件是一个二进制文件并且不起作用而是返回:

Binary file logfile matches

如何设置它以使日志文件正确编码? ctffind.exe 在运行时也会生成二进制文件,这是问题的一部分吗?

【问题讨论】:

  • file 命令告诉您有关您的日志文件的什么信息(即在命令行上执行file logfile)?
  • 听起来你有一些奇怪的零字节或那里的东西。 grep -a pattern file 是“二进制文件匹配”问题的解决方法。
  • 我以前在使用日志文件时遇到过这个问题。我敢打赌,您在输出中的某处有一个不可见(不可打印)的字符。您可能会寻找其中的一些(^P 是我之前被咬过的一个)。
  • grep -a 已修复!!!谢谢!
  • (@tripleee:如果你让你评论一个答案并在这里通知我,我会投票赞成 - 如果你关心的话。)

标签: perl encoding stdout


【解决方案1】:

感谢评论者的建议,我找到了两种不同的方法来解决问题:

  1. 可以将grep logfile更改为grep -a logfile

  2. 可以使用strings logfile logfile2 制作可用版本的日志文件。

【讨论】:

    【解决方案2】:

    文件第一个块中的 Ascii NUL (\000) 足以让 Perl 将文件称为“二进制”文件。

    echo "hello world\000" > myfile
    perl -E '$f=shift;open $fh,"<",$f or die;say -e $f && -B $f ? "binary":"text"' myfile
    

    【讨论】:

    • 不是 Perl 说它是二进制文件,而是 grep。但它可能有类似的启发式。
    【解决方案3】:

    ctffind3_mp.exe 中可能有代码来进行屏幕格式化,例如更改颜色、加粗、清除屏幕等。有几种方法可以消除这些:

    • 您可以通过 cat -v 将其通过管道传输,这会将所有不可打印的内容转换为 ASCII 表示形式(例如,NUL 变为 ^@)。
    • 可能有用于从文本中去除 ANSI 或 VT100 序列的特定实用程序 -- 尝试询问超级用户。
    • 您可以尝试将$TERM(或在perl 中的$ENV{'TERM'})设置为unknown,希望程序不再发出任何特殊的颜色、粗体等序列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2021-06-11
      • 2019-01-13
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多