예를 들어, 동료에게 특정 디렉토리에 대한 쓰기 권한을 부여하고 싶습니다. 하위 디렉터리의 액세스 권한이 775이고 파일이 664이며 775 디렉터리에 일부 실행 파일이 있다고 가정합니다.
이제 쓰기 권한을 추가하고 싶습니다. chmod를 사용하면 다음과 같은 것을 시도해 볼 수 있습니다.
chmod o+w -R mydir/
하지만 디렉토리를 누구나 쓸 수 있도록 만들고 싶지 않기 때문에 이는 좋지 않습니다. 단지 특정 사용자에게 액세스 권한을 부여하고 싶기 때문에 ACL을 사용하고 싶습니다. 하지만 이러한 권한을 설정하는 쉬운 방법이 있습니까? 제가 보기에는 최소한 세 가지 경우(디렉터리, 파일, 실행 파일)를 별도로 처리해야 할 것 같습니다.
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 {} \;
이렇게 간단한 작업을 수행하려면 많은 코드 줄이 필요해 보입니다. 더 좋은 방법이 있나요?
답변1
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 .
(모든 인용문 man setfacl
은acl-2.2.52데비안과 함께 제공됨)
답변2
umläute가 언급했듯이 대문자 "X"가 포함된 명령이 setfacl -R
올바른 접근 방식입니다. 예를 들면 다음과 같습니다.
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에만 해당됩니다. 다른 셸을 사용하는 경우 임시 파일을 만들어야 할 수도 있습니다.
답변3
디렉토리만 읽는 재귀적 권한을 부여하려면 항상 r-x
.
주어진 CMD를 사용하십시오:setfacl -Rm u:user_name:permission /location/abc/xyz
예시 및 설명: setfacl -Rm u:admin12:r-x /appl/work/load/
Here `setfacl` : used to set permission.
-Rm : R for recursive and m for modify those old permission on given path.
u : User which u want to add with given permission.
admin12 : its an user , same user wants permission for a given location.
/appl/work/load : Set a location where you want to give permission.
답변4
for i in $(find /data -mindepth 0 -type d)
do setfacl -m u:zabbix:r-x $i
echo "ACL rules set for "$i
done