Dlaczego niektóre wartości umask nie działają?


9

Próbuję lepiej zrozumieć uprawnienia, więc wykonuję kilka „ćwiczeń”. Oto sekwencja poleceń, których używam z ich odpowiednimi danymi wyjściowymi:

$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1

Ma to sens, ponieważ wiemy, że domyślnymi uprawnieniami do plików są 666( rw-rw-rw-), a domyślnymi uprawnieniami do katalogów są 777( rwxrwxrwx). Gdybym odjąć wartość umask z tych uprawnień domyślnych mam 666-022=644, rw-r--r--, dla file1, więc jest to spójne z poprzedniego wyjścia; 777-022=755, rwx-r-x-r-xdla dir1, również spójny.

Ale jeśli zmienię umask z 022na 021, to już nie będzie.

Oto przykład pliku:

$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2

-rw-r--rw-jest, 646ale powinno być 666-021=645. Więc to nie działa zgodnie z poprzednim obliczeniem.

Oto przykład katalogu:

$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2

drwxr-xrw-jest 756, 777-021=756. Zatem w tym przypadku wynik jest spójny z poprzednim obliczeniem.

Przeczytałem mężczyznę, ale nie znalazłem nic na temat tego zachowania.

Czy ktoś może wyjaśnić, dlaczego?

WYJAŚNIENIE

Jak wskazano w odpowiedziach: umaskwartość nie jest matematycznie odejmowana od domyślnych uprawnień do katalogu i pliku.

Efektywnie zaangażowana operacja jest kombinacją operatorów logicznych AND (&) i NOT (!). Dany:

R = wynikające uprawnienia
D = domyślne uprawnienia
U = aktualne umask

R = D i! U

Na przykład:

666 i! 0053 = 110 110 110 i 
            ! 000 101 011 
             110 110 110 i  
             111 010 100
           = 110 010 100 = 624 = rw - wr--
 
777 i! 0022 = 111 111 111 i 
            ! 000 010 010
             111 111 111 i  
             111 101 101
           = 111 101 101 = 755 = rwxr - xr-x 

WSKAZÓWKA

Prostym sposobem na szybkie poznanie wynikowych uprawnień (przynajmniej mi pomogło) jest myślenie, że możemy użyć tylko 3 wartości dziesiętnych:

r = 100 = 4 
w = 010 = 2
x = 001 = 1

Uprawnienia będą kombinacją tych 3 wartości.
" "służy do wskazania, że ​​względne pozwolenie nie zostało udzielone.

666 = 4+2+" "   4+2+" "   4+2+" "  = rw rw rw  

Więc jeśli moim aktualnym umask jest 0053to, wiem, że usuwam (4+1) uprawnienia do odczytu i wykonywania z grupy oraz zapisywania i wykonywania (2+1)z innych, co powoduje

 4+2     " "+2+" "     4+" "+" "   = 624 = rw--w-r--  

(grupa i inne osoby nie miały już uprawnień do wykonywania)

Odpowiedzi:


26

umaskto maska , to nie jest odejmowana wartość. A zatem:

  • tryb 666, maska ​​022: wynik to 666 ~ 022, tj. 666 i 755, czyli 644;
  • tryb 666, maska ​​021: wynik to 666 i ~ 021, tj. 666 i 756, czyli 646.

Pomyśl o zaangażowanych bitach. 6 w trybie oznacza, że ​​bity 1 i 2 są ustawiane, odczytywane i zapisywane. 2 w masce maskuje bit 1, bit zapisu. 1 w masce maskuje bit 0, bit wykonania.

Innym sposobem na przedstawienie tego jest sprawdzenie uprawnień w formie tekstowej. 666 oznacza rw-rw-rw-; 022 oznacza ----w--w-; 021 jest ----w---x. Maska upuszcza ustawione bity z trybu, więc rw-rw-rw-maskowanie przez ----w--w-staje się rw-r--r--, maskowane przez ----w---xstaje się rw-r--rw-.


11

Musisz myśleć binarnie, a nie dziesiętnie. W szczególności istnieją trzy 3-bitowe liczby binarne: po jednej dla Właściciela, Grupy i Inne. Każda z wartościami w zakresie od 000 do 111 (0–7 po przecinku).

np. rw-rw-rw (666) to 110 110 110.

umaskWartość określającą maska jakiej bity będą lub od (1 albo 0) podczas tworzenia nowego pliku lub katalogu. np. 022 dziesiętny to 000 010 010 binarny, podczas gdy 021 dziesiętny to 000 010 001

Bity uprawnień są AND-wraz z negacją umask, aby uzyskać ostateczną wartość. „negowane” oznacza, że ​​wszystkie bity są odwrócone, tzn. wszystkie 1 są odwrócone do zera i odwrotnie. na przykładNOT 022 (000 010 010) = 755 (111 101 101)

Przykład: 666 & !022 = 644. W trybie binarnym jest to:

  Owner  Group  Other     mode
   110    110    110      666 
&  111    101    101      755   (this is the negated 022)
   ---    ---    ---      ---
   110    100    100      644

Ponadto 777 & !022 = 755:

  Owner  Group  Other     mode
   111    111    111      777 
&  111    101    101      755
   ---    ---    ---      ---
   111    101    101      755

Zauważ, że końcowa wartość każdego bitu może wynosić tylko 1, jeśli jest równa 1 zarówno w pierwotnej wartości zezwolenia (666 lub 777) ORAZ w negowanym umasku. Jeśli jeden z nich ma wartość 0, wynik wynosi 0. To znaczy, 1 i 1 = 1 , a 1 i 0 = 0 .


Ściśle mówiąc, istnieje czwarta 3-bitowa liczba binarna dla bitów setuid, setgid i lepkich. Dlatego często widzisz uprawnienia i maski określone z wiodącym 0 (lub innym wiodącym numerem z 0-7). np. 0777 lub 2755.


2
Technicznie rzecz biorąc, jest ósemkowy, a nie dziesiętny, ale tak naprawdę nie zmienia to sedna odpowiedzi.
David Z

@DavidZ: OP myślał, że to dziesiętne (patrz przykład odejmowania w Q), co prawdopodobnie odnosi się do cas.
Wyścigi lekkości na orbicie

1
@ Lekkość przykłady odejmowania podane przez OP działają bez względu na to, czy są ósemkowe, czy dziesiętne, biorąc pod uwagę, że żadna cyfra nie osiąga 8 i nigdy nie ma potrzeby przenoszenia. Zgadzam się, że możliwe, że OP myślał dziesiętnie, ale nic w pytaniu tego nie dowodzi.
Stephen Kitt

@StephenKitt: Wygląda na to, że mój palec musiał ześlizgnąć się na klawiaturze, kiedy pisałem przykłady do calc.exe, aby to udowodnić 😂
Wyścigi lekkości na orbicie

1
@cas tak, nie zgadzałem się z tą częścią (to także podstawa mojej odpowiedzi), tylko z twierdzeniem Lightnessa, że ​​OP oblicza się w postaci dziesiętnej, a nie ósemkowej.
Stephen Kitt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.