ジルが指摘するように、setfacl
デフォルトのパーミッションは最大のパーミッションを指定し、基本的に umask
を置き換えます .したがって、新しく作成されたファイルは rw
になります ファイルを作成したアプリケーションが実行可能にすることを特別に要求した場合を除きます。
$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--
$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x #effective:r--
group:mygroup:rwx #effective:rw-
mask::rw-
other::r--
上記の有効なパーマに注意してください。 (作成するファイルに実行ビットを設定するよう要求するプログラムはごくわずかです。たとえば、gcc
などです。 実行可能ファイルおよび cp
用 コピーされるファイルが実行可能ファイルであった場合)
それとも、最初の setfacl コマンドは意図したとおりに機能したが、2 番目のコマンドはそうではなかったということですか?つまり、他の通常のファイルに実行権限を与えずに、ディレクトリがトラバース可能であることを確認して、古いファイルの権限を修正しようとしていますか?
setfacl
の私のバージョン X
を許可 例:
setfacl g:mygroup:rwX
$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513 4 drwxr-xr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-r--r-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxr-xr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513 4 drwxrwxr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-rwxr-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxrwxr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513 4 drwxrwxr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-rw-r-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxrwxr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
setfacl
のバージョンの場合 find
を使用しないのはなぜですか ?
パーミッションを上書きし、ファイルの場合は rw に、ディレクトリの場合は rwx に設定します
$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)
既存のグループ権限に基づいて mygroup ACL 権限を設定する
$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)
グループ マスクが有効なアクセス許可を提供することを確認することをお勧めします。そうでない場合は、これも実行する必要があります:
$ find . -type d -exec chmod g+rwX '{}' ';'
将来の読者のために setfacl
を使用するには ファイルに実行可能ビットを追加せずに既存のファイル/フォルダーで、解決策は@Mikelの回答のこの部分です:
私のバージョンの setfacl では、X を希望どおりに使用できます。例:
setfacl g:mygroup:rwX
setfacl
からの関連する抜粋 ドキュメント:
perms フィールドは、パーミッションを示す文字の組み合わせです:読み取り (r)、書き込み (w)、実行 (x)、ファイルがディレクトリの場合のみ実行、または既に一部のユーザーの実行パーミッションを持っている場合のみ実行 (X) .
Linux ACL を理解する限り、setfacl -Rdm g:mygroup:rwx share_name
あなたが望むことを正確に行います。実験:
umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec
次に、グループ mygroup
の別のユーザーとして :
$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec
何が起きているの?
$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx #effective:rw-
mask::rw-
other::---
mygroup
の有効な ACL ACL_GROUP
を and'ing した結果です mygroup
のエントリ (rwx
) ACL_MASK エントリ (rw-
).
acl(5) のマニュアル ページでは、「アクセス チェック アルゴリズム」でこの計算について説明しています。どのように ACL_MASK
を説明していません エントリが生成されますが、実際には正しいことが起こっているようです.