ディレクトリとすべての親ディレクトリにfaclを設定するには?

ディレクトリとすべての親ディレクトリにfaclを設定するには?

次のディレクトリ構造があるとします。


a
  b1
    c1
    c2
  b2
    c3
    c4

setfaclを使用してユーザーにc1に直接アクセスする権限を与えたいと思います。次のようにできます。

setfacl -m u:frank:rX a/b1/c1

ただし、これはaとb1に自動的にアクセスできるわけではありません。

-R オプションは c1 の子 (存在する場合) に ACL を適用するため、この問題を解決します。

答え1

ACLを適用するディレクトリのリストを指定する必要があります。これは、再帰操作モードがあるかどうかに関係なく、ファイルメタデータ(たとえば、、、、などchownchmodを変更できるすべてのコマンドに対してchattr同じです。必要 すべてのパスコンポーネントがシンボリックリンクではないことを確認します。setfattrtouch

だから:

setfacl -m u:frank:rX a a/b1 a/b1/c1

または、cshに似た中括弧拡張をサポートするシェルで:

setfacl -m u:frank:rX a{,/b1{,/c1}}

シェルがある場合は、次zshの関数を定義できます。

upward() until [[ $argv[-1] = . ]] { "$@"; argv[-1]=$argv[-1]:h; }

それから:

$ upward echo setfacl -m u:frank:rX a/b1/c1
setfacl -m u:frank:rX a/b1/c1
setfacl -m u:frank:rX a/b1
setfacl -m u:frank:rX a

echo実際の実行を削除してくださいsetfacl)。

または、次のいずれかを定義できます。

ancestry() until [[ $REPLY = . ]] { reply+=($REPLY); REPLY=$REPLY:h; }

glob修飾子として使用される関数:

$ echo setfacl -m u:frank:rX a/b1/c1(+ancestry)
setfacl -m u:frank:rX a a/b1 a/b1/c1

またはdepthoシーケンスの場合:

$ echo setfacl -m u:frank:rX a/b1/c1(od+ancestry)
setfacl -m u:frank:rX a/b1/c1 a/b1 a

いずれにせよ、ペアに検索アクセスを許可すると、ディレクトリアクセスが制限されていfrankない場合(上記のアクセスは制限されているため)、そのペアのアクセスを開くことができることaに注意してください。a/b2

関連情報