web-dev-qa-db-ja.com

(ACLを有効にして)dirに再帰的にアクセス許可を設定するにはどうすればよいですか?

たとえば、特定のディレクトリへの書き込みアクセス権を同僚に与えたいと考えています。その中のサブディレクトリにアクセス権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 {} \;

このような単純なタスクでは、コード行がかなり多いようです。もっと良い方法はありますか?

26
Rogach

setfaclにはrecursiveオプションがあります(-Rchmodと同様:

  -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に同梱)

41
umläute

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に固有です。別のシェルを使用する場合は、一時ファイルを作成する必要がある場合があります。

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