Seperti yang ditunjukkan Gilles, setfacl
izin default menentukan izin maksimum, pada dasarnya menggantikan umask
. Jadi file yang baru dibuat akan menjadi rw
kecuali jika aplikasi yang membuat file meminta secara khusus agar dapat dieksekusi.
$ 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--
Perhatikan perms efektif di atas. (Hanya ada beberapa program yang akan meminta untuk mengatur bit eksekusi pada file yang dibuatnya, misalnya gcc
untuk yang dapat dieksekusi dan cp
jika file yang sedang disalin dapat dieksekusi.)
Atau apakah maksud Anda perintah setfacl pertama berfungsi seperti yang Anda inginkan, tetapi yang kedua tidak? Dengan kata lain, Anda ingin memperbaiki izin pada file lama, memastikan bahwa direktori dapat dilalui, tanpa memberikan izin eksekusi pada file biasa lainnya?
Versi setfacl
saya memungkinkan X
persis seperti yang Anda inginkan, misalnya:
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
Jika versi setfacl
Anda tidak mendukung itu, mengapa tidak menggunakan find
?
timpa izin, atur ke rw untuk file dan rwx untuk dir
$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)
setel izin ACL grup saya berdasarkan izin grup yang ada
$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)
Anda mungkin ingin memeriksa apakah topeng grup memberikan izin yang efektif. Jika tidak, Anda juga harus menjalankan ini:
$ find . -type d -exec chmod g+rwX '{}' ';'
Untuk pembaca selanjutnya, gunakan setfacl
pada file/folder yang ada tanpa menambahkan bit yang dapat dieksekusi ke file Anda, solusinya adalah bagian dari jawaban @Mikel ini:
Versi setfacl saya memungkinkan X persis seperti yang Anda inginkan, misalnya:
setfacl g:mygroup:rwX
Kutipan yang relevan dari setfacl
dokumentasi:
Kolom perms adalah kombinasi karakter yang menunjukkan izin:baca (r), tulis (w), jalankan (x), eksekusi hanya jika file adalah direktori atau sudah memiliki izin eksekusi untuk beberapa pengguna (X) .
Sejauh yang saya mengerti ACL Linux, setfacl -Rdm g:mygroup:rwx share_name
melakukan apa yang Anda inginkan. Eksperimen:
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
Kemudian sebagai pengguna yang berbeda di grup mygroup
:
$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec
Apa yang terjadi?
$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx #effective:rw-
mask::rw-
other::---
ACL efektif untuk mygroup
adalah hasil dan dari ACL_GROUP
entri untuk mygroup
(rwx
) dengan entri ACL_MASK (rw-
).
Halaman manual acl(5) menjelaskan perhitungan ini di bawah “Algoritme pemeriksaan akses”. Itu tidak menjelaskan bagaimana ACL_MASK
entri dibuat, tetapi dalam praktiknya hal yang benar tampaknya terjadi.