나는 홈브류 아카이브를 가지고 있고 그 안에 무엇이 있는지 보고 싶습니다. 실제로 스크립트 부분을 실행하는 대신 어떤 파일이 추출될까요? 어떻게 해야 하나요?
실제로 아무것도 추출하지 않는 편이 낫겠지만, 그것이 유일한 방법이라면 (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 저장소
답변2
자체 제작 아카이브는 세 부분으로 구성됩니다.
- 쉘 스크립트.
- gzip으로 압축된 tar 아카이브.
- (선택 사항) 끝에 더 많은 데이터가 있습니다.
일반적으로 아카이브를 실행하면 포함된 아카이브를 임시 디렉터리로 추출한 다음 아카이브에서 추출된 특정 파일을 실행하는 셸 스크립트를 실행합니다. 스크립트에는 자체 크기와 tar 파일의 크기에 대한 정보가 포함되어 있어 중간에 포함된 tar 파일을 추출할 수 있습니다.
("마지막 추가 데이터"는 무엇이든 될 수 있습니다. 예를 들어 GoG 설치 프로그램의 경우 실제 게임 콘텐츠가 포함된 zip 파일이 포함되어 있습니다. 이러한 파일은 unzip
makeself를 완전히 우회하여 를 사용하여 추출할 수 있습니다. 이는 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로 추출됩니다.