자동 추출 스크립트를 사용하고 있습니다. 이는 QNAP NAS에 소프트웨어 패키지를 설치하기 위한 스크립트입니다.
파일의 나머지 부분을 추출하는 일부 스크립트가 처음에 있습니다. 문제는 다음과 같습니다.
script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv
dd
이는 바이트 102에서 시작하는 바이트를 tar로 복사하고 거기에서 추출하는 데 사용됩니다 .
-xO
효과 는 무엇입니까 ? "두 번" 추출되는 이유는 무엇입니까(tar 두 번이라고 함 -x
)? 온라인에서 이 문제에 대한 많은 논의를 찾을 수 없습니다. 매뉴얼 페이지에서는 이 문제가 "드라이버"와 관련된 문제임을 나타내는 것 같습니다.(0과 Os를 혼동한 것 같습니다!)
그런 다음 스크립트는 다음을 수행합니다.
offset=$(/usr/bin/expr $script_len + 2042)
/bin/dd if="${0}" bs=$offset skip=1 | /bin/cat | /bin/dd bs=1024 count=7 of=$_EXTRACT_DIR/data.tar.gz
이는 파일로 더 이동하여 거기에 있는 바이트를 새로운 압축 TAR에 복사하는 것처럼 보입니다. 아마도 바이트는 이미 이러한 방식으로 구조화되고 인코딩되어 있을 것입니다.
하지만 첫 번째 명령에서 tar를 통해 이미 이 바이트를 읽지 않았습니까?dd
파일 읽기를 중지하라는 지시를 받을 방법이 없습니다 .
답변1
예를 들어 QNAP의 포장을 살펴보겠습니다.http://www.twonkyforum.com/downloads/8.3/TwonkyServerEU_8.3_arm-x41.qpkg
....
script_len=2467
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv -C $_EXTRACT_DIR script_len=2467
....
이제 데이터를 복사 dd
하고 그 안에 무엇이 있는지 살펴보겠습니다.
%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first
이는 내부에 tar.gz 파일이 포함된 원시 TAR 아카이브입니다.
%file first
first: POSIX tar archive (GNU)
%tar -tvf first
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz
다음 파이프라인 단계는 /bin/tar -xO
TAR입니다.수동그것은 말한다:
파일 시스템에 파일을 생성하는 대신 추출된 파일을 표준 출력에 쓰려면 --get', `-x')
--to-stdout' (
와 함께 -O')를 사용하십시오 .--extract' (
이 옵션은 파일을 추출하여 파이프를 통해 전송하고 파일 시스템에 보관할 필요가 없는 경우에 유용합니다. 여러 멤버를 추출하면표준 출력 연결에 나타납니다., 아카이브에 있는 순서대로.
archive 내부에는 파일이 하나만 있으므로 control.tar.gz
STDOUT으로 추출되어 다음 파이프라인 단계에서 처리됩니다. TAR을 다시 호출하여 내부 콘텐츠를 추출합니다.
따라서 기본적으로 "tar" 아카이브 안에 "tar.gz" 아카이브가 있으므로 tar
이를 추출하려면 두 개의 연속 명령이 필요합니다.
기본적으로 스트리밍 데이터에서 작동하도록 설계 되었으므로 tar
뒤에 더 많은 데이터가 있더라도 아카이브의 끝을 안정적으로 감지할 수 있습니다.
물리적으로 아카이브는 일련의 파일 항목으로 구성되며 두 개의 512 0바이트 블록으로 구성된 아카이브 끝 항목으로 끝납니다.
따라서 는 tar -xO
첫 번째 데이터 파일을 읽은 후 중지하고 나머지는 버릴 것입니다 qpkg
.