簡體   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