"tar extract"가 현재 디렉토리의 권한을 변경하는 것을 방지하는 방법은 무엇입니까?

"tar extract"가 현재 디렉토리의 권한을 변경하는 것을 방지하는 방법은 무엇입니까?

내 타르볼을 재현 가능하게 만들려고 할 때 나는 다음을 따랐습니다.이 가이드.

부작용으로 압축을 푼 후 변경되는 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'이것은 것이다아니요기호 링크 대상에 변환을 적용합니다.

관련 정보