
bsdtar
libarchive
패키지 (적어도 Arch Linux에서는) 의 명령이 를 .zip
읽을 때 -archives에 있는 파일의 실행 가능 비트를 삭제 stdin
하지만 파일을 직접 처리할 때는 삭제하지 않는 것을 본 적이 있습니다 .
-archives 에서는 .tar
표준 입력에서 읽을 때 실행 가능한 비트도 보존합니다.
테스트 사례:
아카이브 생성:
파일을 생성합니다:
touch a.txt
chmod 644 a.txt
touch a.out
chmod 755 a.out
파일 권한:
ls -ln a.out a.txt
프로그램
-rwxr-xr-x 1 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 1 1001 1001 0 Dec 12 11:01 a.txt
파일을 아카이브로 압축합니다.
bsdtar --format=zip -cf a.zip a.out a.txt
bsdtar -cf a.tar a.out a.txt
zip
( tar
CREATE 아카이브 대신 AND를 사용하면 bsdtar
동일한 결과가 생성됩니다.)
아카이브 콘텐츠를 직접 추출/표시:
bsdtar -tvf a.zip
또는
bsdtar -tvf - < a.zip
프로그램
-rwxr-xr-x 0 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 0 1001 1001 0 Dec 12 11:01 a.txt
여기에 표시된 실행 가능 비트입니다 a.out
. 권한은 a.out
755와 a.txt
644입니다.
읽기 stdin
:
cat a.zip | bsdtar -tvf -
프로그램
-rw-rw-r-- 0 1001 1001 0 Dec 12 11:01 a.out
-rw-rw-r-- 0 1001 1001 0 Dec 12 11:01 a.txt
여기서 실행 가능한 비트는 a.out
삭제됩니다. 또한 두 파일 모두 그룹 쓰기가 가능하지만 그런 방식으로 패키지되지는 않습니다. a.out
및 의 권한은 a.txt
모두 664입니다.
.tar
-파일:
이에 비해 .tar
-archive의 경우 파이프에서 읽을 때 아카이브의 권한도 존중됩니다 stdin
.
bsdtar --numeric-owner -tvf a.tar
그리고
cat a.tar | bsdtar --numeric-owner -tvf -
모두 보이기
-rwxr-xr-x 0 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 0 1001 1001 0 Dec 12 11:01 a.txt
(ZIP 아카이브의 내용을 표시할 때 bsdtar
기본적으로 숫자 소유자가 표시됩니다. TAR 아카이브의 경우 소유자 이름이 표시됩니다.)
문제는 다음과 같습니다
무엇이 stdin
그렇게 특별한가요 bsdtar
? 왜 패션이 아닌 파이프에서 읽을 때만 읽을 수 있습니까 bsdtar -tvf - < a.zip
? .zip
-archive 가 특별하고 -archive 가 아닌 이유는 무엇입니까 .tar
?
답변1
Zip 아카이브에는 콘텐츠를 설명하는 두 가지 방법이 포함되어 있습니다.
- 각 항목의 헤더
- zip 파일 끝에 있는 중앙 디렉터리입니다.
libarchive(및 확장 bsdtar)는 입력에서 조회할 수 있는 경우 중앙 디렉터리를 사용하고, 그렇지 않으면 스트림 전용 논리로 대체됩니다. 테스트 사례에서 발견한 것처럼 이러한 항목은 반드시 일관성이 있는 것은 아닙니다. 이에 대해 우리가 할 수 있는 일이나 하고 싶은 일이 별로 없습니다. wget을 일반 고양이로 대체해도 여전히 동일한 동작이 표시됩니다.
간단히 말해서, 이는 zip 파일 스트림의 본질적인 문제이며 이를 해결할 수 있는 방법이 없습니다.
그리고이 댓글다음 명령을 사용하여 일관된 ZIP 파일을 만드는 방법을 설명합니다 bsdtar
.
bsdtar
생성 정보의 일관성을 유지하려면 zip 파일 생성 명령에 다음을 추가 --options zip:experimental
해야 합니다 .bsdtar
bsdtar --format=zip --options zip:experimental -cf a.zip a.out a.txt
그런 다음
cat a.zip | bsdtar -tvf -
올바른 권한 표시:
-rwxr-xr-x 0 1001 1001 0 Feb 17 21:18 a.out
-rw-r--r-- 0 1001 1001 0 Feb 17 21:18 a.txt
답변2
[아직 답변은 아니지만 댓글에 형식을 지정할 수 없기 때문에 이렇게 게시하겠습니다.]
zip
검색할 수 없는 파일에서 추출할 때 문제를 일으키는 유일한 형식은 아닙니다. 다음은 다중 세션 ISO 이미지의 예이지만 최소한 bsdtar
인쇄됩니다 .에러 메시지0이 아닌 상태로 종료됩니다. IMHO 파일에 대해서도 동일한 작업을 수행해야 하며 자동으로 권한을 조작하는 것은 허용되지 않습니다.
$ echo a.out > a.out
$ genisoimage -quiet -R -o a.iso a.out
$ chmod 755 a.out
$ growisofs -M a.iso -R -quiet a.out
Executing 'genisoimage -C 16,176 -M /dev/fd/3 -R -quiet a.out | builtin_dd of=a.iso obs=32k seek=11'
Rock Ridge signatures found
builtin_dd: 176*2KB out @ average infx1352KBps
a.iso: copying volume descriptor(s)
$ cat a.iso | bsdtar xf -
bsdtar: Ignoring out-of-order file @19 (a.out) 51200 < 411648
bsdtar: Error exit delayed from previous errors.
$ ls -l a.out; hd a.out
-rwxr-xr-x 1 ahq ahq 6 Dec 11 19:15 a.out
00000000 00 00 00 00 00 00 |......|
00000006
$ bsdtar xf a.iso
$ ls -l a.out; hd a.out
-rwxr-xr-x 1 ahq ahq 6 Dec 11 19:15 a.out
00000000 61 2e 6f 75 74 0a |a.out.|
00000006