setfacl: Apakah kedua perintah ini sama?

10

Saya memiliki skrip penerapan (berdasarkan capifony) yang menetapkan izin pada server tertentu untuk instalasi Symfony2. Ini berisi dua perintah berikut untuk melakukan ini untuk beberapa direktori:

setfacl -R -m u:www-data:rwx -m u:`whoami`:rwX app/cache
setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwX app/cache

Kedua perintah ini ada di situs Symfony2 sebagai cara untuk memperbaiki izin, namun, ini tampak sangat mirip dengan saya. Jadi saya melihat pada halaman manual setfacl, dan dari apa yang saya bisa mengerti, perintah kedua melakukan persis apa yang pertama lakukan dengan opsi tambahan (yang saya tidak mengerti). Pertanyaan saya adalah, apakah asumsi saya benar? Jika demikian, apakah akan memiliki efek yang sama jika saya menghapus perintah pertama?

Hosh Sadiq
sumber

Jawaban:

15

Perintah pertama akan mengubah izin file / direktori yang sudah ada sebelumnya. Perintah -ddi kedua sangat penting untuk mengatur izin default untuk direktori apa pun, yang pada gilirannya akan memberikan set ACL default untuk semua file dalam direktori ini.

CATATAN: Dalam kedua hal tersebut perintah akan dijalankan secara rekursif melalui -Rsakelar.

Mengenai -dsakelar, dari setfaclhalaman manual:

   -d, --default
       All operations apply to the Default ACL. Regular ACL entries in the 
       input set are promoted to Default ACL entries. Default ACL  entries
       in the input set are discarded. (A warning is issued if that happens).

Kutipan ini juga menjelaskannya dengan cukup baik:

Ada dua jenis ACL: mengakses ACL dan ACL standar. ACL akses adalah daftar kontrol akses untuk file atau direktori tertentu. ACL default hanya dapat dikaitkan dengan direktori; jika file dalam direktori tidak memiliki akses ACL, ia menggunakan aturan ACL default untuk direktori. ACL standar adalah opsional.

Sumber: 8.2. Pengaturan Akses ACL .

Contoh

Katakanlah saya memiliki struktur direktori ini.

$ tree
.
|-- dir1
|   |-- dirA
|   |   `-- file1
|   `-- fileA
`-- file1

2 directories, 3 files

Sekarang mari kita mengatur izin menggunakan setfaclperintah pertama dalam pertanyaan Anda:

$ setfacl -R -m u:saml:rwx -m u:samtest:rwX .

Yang menghasilkan sebagai berikut:

$ getfacl dir1/ file1
# file: dir1
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

Tanpa -dRperintah yang dijalankan di sini, direktori baru tidak akan tercakup oleh ACL Anda:

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
group::rwx
other::r-x

Tetapi jika kita menghapus direktori ini dan menjalankan setfacl -dR ...perintah dan ulangi operasi ini di atas:

$ rmdir dir2
$ setfacl -dR -m u:saml:rwx -m u:samtest:rwX .

Sekarang izin terlihat sangat berbeda:

$ getfacl dir1/ file1 
# file: dir1/
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

Dan sekarang direktori kami yang baru dibuat akan mengambil izin "default" ini:

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

Memiliki izin ini pada tempatnya dir2sekarang akan menegakkan izin ini pada file di dalam dir2juga:

$ touch dir2/fileA
$ getfacl dir2/fileA 
# file: dir2/fileA
# owner: saml
# group: saml
user::rw-
user:saml:rwx           #effective:rw-
user:samtest:rwx        #effective:rw-
group::rwx          #effective:rw-
mask::rw-
other::r--
slm
sumber
Ah, jadi hanya untuk mengonfirmasi, maksud Anda jika kita memiliki direktori app/cacheyang berisi direktori bernama dev, perintah pertama akan diterapkan untuk itu, tetapi bukan yang kedua? Dan jika nanti direktori lain ditambahkan (misalnya prod), perintah kedua akan mengatur izin? Jika ini bukan kasusnya, saya harus bisa melewati perintah kedua?
Hosh Sadiq
1
@HoshSadiq - tidak ada -Rperintah rekursif, jadi izin berlaku. Para -dpenjaga jika seseorang membuat direktori atau memindahkan beberapa direktori ke pohon nanti sehingga ACL ini akan diterapkan.
slm
Itu keren! Menjadikan segalanya lebih jelas :) Terima kasih!
Hosh Sadiq