한 파일의 모든 ZFS ACL을 다른 파일로 복제하고 싶습니다.
POSIX ACL을 사용하면 의 출력 getfacl
을 setfacl
.
ZFS에서 NFSv4 스타일 ACL을 사용하여 이를 수행하는 쉽고 빠른 방법이 있습니까? 의 출력을 읽은 ls -lV
다음 이를 a의 일부로 입력 할 수 있다는 것을 알고 있지만 chmod
ACL을 복사하는 POSIX 방식과 동일한 기능을 찾을 수 없는 것 같습니다.
답변1
ls -lV
사용 하는 대신 ls -lv
스크립트에 입력하여 chmod
ACL을 복제하는 명령 시퀀스로 변환할 수 있습니다.
예를 들어 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을 복사하는 명령을 작성했지만 현재는 소스 코드를 찾을 수 없습니다. 찾으면 이 답변에 추가하겠습니다.