Když používám setfacl ke správě toho, jaká oprávnění by měly mít podřízené soubory / adresáře, z nějakého důvodu mají soubory všechna oprávnění kromě toho spouštěcího („x“).
someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ getfacl . # file: . # owner: someuser # group: webs # flags: -s- user::rwx group::rwx other::rwx default:user::rwx default:group::rwx default:other::rwx someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ touch file someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ mkdir dir someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ ls -l total 4 drwxrwsrwx+ 2 someuser webs 4096 paź 31 13:35 dir -rw-rw-rw- 1 someuser webs 0 paź 31 13:35 file
Myslel jsem, že to má něco společného s umask, ale jeho změna různými způsoby nikdy nedává očekávaný výsledek, pokud mi něco nechybí.
Jak to lze opravit?
Odpověď
Odpověď Hauke Laging se snaží říci:
Jakýkoli program, který vytvoří soubor nebo adresář, určuje režim (oprávnění), který daný soubor chce mít. To je téměř vždy napevno v programu C (nebo v jakémkoli použitém jazyce) ) a málokdy je uživatel přímo přístupný. Potom může hodnota umask
a výchozí seznam ACL vypnout bity oprávnění, ale ne přidejte je.
Váš problém je v tom, že zatímco mkdir
určuje režim 777 (rwxrwxrwx
), téměř všechny programy, které vytvářejí soubory, specifikují 666 (rw-rw-rw-
). To zahrnuje touch
, prostředí (pro přesměrování I / O; např. program > file
), editory (vi
, vim
, emacs
atd.), dd
, split
atd. Proto nedostanete oprávnění rwxrwxrwx
k prostému souboru ihned po vytvoření (kterýmkoli z těchto programů), bez ohledu na to, co děláte s ACL; musíte soubor vytvořit a poté chmod
ho.
Z tohoto pravidla existuje několik výjimek:
-
cp
a související programy (např.cpio
,tar
atd.), které kopírují nebo jinak znovu -vytvoří soubor, který (pokusí se) nastaví nový soubor do stejného režimu jako původní soubor. - Kompilátory, které vytvářejí binární spustitelné soubory, určují režim 777 (alespoň pokud kompilace úspěšná), takže uživatel bude ve skutečnosti schopen spustit program, který právě zkompiloval.
Komentáře
Odpověď
Nezmiňujete, co je “ očekávaný výsledek „je. Předpokládám, že se jedná o soubory, které mají nastavenou bitovou sadu x
.
Nelze to vynutit jako výchozí ACL (jako umask), jen brání oprávnění, ale nenastavuje je sám. Nový adresář nebo soubor nezíská více oprávnění (pro uživatele, skupinu a další) než open()
nebo mkdir()
volání, které jej vytvoří.
U souborů se obvykle vyžaduje pouze oprávnění ke čtení a zápisu. Pokud však kompilátor vytvoří binární soubor, požaduje také oprávnění ke spuštění.
Komentáře
- Vaše odpověď je z anglického hlediska docela chaotická. Můžete to prosím opravit? Také si ‚ nejsem jistý co tím myslíš. Podívejte se na můj kód. Pro adresáře to vždy funguje.U souborů to také vždy funguje kromě bitů “ x „. Pokud to také ‚ není správný způsob, co jiného než nastavení umask při každém přístupu do adresáře?
Odpověď
$ touch file && chmod a+x file
Vysvětlení v ostatních odpovědích jsou vynikající. Chci přidat něco, co ve skutečnosti dává odpověď na otázku,
Jak to lze opravit?
s konkrétním kódem. @Scott řekl, jak to udělat,
musíte vytvořit soubor a poté
chmod
jej.
Kód v mé odpovědi ukazuje, jak na to a zvýrazní ho tak, že jej uvede jako první.
Další vysvětlení
Pro začátek jednoduše přidám do touch
příkaz daný OP, konkrétně touch file
se stane touch file && chmod a+x file
.
someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ touch file && chmod a+x file someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ mkdir dir someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ ls -l total 4 drwxrwsrwx+ 2 someuser webs 4096 paź 31 13:35 dir -rwxrwxrwx 1 someuser webs 0 paź 31 13:35 file
Tady nastavím stejnou situaci na svém počítači (Cygwin), abych ukázal, že to funguje, pak udělám totéž na virtuálním boxu Ubuntu, abych ukázal rozdíly v nastavení . (Všimněte si, že skutečný příkaz pro opravu věcí se nemění, chci jednoduše ukázat některé rozdíly, které by mohly přijít s setfacl
, a také si sám ověřit, že to funguje .)
$ uname -a | head -n 1 CYGWIN_NT-10.0 my_machine 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin $ pwd /home/me $ mkdir user294034 $ setfacl -m u::rwx user294034/ $ setfacl -m d:u::rwx user294034/ $ setfacl -m g::rwX user294034/ setfacl: illegal acl entries $ setfacl -m g::rws user294034/ setfacl: illegal acl entries $ # I guess I don"t know how to get the `flags: -s-` on Cygwin $ setfacl -m g::rwx user294034/ $ setfacl -m d:g::rwx user294034/ $ setfacl -m o::rwx user294034/ $ setfacl -m d:o::rwx user294034/ $ cd user294034 $ getfacl . # file: . # owner: me # group: my_group user::rwx group::rwx other:rwx default:user::rwx default:group::rwx default:other:rwx $ # I admitted that I don"t know how to get `# flags: -s-` $ umask 0022 $ umask 0000 $ touch file $ mkdir dir $ # Here, we"ll see the same problem $ ls -l total 0 drwxrwxrwx+ 1 me my_group 0 Sep 18 20:31 dir -rw-rw-rw- 1 me my_group 0 Sep 18 20:31 file $ # Here, we"ll fix the problem $ rm file $ touch file && chmod a+x file $ ls -l total 0 drwxrwxrwx+ 1 me my_group 0 Sep 18 20:31 dir -rwxrwxrwx 1 me my_group 0 Sep 18 20:32 file
Odpověď
Můžete zkusit tento jednoduchý skript, který nahradí záznamy ACL pro každý soubor a adresář a poskytne výchozí zadaná oprávnění.
$ cd ~ $ mkdir .config $ cat <<"EOF" >> .config/dacl user::rwx group::rwx other:r-x default:user::rwx default:group::rwx default:other:r-x EOF $ cat <<"EOF" >> .config/facl user::rw- group::rw- other:r-- default:user::rw- default:group::rw- default:other:r-- EOF $ cd / $ find $1 -type d -exec setfacl -f ~/.config/dacl {} \; $ find $1 -type f -exec setfacl -f ~/.config/facl {} \; $ getfacl . # file: . # owner: MyUser # group: Administrators user::rwx group::rwx other::r-x default:user::rwx default:group::rwx default:other::r-x
user
,group
aother
Záznamy ACL. Pokud máte výchozí položky ACL pro pojmenované uživatele nebo skupiny, budou ‚ zděděny, jak je uvedeno, že?