たとえば、特定のディレクトリへの書き込みアクセス権を同僚に与えたいと考えています。その中のサブディレクトリにアクセス権775、ファイル664があり、dir-775にいくつかの実行可能ファイルがあったとしましょう。
次に、書き込み権限を追加します。 chmodを使用すると、次のようなことを試すことができます
chmod o+w -R mydir/
しかし、私はdirを誰でも書き込み可能にしたくないので、それはクールではありません-特定のユーザーだけにアクセス権を与えたいので、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 {} \;
このような単純なタスクでは、コード行がかなり多いようです。もっと良い方法はありますか?
setfacl
にはrecursiveオプションがあります(-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
for acl-2.2.52 for Debianに同梱)
Umläuteで述べたように、大文字の「X」を使用したコマンド_setfacl -R
_は、次のような方法です。
_setfacl -R -m u:colleague:rwX .
_
ただし、ACLを再帰的に再適用するが必要な場合(つまり、「サブディレクトリにアクセス許可を再適用する」など)。
_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に固有です。別のシェルを使用する場合は、一時ファイルを作成する必要がある場合があります。
for i in $(find /data -mindepth 0 -type d)
do setfacl -m u:zabbix:r-x $i
echo "ACL rules set for "$i
done