如何获取gzip存档的尾随数据?


10

我有一个带有尾随数据的gzip存档。如果我用gzip -d它解包,它会告诉我:“ 解压缩好,忽略了尾随垃圾 ”(同样gzip -t,可以用作检测是否有此类数据的方法)。

现在,我想了解这个垃圾,但奇怪的是,我找不到任何方法来提取它。gzip -l --verbose告诉我档案的“压缩”大小是文件的大小(即带有尾随数据),这是错误的,没有帮助。file也没有帮助,那我该怎么办?

Answers:


10

现在想出了如何获取尾随数据。

我创建了Perl脚本,该脚本创建了带有尾随数据的文件,该文件很大程度上基于https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=604617#10

#!/usr/bin/perl
use strict;
use warnings; 

use IO::Uncompress::Gunzip qw(:all);
use IO::File;

unshift(@ARGV, '-') unless -t STDIN;

my $input_file_name = shift;
my $output_file_name = shift;

if (! defined $input_file_name) {
  die <<END;
Usage:

  $0 ( GZIP_FILE | - ) [OUTPUT_FILE]

  ... | $0 [OUTPUT_FILE]

Extracts the trailing data of a gzip archive.
Outputs to stdout if no OUTPUT_FILE is given.
- as input file file causes it to read from stdin.

Examples:

  $0 archive.tgz trailing.bin

  cat archive.tgz | $0

END
}

my $in = new IO::File "<$input_file_name" or die "Couldn't open gzip file.\n";
gunzip $in => "/dev/null",
  TrailingData => my $trailing;
undef $in;

if (! defined $output_file_name) {
  print $trailing;
} else {
  open(my $fh, ">", $output_file_name) or die "Couldn't open output file.\n";
  print $fh $trailing;
  close $fh;
  print "Output file written.\n";
}

2
+1,但IMO与原始一样(但不附加换行符)打印到stdout比写入硬编码的文件名更好。您可以重定向到文件或管道lesshdhd | less或什么的。
cas

@cas:谢谢您的投入。现在添加了一些参数处理。我的第一个perl脚本BTW,我知道时间会一天。
phk

1
很好的改善。如果可以的话,我会再次投票:)还有一个想法-这样的程序实际上不需要输入文件,它与处理stdin一样好。并且while (<>)循环perl将读取stdin和@ARGV中列出的任何文件....,这使得编写与过滤器(例如,读取stdin,写入stdout)和命名文件一样工作的脚本变得容易)。当然,stdout始终可以重定向到文件。我的大多数perl脚本都是作为过滤器编写的,以利用此优势。
cas

1
push @ARGV,'-' if (!@ARGV);之前my $input_file_name = shift;,这里需要的就是所有这些。即默认arg -(如果$ ARGV [0] =='-h'或'--help',则可以打印帮助消息。)。对于while(<>)循环,您甚至不需要执行此操作,但可能比给这样编写它要麻烦得多IO::Uncompress::Gunzip
cas

2
没关系。使用unshift而不是push可以理解您的使用方式,但仍然允许将输出文件名指定为唯一的arg。我个人不希望文件在没有用户明确命令的情况下被覆盖-重定向或-o选项之类的东西。让脚本自动地从输入的两个arg切换到输入的arg,然后仅输出arg似乎对我来说是冒险和容易发生的(诱人的墨菲)。
cas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.