내 타르볼을 재현 가능하게 만들려고 할 때 나는 다음을 따랐습니다.이 가이드.
부작용으로 압축을 푼 후 변경되는 tar 파일을 쉽게 만들 수 있다는 것을 알았습니다.현재 작업 디렉토리(파일을 추출한 위치).
이와 같이:
$ rm -rf /tmp/user
$ mkdir -p /tmp/user/test
$ touch /tmp/user/test/README.txt
$ ls -lhan /tmp/user/ /tmp/user/test/README.txt
-rw-r--r-- 1 11002 11002 0 Sep 15 10:31 /tmp/user/test/README.txt
/tmp/user/:
total 32K
drwxr-xr-x 3 11002 11002 4.0K Sep 15 10:31 .
drwxrwxrwt 23 0 0 20K Sep 15 10:31 ..
drwxr-xr-x 2 11002 11002 4.0K Sep 15 10:31 test
$ cd /tmp/user/test
$ tar --numeric-owner --owner=0 --group=0 --mode="go-rwx,u-w" --transform 's|\./|foobar/|' \
-czf ../foobar.tgz .
$ tar tvf ../foobar.tgz
dr-x------ 0/0 0 2021-09-15 10:25 ./
-r-------- 0/0 0 2021-09-15 10:25 foobar/README.txt
$ cd /tmp/user/
$ tar xvf foobar.tgz
$ ls -lhan
total 40K
dr-x------ 4 11002 11002 4.0K Sep 15 10:31 .
drwxrwxrwt 23 0 0 20K Sep 15 10:31 ..
drwxr-xr-x 2 11002 11002 4.0K Sep 15 10:33 foobar
-rw-r--r-- 1 11002 11002 143 Sep 15 10:32 foobar.tgz
drwxr-xr-x 2 11002 11002 4.0K Sep 15 10:31 test
$ rm foobar.tgz
rm: cannot remove 'foobar.tgz': Permission denied
$
그래서 일어나는 일은 다음과 같습니다:
- tar 파일에는
./
권한0500
(일명r-x------
. - tar 파일을 추출하면
./
디렉토리(현재 디렉토리)도 추출되고 해당 권한이 아카이브에 있는 권한으로 설정됩니다. - 작업 후 사용자는 더 이상 디렉터리에서 파일을 삭제할 수 없으며 다른 사용자는 더 이상 해당 디렉터리에서 어떤 작업도 수행할 수 없습니다.
이것은 큰 놀라움이었습니다. 사용자가 시스템을 "사용할 수 없게" 만들 수 있습니다(예: chmod a-rwx
사용자의 홈 디렉터리에서 효과적으로 실행).
물론 권한을 복원하는 것은 쉽습니다. chmod
이전에 들어본 적이 있다면(일반적인 Ubuntu 사용자는 들어본 적이 없을 것입니다)그리고이전의 권한을 기억하십니까(나 자신과 내가 타르볼을 추출할 임의의 디렉토리에 대해서는 이것을 말할 수 없습니다)
그래서 내 질문은 두 가지입니다.
tar --extract
현재 작업 디렉토리의 권한을 유지하면서 변경되는 것을 방지하려면 어떻게 해야 합니까?다른아카이브에 문서가 있나요?tar --create
알려진 경로 구성 요소를 미리 계산하면서 이러한 아카이브가 실제로 생성되는 것을 방지하려면(첫 번째 질문에 대한 답을 모르는 사람들에게도 작동하도록) 어떻게 해야 합니까 ?
편집하다
두 번째 질문에 대한 답변의 일부를 찾았을 수도 있습니다.
경로 수정을 --transform 's|^\.|foobar|'
will 로 변경반품그러면 mangle의 ./
항목은 foobar/
아카이브에 선언된 권한을 얻게 됩니다(그리고 현재 작업 디렉토리를 유지합니다). --transform 's|\./|foobar/|'
이유를 알고 싶어요아니요mangle ( 정규식과 꽤 잘 일치하는 ./
것 같습니다 .\./
답변1
내가 아는 한, .
타르볼을 추출할 때 메타데이터 변경을 방지하는 유일한 방법은 다음을 사용하여 기존 파일을 건너뛰는 것입니다.--skip-old-files
옵션GNU에서 사용 가능합니다 tar
. 여기에는 위의 내용이 포함되며 .
결과는 다음과 같습니다.어느기존 파일은 tarball의 버전으로 덮어쓰지 않고 있는 그대로 유지됩니다.
왜 실패했는지 잘 모르겠습니다 --transform
.추출 시 경로를 추가하는 권장 방법시작 앵커 포인트를 원하는 디렉토리로 "대체"하는 것입니다.예를 들어 tar --transform 's,^,foobar/,' ...
. 심볼릭 링크를 엉망으로 만들지 않으려면 접미사를 추가할 수 있습니다.예를 들어 tar --transform 's,^,foobar/,S'
이것은 것이다아니요기호 링크 대상에 변환을 적용합니다.