Jak oblicza się umask w systemie Linux?

15

Wiem, że umaskmogę ograniczyć uprzywilejowanych użytkowników, używając tego formatu umask ugo.

Rozumiem, że read = 4, write = 2, i exec = 1. Jednak gdy piszę umask, zwraca 4 cyfry, czyli 0022lub 0073. Nie rozumiem, jak to działa teraz, ponieważ istnieje dodatkowa cyfra. Co to jest ta dodatkowa cyfra i co 0022oznacza?

Braiam
źródło

Odpowiedzi:

18

Załóżmy, że domyślna maska ​​to 0666. umask0022 spowoduje, że nowa maska ​​0644 (0666-0022 = 0644) oznacza, że ​​grupa i inni mają uprawnienia do odczytu (bez zapisu lub wykonywania).

„Dodatkowa” cyfra (pierwsza liczba = 0) oznacza, że ​​nie ma żadnych trybów specjalnych.

Jeśli tryb zaczyna się od cyfry, będzie interpretowany jako ósemkowy, w przeciwnym razie ma być symboliczny.

0 jest cyfrą, podobnie jak 1 (dla bitu lepkiego) lub 6 (dla SGID). Polecenie, które chmodmożna wywołać innymi metodami, na przykład w chmod ug+rw mydirprzypadku dodania uprawnień do odczytu i zapisu do użytkownika i grupy. Zauważ, że tryb w tym przypadku (ug + rw) nie zaczyna się od cyfry, dlatego nie będzie interpretowany jako ósemkowy, ale raczej symboliczny.

Zobacz en.wikipedia.org/wiki/Chmod#Symbolic_examples dla symboli, a także www.lifeaftercoffee.com/2007/03/20/special-permission-modes-in-linux-and-unix/, aby dowiedzieć się więcej na temat trybów specjalnych.

Nie wiem, czy zdemaskowałbyś pierwszy bit umask, ale technicznie możesz. To by wyjaśniało, dlaczego prawie zawsze postrzegasz to jako zero.

Kredyt dla pinkfloydx33

Pierwsza cyfra maski dotyczy specjalnych uprawnień, które nie pasują tak dokładnie do właściciela / grupy / innego modelu. Gdy dla uprawnienia do pliku podano cztery cyfry, pierwsza odnosi się do tych wartości specjalnych:

4000 = SUID
2000 = SGID
1000 = sticky bit

Bit SUID, skrót od set-user-ID, powoduje, że program wykonywalny działa z efektywnym identyfikatorem użytkownika (uid) właściciela - innymi słowy, bez względu na to, kto go wykonuje, program wykonuje się na prawach właściciela. Jest to powszechnie widoczne w programach, które robią rzeczy, które wymagają uprawnień roota, ale są przeznaczone do uruchamiania przez zwykłych użytkowników: passwdjest jednym z takich przykładów.

Bit SGID, skrót od set-group-ID, jest bardzo podobny, ale działa z efektywnym id grupy (gid) właściciela.

Lepki kawałek jest nieco bardziej skomplikowany, jeśli chcesz uzyskać więcej informacji na ten temat, możesz przeczytać stronę podręcznika sticky.

Te bity mogą być również używane z katalogami, ale ich znaczenie się zmienia.

Nie sądzę, że można ustawić umaskopcję domyślnego włączenia któregoś z tych dodatkowych bitów, ale prawdopodobnie i tak nigdy byś tego nie chciał.

Kredyt dla użytkownika470379

Braiam
źródło
1
W rzeczywistości nie można podać wartości niezerowej innej niż w ostatnich 3 cyfrach. Według Posix: „Interpretacja wartości trybu, które określają bity trybu pliku inne niż bity uprawnień do pliku, nie jest określona.” Według man 2 umask(odpowiedniego wywołania systemowego) „ maskużywane są tylko bity uprawnień do pliku ”. W bash, umask 1000 generuje błąd: „liczba ósemkowa poza zakresem”. Skąd więc dodatkowe 0? Myślę, że to tylko po to, aby pokazać liczbę ósemkową.
rici
ten pastebin nie ma żadnego odniesienia do umask, więc nie rozumiem, jak to jest istotne. chmod pozwala na ustawienie pierwszych trzech bitów, ale umask nie pozwala na ich zamaskowanie. (tzn. mogłeś napisać chmod 6777 dropbox. A tak przy okazji, także chmod ug+s.)
rici
Tak, masz rację, nie wiem o czym myślałem.
Braiam
@Braiam: Twoja formuła do obliczania nowej maski jest nieprawidłowa, nie jest 0666-0022, jest 0666 & ~0022.
cuonglm
1
Myślę, że sprzeciwem nie jest sposób zapisu liczb, ale użycie operatora odejmowania (-) zamiast bitowego i (&).
BowlOfRed