Mengapa cp tidak menghormati ACL?

15

Cara umum untuk menyiapkan direktori untuk berbagi file di dalam grup, adalah:

$ mkdir foo
$ chgrp felles foo
$ chmod g+ws foo
$ setfacl -m group:felles:rwx foo
$ setfacl -dm group:felles:rwx foo

Ini memastikan bahwa semua file yang dibuat foodapat dibaca dan ditulis oleh grup felles:

$ umask
0022
$ echo hi > foo/bar
$ ls -l foo
total 4
-rw-rw-r--+ 1 bhm felles 3 2010-09-23 00:18 bar

Namun, jika Anda menyalin file ke dalam foo, ACL default tidak diterapkan:

$ echo you > baz
$ cp baz foo/
$ ls -l foo
total 8
-rw-rw-r--+ 1 bhm felles 3 2010-09-23 00:18 bar
-rw-r--r--+ 1 bhm felles 4 2010-09-23 00:19 baz
$ getfacl foo/baz
# file: foo/baz
# owner: bhm
# group: felles
user::rw-
group::rwx          #effective:r--
group:felles:rwx        #effective:r--
mask::r--
other::r--

Mengapa ini terjadi, dan apakah ada jalan lain?

( Memindahkan file ke direktori tidak menghormati ACL atau kepemilikan grup, tapi saya bisa mengerti alasannya: Anda mungkin tidak ingin izin file berubah hanya karena Anda mengubah namanya.)

bhm
sumber
serverfault.com/a/452678/46333 jawaban ini berisi penjelasan yang bagus.
Kaan

Jawaban:

11

Jika cpmembuat file tujuan, itu mereplikasi izin file sumber, kecuali untuk bit yang diatur dalam umask. Ini adalah perilaku standar (lihat misalnya langkah 3.b dalam spesifikasi Single Unix v3 (POSIX 2001) .

Mengapa cp dirancang dengan cara ini? Karena ada banyak kasus di mana perilaku ini diinginkan, misalnya menjaga privasi file ketika izin asli terbatas, dan menjaga executabilitas hampir selalu merupakan hal yang benar untuk dilakukan. Namun sangat disayangkan bahwa bahkan GNU cp tidak memiliki opsi untuk menonaktifkan perilaku ini.

Sebagian besar alat salin (misalnya pax, rsync) berperilaku dengan cara yang sama. Anda dapat memastikan file akan dibuat dengan izin default dengan memisahkan sumber dari tujuan, misalnya dengan cat <baz >foo/baz.

Gilles 'SO- berhenti menjadi jahat'
sumber
Ya, itu setidaknya menjelaskan motivasi untuk itu. (Aneh, meskipun, bahwa kepemilikan grup diizinkan untuk berubah menjadi "felles", memberikan kemungkinan lebih banyak orang membaca akses ke file.)
bhm
3

Ya, tiga tahun dan lebih banyak pertanyaan tetapi masih relevan. Untuk pembaca masa depan, saya ingin menambahkan bahwa diharapkan perintah mv, cp tidak mengikuti ACL direktori tujuan. Jawaban Gilles baik-baik saja kecuali kalimat terakhir. Cara yang lebih baik untuk menerapkan ACL tujuan ke file yang disalin / dipindahkan adalah cara yang disebutkan di sini:

http://www.commandlinefu.com/commands/view/4281/copy-acl-of-one-file-to-another-using-getfacl-and-setfacl

Jika tautan rusak di masa mendatang, saya menempelkan konten di sini:

getfacl <file-with-acl> | setfacl -f - <file-with-no-acl>

salin ACL dari satu file ke file lain menggunakan getfacl dan setfacl

PERINGATAN: ACL yang ada akan hilang.

biocyberman
sumber
1

Saya memiliki masalah serupa dengan file rsynced yang tidak memiliki ACL default yang tepat di subdirektori target. Cp tidak memiliki cara mengatur izin pada target. Tapi, rsync tidak, menggunakan --chmod=ugo=rwxflag. Lihat jawaban saya di sini .

Eric.chowanski
sumber
0

Anda perlu menggunakan -patau --preservedengan cp.

Dari man 5 acl:

PERUBAHAN UTILITAS FILE

 On a system that supports ACLs, the file utilities ls(1), cp(1), and
 mv(1) change their behavior in the following way:

 ·   For files that have a default ACL or an access ACL that contains more
     than the three required ACL entries, the ls(1) utility in the long
     form produced by ls -l displays a plus sign (+) after the permission
     string.

 ·   If the -p flag is specified, the cp(1) utility also preserves ACLs.
     If this is not possible, a warning is produced.

 ·     The mv(1) utility always preserves ACLs. If this is not possible, a
     warning is produced.

 The effect of the chmod(1) utility, and of the chmod(2) system call, on
 the access ACL is described in CORRESPONDENCE BETWEEN ACL ENTRIES AND
 FILE PERMISSION BITS.
Dijeda sampai pemberitahuan lebih lanjut.
sumber
1
Tidak persis. Dia ingin file tersebut memiliki izin yang sama dengan folder target.
luckytaxi
0

ACL menyebar dengan benar, tetapi topeng default tampaknya tidak benar. Anda mungkin ingin topeng default Anda menjadi rwX.

setfacl -dm m::rwX foo

Jika itu tidak berhasil, silakan kirim ACL untuk foo.

Ryan Bair
sumber
Itu tidak berhasil. ACL untuk foo (baik sebelum dan sesudah perintah Anda) adalah # file: foo # pemilik: bhm # grup: felles # flags: -s- user :: rwx group :: rwx grup: felles: rwx mask :: rwx other: : rx default: user :: rwx default: group :: rwx default: group: felles: rwx default: mask :: rwx default: other :: rx
bhm
-1

Apakah sistem file Anda terpasang dengan opsi "ACL" diaktifkan?

/dev/sda4        /wherefolderislocated         ext3        defaults,acl     1   2

Jika tidak, lakukan perubahan lalu kirim ulang.

mount -o remount /wherefolderislocated
luckytaxi
sumber
Itu sudah terpasang dengan opsi acl, ya.
bhm
-1

Dari apa yang saya lihat, Anda adalah pemilik file (bhm) sebelum dan sesudah cp. Seperti yang tercantum dalam daftar direktori, pemilik telah membaca dan menulis akses!

Niko
sumber
Mungkin saya tidak jelas: Saya ingin grup ("felles") dapat (membaca dan) menulis file.
bhm