gzip 아카이브에서 추적 데이터를 어떻게 얻나요?

gzip 아카이브에서 추적 데이터를 어떻게 얻나요?

추적 데이터가 포함된 gzip 아카이브가 있습니다. 이것을 사용하여 열면 gzip -d다음과 같이 표시됩니다.압축 해제 성공, 후행 가비지 무시"( gzip -t이러한 데이터가 존재하는지 여부를 감지하는 방법으로도 사용할 수 있습니다.)

이제 이 쓰레기를 이해하고 싶은데 이상하게도 추출할 수 있는 방법이 없습니다. gzip -l --verbose아카이브의 "압축된" 크기가 파일 크기(즉, 후행 데이터 포함)라고 말하는 것은 잘못되었으며 도움이 되지 않습니다. file아무것도 도움이 안 되는데 어떻게 해야 하나요?

답변1

이제 추적 데이터를 얻는 방법을 알아보세요.

나는 후행 데이터를 포함하는 파일을 생성하는 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

gzip 크기를 찾기 위해 작은 스크립트를 만들었습니다.

#!/bin/bash

set -e
gzip=${1:?Inform a gzip file}
size=$(stat -c%s "$gzip")
min=0
max=$size
while true; do
        if head -c "$size" "$gzip" | gzip -v -t - &>/dev/null; then
                echo $size
                break
        else
                case "$?" in
                        1) min=$size ;;
                        2) max=$size ;;
                esac
                size=$(((max-min)/2 + min))
        fi
done

그런 다음 이를 사용하여 gzip 및 후행 부분을 추출할 수 있습니다.

file=gzip_with_trailing.gz
gzip_size=$(./find_gzip_size "$file")
head -c "$gzip_size" "$file" > data.gz
tail -c +$((1+gzip_size)) "$file" > trailing.raw

head/tail은 가장 빠른 솔루션은 아니지만 작동합니다.

관련 정보