GNU/Linux >> Linux の 問題 >  >> Linux

ディレクトリとファイルに異なる ACL を設定する

ジルが指摘するように、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 を説明していません エントリが生成されますが、実際には正しいことが起こっているようです.


Linux
  1. Linuxでファイルとディレクトリを隠す簡単な方法

  2. プロのようにLinuxでファイルとディレクトリを探す

  3. Linuxでファイルとディレクトリをアーカイブする方法[パート2]

  1. Linuxでファイルとディレクトリをコピーする方法

  2. Linuxで最大のファイルとディレクトリを探す

  3. Linux ファイルとディレクトリの削除

  1. Linuxでのコマンドの検索(ファイルとディレクトリの検索)

  2. Linuxでファイルとディレクトリの名前を変更する方法

  3. LinuxでのLsコマンド(ファイルとディレクトリのリスト)