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?

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)


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.


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


@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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.