繁体   English   中英

perl:捕获STDOUT-日志文件最终以二进制形式出现

[英]perl: capturing STDOUT- logfile ends up binary

我写了一个脚本,将数据输入到一个名为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在运行时也会生成二进制文件,这是问题的一部分吗?

由于评论者的建议,我发现了两种解决问题的方法:

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

  2. 可以使用strings logfile logfile2来创建strings logfile logfile2的可用版本。

文件的第一个块中的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

ctffind3_mp.exe可能包含ctffind3_mp.exe代码来进行屏幕格式化,例如更改颜色,加粗字体,清除屏幕等。您可以通过以下几种方法消除这些内容:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM