한 파일에서 다른 파일로 ZFS ACL을 복제하려면 어떻게 해야 합니까?

한 파일에서 다른 파일로 ZFS ACL을 복제하려면 어떻게 해야 합니까?

한 파일의 모든 ZFS ACL을 다른 파일로 복제하고 싶습니다.

POSIX ACL을 사용하면 의 출력 getfaclsetfacl.

ZFS에서 NFSv4 스타일 ACL을 사용하여 이를 수행하는 쉽고 빠른 방법이 있습니까? 의 출력을 읽은 ls -lV다음 이를 a의 일부로 입력 할 수 있다는 것을 알고 있지만 chmodACL을 복사하는 POSIX 방식과 동일한 기능을 찾을 수 없는 것 같습니다.

답변1

ls -lV사용 하는 대신 ls -lv스크립트에 입력하여 chmodACL을 복제하는 명령 시퀀스로 변환할 수 있습니다.

예를 들어 ACl이 다음과 같은 경우:

$ ls -lv file1
     0:owner@::deny
     1:owner@:read_data/write_data/append_data/write_xattr/execute
         /write_attributes/write_acl/write_owner:allow
     2:group@:read_data/write_data/append_data:deny
     3:group@:execute:allow
     4:everyone@:read_data/write_data/append_data/write_xattr
        /write_attributes/write_acl/write_owner:deny
     5:everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow

다음 명령 순서로 변환되어야 합니다 chmod.

chmod A0=owner@::deny file2
chmod A1=owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow file2
chmod A2=group@:read_data/write_data/append_data:deny file2
chmod A3=group@:execute:allow file2
chmod A4=everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:deny file2
chmod A5=everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow file2

최근에 위에서 설명한 것과 같은 스크립트가 유용했을 상황에 처했습니다. 따라서 필요한 chmod 명령 목록을 인쇄하기 위해 제가 만든 작은 Bash 스크립트(셸에서 소스로 가져와 함수로 실행할 수도 있음)가 있습니다. 한 파일에서 다른 파일로 ZFS ACL을 복사하려면 다음을 수행하십시오.

#!/bin/bash

acl_as_chmods () {
# ACL 항목을 '$1'에서 '$2'로 복사하는 chmod 명령 목록을 인쇄합니다.
 [[ -a "$1" ]] 2>/dev/null || {
   echo "유효한 참조 파일이 필요합니다." >&2
   1을 반환
 }
 ls -vd "$1" | {
   읽기 # 첫 번째 줄은 ACL 정보가 아닙니다. 우회로
   ACL_entry 읽기
     echo -n "chmod A=${ACL_entry#*:}"
   # '$2'로 지정된 대상 파일이 없으면 런타임에 'TARGET' 변수를 사용합니다.
   ACL_entry를 읽는 동안 || { 에코 " ${2-\$TARGET}"; 거짓; }
   하다
     [[ "$ACL_entry" == [0-9]*:* ]] && \
       echo -en " ${2-\$TARGET}\nchmod A${ACL_entry%%:*}+${ACL_entry#*:}" || \
       echo -n "$ACL_entry"
   완료
 }
}

## 쉘에 스크립트 또는 소스 함수로 실행하시겠습니까?
__acl_as_chmods () {
 [[ "${FUNCNAME[1]}" == "소스" ]] || acl_as_chmods "$@"
}

__acl_as_chmods "$@"

다음은 몇 가지 예제 사용법과 출력입니다.파일1위에서:

~$ ./acl_as_chmods.sh 파일1 파일2
chmod A=owner@::파일2 거부
chmod A1+owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow file2
chmod A2+group@:read_data/write_data/append_data:파일2 거부
chmod A3+group@:실행:파일 2 허용
chmod A4+everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:파일 거부 2
chmod A5+everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow file2

~$ 소스 acl_as_chmods.sh
~$ acl_as_chmods 파일1
chmod A=owner@::$TARGET 거부
chmod A1+owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:$TARGET 허용
chmod A2+group@:read_data/write_data/append_data:$TARGET 거부
chmod A3+group@:execute:$TARGET 허용
chmod A4+everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:$TARGET 거부
chmod A5+everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow $TARGET

원하는 경우 이 호스트에서 두 파일 모두에 액세스할 수 있고 다음 위치에서 ACL을 복사하려는 경우 이러한 chmod를 직접 평가할 수도 있습니다.파일1에게파일2즉시:

~$ ls -Vd 파일* #BEFORE
-rwx--x--x 사용자 1명 사용자 0 6월 19일 04:12 file1
            소유자@:---------------:------:거부
            owner@:rwxp---AW-Co-:------:허용
            그룹@:rw-p----------:------:거부
            그룹@:--x----------:------:허용
         모든 사람@:rw-p---AW-Co-:------:거부
         모든 사람@:--x---aRc--s:------:허용
---x------+ 사용자 1명 사용자 0 6월 19일 04:12 file2
            소유자@:--x------------:------:허용

~$ eval "$(acl_as_chmods 파일1 파일2)"

~$ ls -Vd 파일* #AFTER
-rwx--x--x 사용자 1명 사용자 0 6월 19일 04:12 file1
            소유자@:---------------:------:거부
            owner@:rwxp---AW-Co-:------:허용
            그룹@:rw-p----------:------:거부
            그룹@:--x----------:------:허용
         모든 사람@:rw-p---AW-Co-:------:거부
         모든 사람@:--x---aRc--s:------:허용
-rwx--x--x 사용자 1명 사용자 0 6월 19일 04:12 file2
            소유자@:---------------:------:거부
            owner@:rwxp---AW-Co-:------:허용
            그룹@:rw-p----------:------:거부
            그룹@:--x----------:------:허용
         모든 사람@:rw-p---AW-Co-:------:거부
         모든 사람@:--x---aRc--s:------:허용

답변2

나는 이와 같은 문제에 부딪쳤다. 내 코드는 다음과 같습니다.

https://gist.github.com/1021032

나에게 매력처럼 작동합니다. 다른 사람이 이 문제에 부딪히면 도움이 되기를 바랍니다.

답변3

무엇을 가져가는가남자 이름약간의 Perl을 제안하고 적용하면 다음과 같은 결과를 얻을 수 있습니다.

#!/usr/bin/perl
use warnings;
use strict;

my $state = 0;
if ($#ARGV < 1 || $#ARGV > 2) {
  print "\n\tUsage: $0 srcFile destFile\n";
}
my $acl=`ls -lv "${ARGV[0]}"`;
my @out="chmod", "arg", $ARGV[1];
foreach my $line ($acl) {
  chomp $line;
  if ($line =~ m/^\s+(\d+):(.*)$/) {
    if ($state > 0) {
      print join(" ",@out)."\n";
      #system(@out) or die "system @args failed: $?";
    }
    $state = 1;
    $out[1] = "A$1=$2";
  } else {
    $line =~ m/^\s+(.*)$/;
    $state = 2;
    $out[1] .= $1;
  }
}
if ($state > 0) {
  print join(" ",@out)."\n";
  #system(@out) or die "system @args failed: $?";
}

system(@out) 줄의 주석 처리를 해제하기 전에 시도해 보세요.

답변4

짜증나게도 이는 쉘 수준에서 제대로 노출되지 않는 것 같습니다. C에는 한 파일에서 ACL을 가져와 다른 파일에 적용하는 데 사용할 수 있는 함수가 있습니다(분명히 다른 옵션 중에서 acl_get(3SEC)) . acl_set(3SEC)또한 ACL을 POSIX 초안에서 NFSv4 유형으로 변환하는 데 유용합니다. 이것이 시스템 명령이 좋아 mv하고 cp사용하는 것입니다.

한때 이 기술을 사용하여 소스에서 대상 파일로 acl을 복사하는 명령을 작성했지만 현재는 소스 코드를 찾을 수 없습니다. 찾으면 이 답변에 추가하겠습니다.

관련 정보