makeself를 실행하지 않고 어떻게 아카이브의 내용을 나열할 수 있나요?

makeself를 실행하지 않고 어떻게 아카이브의 내용을 나열할 수 있나요?

나는 홈브류 아카이브를 가지고 있고 그 안에 무엇이 있는지 보고 싶습니다. 실제로 스크립트 부분을 실행하는 대신 어떤 파일이 추출될까요? 어떻게 해야 하나요?

실제로 아무것도 추출하지 않는 편이 낫겠지만, 그것이 유일한 방법이라면 (ba)sh 코드가 실제로 실행되지 않는 한 기꺼이 그렇게 할 것입니다.

답변1

생성된 아카이브에는 --list해당 내용을 나열하는 데 사용할 수 있는 옵션이 있습니다.

참고로 저는 Debian의 이 버전에 대해 이야기하고 있습니다.

ii  makeself       2.2.0-1      all          utility to generate self-extractables

스크립트에서 다음 블록을 생성합니다.

MS_Help()
{   
    cat << EOH >&2 
Makeself version 2.2.0 
 1) Getting help or info about $0 : 
  $0 --help   Print this message 
  $0 --info   Print embedded info : title, default target directory, embedded script ... 
  $0 --lsm    Print embedded lsm entry (or no LSM) 
  $0 --list   Print the list of files in the archive 
  $0 --check  Checks integrity of the archive 

 2) Running $0 : 
  $0 [options] [--] [additional arguments to embedded script] 
  with following options (in that order) 
  --confirm             Ask before running embedded script 
  --quiet               Do not print anything except error messages 
  --noexec              Do not run embedded script 
  --keep                Do not erase target directory after running 
                        the embedded script 
  --noprogress          Do not show the progress during the decompression 
  --nox11               Do not spawn an xterm 
  --nochown             Do not give the extracted files to the current user 
  --target dir          Extract directly to a target directory 
                        directory path can be either absolute or relative 
  --tar arg1 [arg2 ...] Access the contents of the archive through the tar command 
  --                    Following arguments will be passed to the embedded script 
EOH
}

매뉴얼 페이지에는 약간의 작업이 필요하지만 스크립트는 읽기 쉽습니다.Git 저장소

추가 자료:makeself - Unix에서 자동 추출 아카이브 만들기

답변2

자체 제작 아카이브는 세 부분으로 구성됩니다.

  1. 쉘 스크립트.
  2. gzip으로 압축된 tar 아카이브.
  3. (선택 사항) 끝에 더 많은 데이터가 있습니다.

일반적으로 아카이브를 실행하면 포함된 아카이브를 임시 디렉터리로 추출한 다음 아카이브에서 추출된 특정 파일을 실행하는 셸 스크립트를 실행합니다. 스크립트에는 자체 크기와 tar 파일의 크기에 대한 정보가 포함되어 있어 중간에 포함된 tar 파일을 추출할 수 있습니다.

("마지막 추가 데이터"는 무엇이든 될 수 있습니다. 예를 들어 GoG 설치 프로그램의 경우 실제 게임 콘텐츠가 포함된 zip 파일이 포함되어 있습니다. 이러한 파일은 unzipmakeself를 완전히 우회하여 를 사용하여 추출할 수 있습니다. 이는 zip 파일이 상대 오프셋을 사용하기 때문에 작동합니다. 파일 끝까지).

Linux에서 파일을 열면 less, 알아야 할 모든 것을 알려주는 스크립트의 내용을 볼 수 있습니다. 상단 근처에 다음과 유사한 줄이 있어야 합니다.

filesizes="12345"

이는 포함된 tar 파일의 길이가 12345바이트임을 알려줍니다. (이론적으로 filesizes여러 파일의 크기를 나열하는 것이 가능하지만 실제로는 아카이브에 두 개 이상의 파일이 포함되는 경우는 거의 없는 것 같습니다.)

그런 다음 검색하면 head다음과 같은 줄을 찾아야 합니다.

offset=`head -n 519 "$1" | wc -c | tr -d " "`

이는 스크립트가 자체 크기를 계산하는 데 사용하는 논리입니다. 보시다시피 스크립트는 길이가 519줄이라는 것을 알고 있습니다.

이제 스크립트의 크기(라인)와 포함된 tar 아카이브의 크기(바이트)를 알았으므로 다음과 같이 포함된 아카이브의 내용을 나열할 수 있습니다.

tail +520 ~/Downloads/gog_huniepop_2.0.0.3.sh | head -c 12345 | tar tz

tail +N라인부터 시작하는 파일 내용이 나열됩니다 N. 우리는 단지 시작하고 싶기 때문에 519보다 1 더 많은 520을 사용합니다.뒤쪽에스크립트의 끝(마지막 줄 제외)

몇 가지 참고사항:

  • 파일을 나열하는 대신 파일을 추출하려면 를 사용하세요 tar xz. tar tz빈 디렉터리에서 이 작업을 수행할 수 있습니다.
  • BSD에서 tar는 기본적으로 stdin 대신 테이프 장치에서 읽습니다. tar tzf -이 경우에 사용됩니다.

답변3

내 경우에는 간단하다.

makeself_archive.sh --tar xf

그러면 아카이브 내용이 PWD로 추출됩니다.

관련 정보