GNU tar를 사용하여 다른 --mode 값 지정

GNU tar를 사용하여 다른 --mode 값 지정

나는 GNU를 사용하여 tar네트워크 드라이브에 저장된 디렉토리에서 tarball을 만들려고 합니다. 이 네트워크 드라이브는 저장된 모든 콘텐츠에 대해 기본 모드 0700( )로 설정되어 -rwx------있으며 tarball이 생성될 때까지 변경할 수 없습니다.

다음 명령을 사용하여 tarball에 저장된 파일의 권한을 변경했습니다.

tar -c --mode=0644 -f project.tar ./project/

문제는 타르볼에 있는 모든 것에 대한 권한이 0644( -rw-r--r--)로 변경된다는 점입니다. 이 디렉토리에는 실행 파일 이 없으므로 ./project/모든0644문서그것은 중요하지 않습니다. 그러나목차결국 0644나는 그것을 물려받았다. 다른 시스템에서 추출하는 경우 실행 비트가 추가될 때까지 디렉터리에 들어갈 수 없습니다.

tarGNU에게 모든 모드를 변경하도록 지시하는 것이 가능합니까?문서0644모든 모드를 변경해 보세요목차도착하다 0755? 명령의 및 와 거의 같습니다 -type f.-type dfind

운영 체제는 Debian 11 Bullseye 버전이고 GNU tar버전은 1.34입니다.

답변1

그리고암소 비슷한 일종의 영양tar, 넌 할 수있어:

tar --mode a=r,u+w,a+X -cf file.tar directory

이렇게 하면 rwxr-xr-x디렉터리 유형 파일은 물론 rw-r--r--다른 모든 유형의 파일(심볼릭 링크 및 디렉터리 포함)도 제공됩니다. 이는 다음과 같이 구성됩니다.

  • a=r:권한 재설정r--r--r--
  • u+w: ser w에 추가되었으므로urw-r--r--
  • a+X: ll x에 추가되지만 a디렉토리 유형 파일에만 추가 rwxr-xr-x되므로 디렉토리 및 rw-r--r--기타 모든 유형의 파일에서 작동합니다.

완전한 유연성을 위해 다음을 사용할 수 있습니다.star:

star cf file.tar -find directory \
     -type d -chmod 755 \
  -o -type l -chmod 777 \
  -o         -chmod 644

rwxr-xr-x디렉토리 유형 파일 d, rwxrwxrwx기호 잉크 유형 파일 lrw-r--r--기타 유형의 파일은 어디서 얻을 수 있습니까 ?

또는 기호 형식을 사용하십시오.

star cf file.tar -find directory \
     -type d -chmod a=rx,u+w \
  -o -type l -chmod a=rwx \
  -o         -chmod a=r,u+w

답변2

친척을 사용할 수 있습니다chmod와 유사한 권한, 단지 고정된 패턴 이 아닙니다 --mode. 조사하다수동, 맨 페이지뿐만 아니라.

use를 사용하여 a+r모든 사람에게 읽기 권한을 부여할 수 있습니다.a+X어디에나 존재하는 경우 실행 권한을 부여합니다.

tar -c --mode=a+rX …

그러나 파일 시스템이 모든 파일을 실행 가능하게 만들면 아카이브의 모든 파일이 실행 가능해집니다. 나는 GNU tar를 사용하여 파일을 다르게 조정할 수 있는 방법이 없다고 생각합니다. (실제로,존재하지 않습니다: +X디렉터리를 읽을 수 있으면 디렉터리도 실행 가능하게 만들어서 a=r,u+w,a+X작동합니다 ..)

Pax에는 권한을 조정할 수 있는 방법이 전혀 없습니다.

가장 쉬운 방법은 사용하는 것 같아요파일 시스템 바인딩다양한 메타데이터를 사용하여 파일 시스템 보기를 만듭니다. 이것은퓨즈파일 시스템이므로 시스템에 FUSE 자체가 설치되어 있는 한 관리자 권한 없이 설치하고 사용할 수 있습니다. Bindfs는 GNU tar보다 더 뛰어난 유연성을 제공합니다 --mode. 또 다른 이점은 유사한 기능이 없는 프로그램과 함께 사용할 수 있다는 것입니다 tar --mode. 당신은 그것을 사용할 수 있습니다--perms옵션도착하다권한 변경:

mkdir -p views/project
bindfs --no-allow-other -p a+rD project views/project
tar -C views -cf project.tar project
fusermount -u views/project
rmdir views/project

파이썬에는tarfile모듈은 코드 작성을 비교적 편리하게 만듭니다. 반복 아카이브를 지원하므로 전체 아카이브를 한 번에 메모리에 저장할 필요가 없다고 생각합니다. 하지만 여전히 많은 코드를 작성해야 합니다.

답변3

를 사용하지 않으면 tar규칙에 따라 속성을 변경할 수 없는 문제를 해결할 수 있습니다 tar.

mksquashfs미니 언어가 있습니다행동내장되어 있으며 특정 필터링 규칙에 따라 항목을 보관하는 데 적용할 수 있습니다.여기. 간단합니다. 구문은 action@condition이므로 다음과 같습니다.

mksquashfs ./project/ project.squashfs -no-strip -action 'chmod(0755)@type(d)' -action 'chmod(644)@type(f)' 

모든 디렉토리 항목에는 0755 권한이 있고 모든 파일에는 0644권한이 있습니다. 폴더에 fifo, 소켓, 심볼릭 링크가 있을 수 있으므로 "디렉터리" 및 "파일" 대신 "디렉터리" 및 "디렉토리가 아닌 모든 것"이 더 나은 분류일 수 있습니다. 그런 다음 무료로 일부를 추가하세요. 아마도 더 빠른 압축이 가능할 것입니다. 네트워크보다:

mksquashfs ./project/ project.squashfs \
          -no-strip \
          -action 'chmod(0755)@type(d)' \
          -action 'chmod(644)@!type(d)' \
          -comp zstd -Xcompression-level 10

이 아카이브의 목적:

  1. unsquashfs project.squashfs이는 (아마도 선호하는 그래픽 아카이브 관리자)를 사용하여 추출할 수 있습니다.
  2. (Linux의 경우) 읽기 전용으로 마운트 가능(루트로)mount -o loop gr-ieee802-11.squash /home/marcus/mnt/
  3. (Linux의 경우) 최신 데스크톱 환경을 사용하는 사람은 누구나 읽기 전용으로 설치할 수 있습니다. ( udisksctl loop-setup -f project.squashfs자동으로 설치되지 않는 경우 udisksctl mount -b파일 관리자에 새로 표시된 드라이브를 클릭하세요.

관련 정보