[unix] ACL에서 ACL을 활성화 한 상태에서 권한을 재귀 적으로 설정하려면 어떻게합니까?

예를 들어, 동료에게 특정 디렉토리에 대한 쓰기 권한을 부여하려고합니다. 하위 디렉토리에 액세스 권한 775, 파일 664가 있고 dir-775에 일부 실행 파일이 있다고 가정하십시오.

이제 쓰기 권한을 추가하고 싶습니다. chmod를 사용하면 다음과 같은 것을 시도 할 수 있습니다.

chmod o+w -R mydir/

그러나 dir을 세계 쓰기 가능으로 만들고 싶지 않기 때문에 멋지지 않습니다. 특정 사용자에게만 액세스 권한을 부여하고 싶습니다. 그러나 이러한 권한을 설정하는 쉬운 방법이 있습니까? 내가 본 것처럼 적어도 세 가지 경우 (디렉토리, 파일, 실행 파일)를 별도로 처리해야합니다.

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

그런 간단한 작업을 위해 많은 코드 줄이 보입니다. 더 좋은 방법이 있습니까?



답변

setfacl다음 과 같이 재귀 옵션 ( -R)이 있습니다 chmod.

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

또한 capital-x X권한을 사용할 수 있습니다 . 이는 다음을 의미합니다.

  execute only if the file is a directory or already has
  execute permission for some user (X)

따라서 다음을 수행하면 효과가 있습니다.

setfacl -R -m u:colleague:rwX .

(모든 인용문은 데비안과 함께 제공되는 acl-2.2.52에man setfacl 대한 것입니다 )


답변

umläute에서 언급했듯이 setfacl -R대문자 “X”가있는 명령 은 다음과 같은 방법입니다.

setfacl -R -m u:colleague:rwX .

그러나 ACL을 철저 하게 다시 적용해야하는 경우 (예 : Windows의 “하위 디렉토리에 대한 권한 다시 적용”).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

이 명령은과 같은 오류를 피하기 위해 분할 될 수 있습니다 setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

구문 <( something )은 bash에만 적용되는 Process Substitution 입니다. 다른 쉘을 사용하는 경우 임시 파일을 작성해야 할 수도 있습니다.


답변

for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done


답변