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

phk*_*phk 10 gzip file-format

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

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

phk*_*phk 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";
}
Run Code Online (Sandbox Code Playgroud)

  • +1但是IMO,像原始文件一样打印到标准输出(但不附加换行符)比写入硬编码文件名要好。你可以重定向到一个文件,或者通过管道重定向到 `less` 或 `hd` 或 `hd | 少`或什么。 (2认同)
  • 没关系。和 unshift 而不是 push 对你想如何使用它有意义,仍然允许将输出文件名指定为唯一的参数。我个人反对在没有用户明确命令的情况下覆盖文件 - 重定向或`-o`选项或其他东西。让脚本自动从两个输入中的第一个 arg 切换到第一个并且仅输出 arg 对我来说似乎有风险且容易发生事故(诱人的墨菲)。 (2认同)