すべてのディレクトリがすべてのディレクトリをrwx
できるように、また新しく作成されたすべてのファイルがrw
になるように、ファイル共有のデフォルトのアクセス許可を設定したいと思います。
この共有にアクセスしている全員が同じグループに属しているため、これは問題ではありません。
ユーザーのumaskなどをすべて変更せずに、ACLを使用してこれを行うことを検討しました。これが私の現在の呼び出しです:
setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name
私の問題は、新しく作成されたすべてのサブディレクトリをrwx
にしたいが、新しく作成されたfilesだけをrw
。
誰かが私の望ましい最終結果を達成するためのより良い方法を持っていますか? chmod +x
とchmod +X
のように、ファイルとは別にディレクトリにACLを設定する方法はありますか?
ありがとう
Gillesが指摘するように、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
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は、mygroup
(rwx
)のACL_GROUP
エントリとACL_MASKエントリ(rw-
)のAND処理の結果です。 。
acl(5)のマニュアルページ は、「アクセスチェックアルゴリズム」での計算について説明しています。 ACL_MASK
エントリの生成方法については説明していませんが、実際には正しいことが発生しているようです。