Bagaimana cara mengatur izin secara rekursif pada dir (dengan ACL diaktifkan)?

24

Misalnya, saya ingin memberi kolega saya akses tulis ke direktori tertentu. Mari kita asumsikan bahwa subdirektori di dalamnya memiliki hak akses 775, file 664, dan juga ada beberapa file yang dapat dieksekusi di dir - 775.

Sekarang saya ingin menambahkan izin menulis. Dengan chmod, saya bisa mencoba sesuatu seperti

chmod o+w -R mydir/

Tapi itu tidak keren, karena saya tidak ingin membuat dir world-writable - Saya ingin memberikan akses hanya kepada pengguna tertentu, jadi saya ingin menggunakan ACL. Tetapi apakah ada cara mudah untuk mengatur izin itu? Seperti yang saya lihat, saya perlu menangani setidaknya tiga kasus (dir, file, file yang dapat dieksekusi) secara terpisah:

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

Tampaknya cukup banyak baris kode untuk tugas yang begitu sederhana. Apakah ada cara yang lebih baik?

Rogach
sumber

Jawaban:

40

setfaclmemiliki opsi rekursif ( -R) seperti chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

itu juga memungkinkan untuk penggunaan Xizin modal-x , yang berarti:

  execute only if the file is a directory or already has
  execute permission for some user (X)

jadi melakukan yang berikut ini akan berhasil:

setfacl -R -m u:colleague:rwX .

(semua kutipan berasal dari man setfacluntuk acl-2.2.52 sebagaimana dikirimkan bersama Debian)

umläute
sumber
4
setfacl tidak memiliki bendera '-R' di FreeBSD 9
Aaron C. de Bruyn
6
maka ada baiknya jika OP menandai pertanyaan mereka sebagai [linux]
umläute
Melewatkan itu. ;)
Aaron C. de Bruyn
Apakah ini secara otomatis berlaku untuk file / folder baru yang dibuat di dalam setelah itu?
Enigma
Periksa halaman manual untuk versi setfacl Anda. Opsi -Xtidak berfungsi seperti yang diharapkan pada termasuk dalam setfacl 2.2.49.
phyatt
5

Seperti yang disebutkan oleh umläute, perintah setfacl -Rdengan huruf besar "X" adalah cara yang harus dilakukan, seperti:

setfacl -R -m u:colleague:rwX .

Namun, bagi mereka yang perlu menerapkan kembali ACL secara rekursif (mis. Seperti "mendaftar ulang izin pada sub-direktori" à la Windows).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

Perintah itu dapat dipisahkan untuk menghindari kesalahan seperti setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

Perhatikan bahwa sintaksnya <( something )adalah Proses Substitusi , yang khusus untuk bash. Anda mungkin perlu membuat file sementara jika Anda menggunakan shell lain.

Franklin Piat
sumber
0
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done
shgurbanov
sumber
@muru Karena penasaran, mengapa tidak?
Shadur
Seluruh komentar adalah tautan. Ikuti itu dan cari tahu.
muru
Jika Anda ingin menggunakan pendekatan inifind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz
1
Jangan gunakan itu. $(find /data -mindepth 0 -type d)tidak akan mengembalikan hasil baris demi baris, itu akan melindungi seluruh hasil. Jika ada spasi dalam satu baris, Anda akan mendapatkan catatan yang salah dalam $ivariabel.
Gnought