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.)


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.


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.


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 .


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.

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.


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

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!


Mungkin saya tidak jelas: Saya ingin grup ("felles") dapat (membaca dan) menulis file.
bhm
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.