예를 들어, 동료에게 특정 디렉토리에 대한 쓰기 권한을 부여하려고합니다. 하위 디렉토리에 액세스 권한 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