Bagaimana cara mengatur izin default untuk file yang dipindahkan atau disalin ke direktori?

9

Pertanyaan saya mirip dengan Cara mengatur izin file default pada SEMUA file yang baru dibuat di linux - tetapi berbeda dalam cara-cara penting:

Saya ingin semua file dibuat di (atau disalin ke atau dipindahkan ke) direktori tertentu untuk mewarisi serangkaian izin default yang berbeda dari standar sistem.

Dasar Pemikiran: Direktori yang dimaksud adalah "intake hopper" untuk suatu aplikasi. Pengguna dalam grup menempatkan file dalam direktori, dan aplikasi (berjalan di bawah id pengguna lain dalam grup yang sama) mengambil dan memprosesnya. Masalahnya adalah bahwa pemilik setiap file yang ditempatkan di direktori adalah pengguna yang menempatkannya di sana, dan izin default ke "rw-r - r--"; Saya ingin mengubahnya menjadi "rw-rw ----". Aplikasi yang melakukan asupan tidak dapat melakukannya secara eksplisit, karena id pengguna yang dijalankan oleh aplikasi tidak memiliki file yang dipermasalahkan, dan izin default tidak memungkinkan aplikasi untuk chmod pada file! Jelas, pengguna dapat melakukan chmod setelah meletakkan file di sana - tapi saya ingin menjaga "drop" oleh pengguna sesederhana mungkin. (Orang-orang ini tidak melek linux,

umask tampaknya terlalu kuat: Saya tidak ingin mengatur izin default untuk setiap file yang dibuat oleh pengguna ini - hanya yang dibuat di (atau ditempatkan di) direktori ini.

Mohon saran ... terima kasih!

rampok
sumber

Jawaban:

5

Anda dapat menggunakan ACL (daftar kontrol akses) untuk mengatur izin default untuk file dalam direktori.

Dari man 5 acl:

Jika ACL default dikaitkan dengan direktori, parameter mode ke fungsi yang membuat objek file dan ACL default direktori digunakan untuk menentukan ACL objek baru:

  1. Objek baru mewarisi ACL default dari direktori yang berisi sebagai ACL aksesnya.

  2. Entri akses ACL yang sesuai dengan bit izin file dimodifikasi sehingga tidak mengandung izin yang tidak terkandung dalam izin yang ditentukan oleh parameter mode.

Untuk mengaturnya (ubah perangkat, direktori, dll., Sesuai):

Edit /etc/fstabfile Anda dan tambahkan aclopsi mount.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Remount ( halaman manual Sambamount.cifs ) sistem file Anda dengan me-reboot atau menggunakan:

mount -o remount,acl /home

Pastikan Anda memiliki setfacldan getfaclutilitas.

Atur ACL default pada direktori (Anda mungkin juga perlu mengatur ACL pada file yang ada):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Lihat tutorial tertaut untuk informasi lebih lanjut.

Sumber: Tutorial Bagian 1 dan Bagian 2

Referensi: Daftar Kontrol Akses POSIX di Linux

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Saya tidak berpikir Anda harus menambahkan aclsebagai opsi dalam mountperintah ketika Anda menambahkannya /etc/fstab. Itu akan menjadi berlebihan dan ketika Anda menjalankan mountperintah dalam jawaban Anda, Anda akan mendapatkan output seperti ini: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(lihat acl,aclpada akhirnya). Harap perbaiki jika saya tidak salah.
its_me
1

Saya dapat menawarkan solusi: Buat direktori "drop" yang terpisah, jalankan minijob terpisah di sana yang memperbaiki izin dan kemudian memindahkan file ke direktori data aplikasi. Anda dapat menggunakan incron untuk itu sehingga hampir tidak ada penundaan waktu yang nyata.

Peter Eisentraut
sumber
1

Saya dapat memikirkan empat metode yang mungkin untuk melakukan ini:

  • umask, yang tidak ingin Anda gunakan
  • bungkus program, yang menetapkan umask aplikasi itu, bukan pengguna
  • cron, seperti yang dijelaskan oleh @Peter Eisentraut; find $HOME/intake -type f -exec chmod 660 {} \;, sistem yang berbeda memiliki peningkatan kinerja dalam hal ini (seperti -exec+opsi)
  • pengaturan berbasis direktori, yang memerlukan sedikit pemrograman shell untuk dilakukan, tetapi pada dasarnya shell, pada pengaturan prompt atau panggilan cd, akan mengubah umask jika ada file dot yang ada di direktori tersebut (atau mungkin direktori leluhur); untuk bash, PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"akan menjadi yang paling sederhana.
Arcege
sumber