Når jeg bruker setfacl til å styre hvilke tillatelser bør barnefilene / katalogene har, av en eller annen grunn har filene alle tillatelser bortsett fra utførelsen («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
Jeg trodde det har noe å gjøre med umask, men å endre det på forskjellige måter gir aldri forventet resultat med mindre jeg savner noe.
Hvordan kan dette løses?
Svar
Hauke Lagings svar prøver å si:
Ethvert program som oppretter en fil eller katalog, spesifiserer modusen (tillatelser) den vil at filen skal ha. Dette er nesten alltid hardkodet i C-programmet (eller hvilket språk som brukes ) og er nesten aldri direkte tilgjengelig for brukeren. Da kan umask
-verdien og standard ACL slå av tillatelsesbiter, men ikke legg til dem.
Problemet ditt er at mens mkdir
angir en modus på 777 (rwxrwxrwx
), nesten alle programmer som oppretter filer, spesifiserer 666 (rw-rw-rw-
). Dette inkluderer touch
, skallet (for I / O-omdirigering; f.eks. program > file
), redaksjonen (vi
, vim
, emacs
, etc…), dd
, split
, og så videre. Derfor vil du ikke få tillatelser til rwxrwxrwx
på en ren fil umiddelbart etter opprettelsen (av noen av disse programmene), uansett hva du gjør med ACL-er; du må opprette filen og deretter chmod
den.
Det er et par unntak fra denne regelen:
-
cp
og relaterte programmer (f.eks.cpio
,tar
osv.) som kopierer eller på annen måte -opprett en fil som vil (forsøke å) sette den nye filen i samme modus som den opprinnelige filen. - Kompilatorer som lager binære kjørbare filer, angir en modus på 777 (i det minste hvis kompilering lykkes), slik at brukeren faktisk kan utføre programmet de nettopp kompilerte.
Kommentarer
Svar
Du nevner ikke hva » forventet resultat «er. Jeg antar at det er filene som har x
-bitene.
Du kan ikke håndheve det som standard ACL (som umask) bare forhindrer tillatelser, men setter dem ikke selv. En ny katalog eller fil får ikke flere tillatelser (for bruker, gruppe og annet) enn open()
eller mkdir()
samtale som skaper forespørsler.
For filer blir det vanligvis bare bedt om lese- og skrivetillatelse. Men hvis en kompilator oppretter en binær fil, ber den om å utføre tillatelse også.
Kommentarer
- Svaret ditt er ganske kaotisk sett fra engelsk synspunkt. Kan du rette det? Også jeg ‘ er ikke sikker hva du mener. Ta en titt på koden min. For kataloger fungerer det alltid.For filer fungerer det også alltid bortsett fra » x » bit. Også hvis det ‘ ikke er den riktige måten å gjøre dette på, hva er bortsett fra å sette en umask hver gang en katalog åpnes?
Svar
$ touch file && chmod a+x file
Forklaringene i andre svar er fantastiske. Jeg vil legge til noe som faktisk gir et svar på spørsmålet,
Hvordan kan dette løses?
med spesifikk kode. @Scott fortalte hvordan du gjør dette,
du må opprette filen og deretter
chmod
den.
Koden i svaret mitt viser hvordan du gjør det og fremhever det ved å sette det først.
Mer forklaring
For å begynne med legger jeg bare til touch
kommando gitt av OP, spesielt touch file
blir 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
Her vil jeg sette opp den samme situasjonen på maskinen min (Cygwin) for å vise at den fungerer, og gjør det samme i en virtuell Ubuntu-boks for å vise forskjellene i oppsettet . (Merk at den faktiske kommandoen for å fikse ting ikke endrer seg, jeg vil bare vise noen forskjeller som kan komme opp med setfacl
, samt å bekrefte selv at det fungerer .)
$ 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
Svar
Du kan prøve dette enkle skriptet erstatter ACL-postene for hver fil og katalog, og gir standard tillatelser som er spesifisert.
$ 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
ogother
ACL-oppføringer. Hvis du har standard ACL-oppføringer for navngitte brukere eller grupper, vil de ‘ bli arvet som angitt, ikke sant?