Typowym sposobem konfigurowania katalogu do udostępniania plików w grupie jest:
$ mkdir foo
$ chgrp felles foo
$ chmod g+ws foo
$ setfacl -m group:felles:rwx foo
$ setfacl -dm group:felles:rwx foo
Zapewnia to, że wszystkie utworzone pliki foo
są odczytywalne i zapisywane przez 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
Jeśli jednak skopiujesz plik foo
, domyślne listy ACL nie zostaną zastosowane:
$ 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--
Dlaczego tak się dzieje i czy można to obejść?
( Przeniesienie pliku do katalogu nie uwzględnia ani list ACL, ani własności grupy, ale rozumiem dlaczego: możesz nie chcieć, aby uprawnienia do pliku były zmieniane tylko dlatego, że zmieniasz jego nazwę).
Odpowiedzi:
Jeśli
cp
tworzy plik docelowy, replikuje uprawnienia do pliku źródłowego, z wyjątkiem bitów ustawionych w umask. Jest to standardowe zachowanie (patrz np. Krok 3.b w specyfikacji Single Unix v3 (POSIX 2001)) .Dlaczego CP zaprojektowano w ten sposób? Ponieważ istnieje wiele przypadków, w których takie zachowanie jest pożądane, na przykład zachowanie prywatności pliku, gdy oryginalne uprawnienia są restrykcyjne, a zachowanie wykonalności jest prawie zawsze właściwe. Szkoda jednak, że nawet GNU cp nie ma możliwości wyłączenia tego zachowania.
Większość narzędzi do kopiowania (np. Pax, rsync) zachowuje się w ten sam sposób. Możesz upewnić się, że plik zostanie utworzony z domyślnym uprawnieniem, oddzielając źródło od miejsca docelowego, na przykład za pomocą
cat <baz >foo/baz
.źródło
Cóż, trzyletni i więcej pytań, ale wciąż aktualny. Dla przyszłych czytelników chcę dodać, że oczekuje się, że polecenia mv, cp nie będą podążać za listą ACL katalogu docelowego. Odpowiedź Gillesa jest w porządku oprócz ostatniego zdania. Lepszym sposobem zastosowania listy ACL miejsca docelowego do skopiowanego / przeniesionego pliku jest sposób wymieniony tutaj:
http://www.commandlinefu.com/commands/view/4281/copy-acl-of-one-file-to-another-using-getfacl-and-setfacl
Jeśli link zostanie zerwany w przyszłości, wklejam tutaj treść:
skopiuj ACL jednego pliku do drugiego za pomocą getfacl i setfacl
OSTRZEŻENIE: Istniejące listy ACL zostaną utracone.
źródło
Miałem podobny problem z plikami rsynced bez odpowiednich domyślnych list ACL w podkatalogu docelowym. Cp nie ma możliwości ustawienia uprawnień do celu. Ale rsync robi to, używając
--chmod=ugo=rwx
flagi. Zobacz moją odpowiedź tutaj .źródło
Musisz użyć
-p
lub--preserve
zcp
.Od
man 5 acl
:źródło
Listy ACL propagują się poprawnie, ale domyślna maska wydaje się nieprawidłowa. Prawdopodobnie chcesz, aby domyślną maską była rwX.
Jeśli to nie zadziała, prześlij ACL do foo.
źródło
Czy Twój system plików jest podłączony z włączoną opcją „ACL”?
Jeśli nie, dokonaj zmiany, a następnie podłącz ponownie.
źródło
Z tego, co widzę, jesteś właścicielem plików (bhm) przed i po cp. Jak pokazuje katalog, właściciel ma dostęp do odczytu i zapisu!
źródło