たとえば、同僚に特定のディレクトリへの書き込み権限を付与したいとします。サブディレクトリのアクセス権が775、ファイルが664、775ディレクトリにいくつかの実行可能ファイルがあるとします。
今、書き込み権限を追加したいと思います。 chmodを使用すると、次のことを試すことができます。
chmod o+w -R mydir/
しかし、ディレクトリを誰でも書くことができるようにしたくないので、これはうまくいきません。特定のユーザーにアクセス権を付与したいので、ACLを使用したいと思います。しかし、これらの権限を設定する簡単な方法はありますか?私が見るには、少なくとも3つのケース(ディレクトリ、ファイル、実行可能ファイル)を別々に処理する必要があるようです。
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.52Debian に付属)
答え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