Dlaczego 777 jest przypisane do chmod, aby zezwolić na wszystko w pliku?

54

W wywiadzie zapytano mnie, dlaczego 777 ma przypisać wszystkie uprawnienia do pliku. Dlaczego nie 555? Powiedział, że wszystko jest uzasadnione. Więc jaki jest powód 777? Dlaczego nie inny numer? Czy ta liczba ma jakieś znaczenie?

Witam drodzy
źródło
2
Patrz komentarz do linku @ AvinashRaj i zastosuj go do instancji. Pytanie „Dlaczego?” zależy od tego, co to jest i jaki cel ma służyć ... :)
AzkerM
1
Czy pyta o znaczenie liczby 7 vs 5 lub dlaczego są to liczby zamiast, powiedzmy, liter?
Braiam
4
To świetne pytanie do wywiadu; Może będę musiał go ukraść.
Cyfrowy Chris
5
Ściśle mówiąc, nie jest to 777, ale 0777.
Ruslan

Odpowiedzi:

129

Spróbuję wyjaśnić podstawowy powód, dla którego jest to 777, a nie aaa lub 999.

Pamiętaj, że uprawnienia są w następującym formacie:

 u   g   o
rwx rwx rwx

gdzie u = użytkownik, g = grupa, o = inny.

Teraz wyobraź sobie, że reprezentujesz każdą z tych grup jako binarną. 1 to prawda, 0 to fałsz.

Jeśli chcesz dać pełny dostęp wszystkim, możesz przypisać następujące uprawnienia w postaci binarnej:

 u   g   o
rwx rwx rwx
111 111 111

Teraz, jeśli znasz binarny, zdasz sobie sprawę, że po konwersji 111z binarnego na dziesiętny, otrzymasz 7.

W ten sposób możesz reprezentować pełny dostęp jako 777.

Uwaga: Naprawdę konwertujemy z binarnego na ósemkowy. Zobacz edycję poniżej.

Działa to również dla wszystkich innych trybów dostępu.

Na przykład możemy z łatwością ustalić, co 555oznacza, konwertując każdy 5na plik binarny i zapisując go w powyższym formacie. 5w formacie binarnym jest 101, więc mamy następujące uprawnienia:

 u   g   o
r-x r-x r-x
101 101 101
 5   5   5

Podobnie, jeśli chcemy udzielić użytkownikowi wszystkich uprawnień, ale zezwolić tylko innym osobom na czytanie, możemy znaleźć reprezentację liczbową.

 u   g   o
rwx r-- r--
111 100 100
 7   4   4

Teraz wiemy, że 111w systemie binarnym jest 7dziesiętny, a 100w systemie binarnym 4dziesiętnym. W ten sposób uprawnienia będą 744.

Edytować:

Technicznie, jak podkreślili @ LưuVĩnhPhúc i @Braiam, konwertujemy z binarnego na ósemkowy, jak opisano poniżej. Jednak dziesiętne i ósemkowe reprezentacje liczb <8 są takie same, więc dla liczb binarnych z 3 cyframi lub mniej, reprezentacje dziesiętne i ósemkowe są takie same.

Gdy są reprezentowane jako liczby ósemkowe, zamiast dzielić na grupy trzyosobowe i wykonywać konwersję binarną na dziesiętną w każdej grupie, można faktycznie wziąć wszystkie trzy grupy razem jako jedną liczbę binarną i przekonwertować na liczbę ósemkową.

Na przykład, oto kilka konwersji binarnych na ósemkowe:

0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744

Zauważ, że przygotowuję cyfry „0b” i „0o”, aby odróżnić liczby binarne od liczb ósemkowych.

Jeśli chcesz się tym pobawić, otwórz terminal, uruchom, pythona następnie baw się następującymi poleceniami:

oct(0b111111111)
bin(0o555)

Pamiętaj, aby dodać cyfry „0b” lub „0o” do liczb, aby poinformować komputer, jaką bazą jesteś zainteresowany. (Jeśli nie, przyjmie bazę 10.)

daviewales
źródło
17
Dla zachowania kompletności format liczb nazywa się ósemkami, co dosłownie oznacza podstawę 8 (ponieważ zaczynają się od 0, to 7 + 1 = 8).
Braiam
3
davie: octal jest łatwy, ponieważ faktycznie grupuje trzy bity, podobnie jak grupy szesnastkowe cztery. Dziesiętny nie jest potęgą 2, więc nie grupuje bitów tak ładnie.
Konerak
2
W obu przypadkach dostajesz ten sam numer. Myślę, że bardziej prawdopodobne jest, że ktoś zrozumie konwersję binarną na dziesiętną niż konwersję binarną na ósemkową. Na końcu dodałem także sekcję wyjaśniającą, że liczby są naprawdę ósemkowe, a nie dziesiętne.
daviewales
3
7jest taki sam w liczbach dziesiętnych i ósemkowych - jednak 777nie jest. Kiedy mówisz o przerzucaniu bitów, robi to różnicę.
Sam Dufel
2
Na wszelki wypadek 7 jest określane jako Liczba Boga, a użytkownik root, którego domyślne uprawnienia są 777czasami nazywane Bogiem.
eyoung100
16

Odczytywanie uprawnień do plików 4, pisanie środków do uprawnień do plików 2i wykonywanie uprawnień do plików 1.

Więc w sumie jest to 7.

Co to jest 777: po pierwsze 7dla właściciela pliku, co oznacza, że ​​właściciel pliku ma uprawnienia do odczytu, wykonania i wykonania.

2. 7dotyczy grupy, do której należy plik, oznacza to, że grupa ma również wszystkie uprawnienia do odczytu, zapisu i wykonywania.

A trzeci 7jest za pozwoleniem innych

Jeśli dasz plikowi pozwolenie, 555plik będzie owner, group and othersmiał tylko uprawnienie readi pozwolenie, ponieważ uprawnienie do odczytu oznacza 4, a wykonanie oznacza 1, więc w sumie dostaje sięexecutenot write5

Prakash V Holkar
źródło
Co to jest grupa i jakie są te inne uprawnienia? Dzięki za odpowiedź.
hellodear
Odwołaj się do tego linku w celu uzyskania informacji o grupie i innych uprawnieniach, zostaną one wymuszone na kimkolwiek innym na serwerze, który nie jest tobą ani nie należy do twojej grupy
Prakash V Holkar
7

W nie tak wielu słowach, jak pierwsza odpowiedź:

Każdy plik ma 3 opcje uprawnień: odczyt, zapis i wykonywanie. Nie możesz wybrać żadnego z nich, jednego z nich, dwóch z nich lub wszystkich z nich:

C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8

1 + 3 + 3 + 1 = 8

W sumie istnieje 8 kombinacji; 8 opcji uprawnień. Licząc od 0, ostatnia liczba to 7 (od 0 do 7). Tak więc, reprezentowane przez liczby, oto wszystkie opcje:

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)

Istnieją trzy liczby, ponieważ kolejność to [uprawnienia użytkownika] [uprawnienia grupy] [uprawnienia innych osób]

777 oznacza, że ​​wszystkie trzy grupy mają uprawnienia do odczytu, zapisu i wykonywania.


Również (pośrednio powiązane, więc niekoniecznie musisz przeczytać tę część), ponieważ uważam, że jej znaczenie jest ważne: Dlaczego readliczba 4 zamiast liczby 3?

0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)

Jedynym sposobem na uzyskanie unikalnych kombinacji dla wszystkich możliwości jest skorzystanie z potęg 2 w przypadku podstawowych opcji. 2 0 = 1 (wykonanie), 2 1 = 2 (zapis), 2 2 = 4 (odczyt), a jeśli istniałaby czwarta podstawowa opcja, oznaczono by ją 2 3 = 8. Uwaga: writenie jest wymieniona, dopóki wszystkie kombinacje poprzednie opcje zostały wymienione (co jest tylko jedną opcją, ponieważ jest tylko execute). readnie jest wyświetlane, dopóki nie zostaną wymienione wszystkie kombinacje poprzednich opcji (ponownie jedna, ponieważ istnieje tylko jedna kombinacja z dwiema opcjami - execute+ write). execute+ write+readnie jest wymieniony, dopóki nie zostaną wymienione wszystkie poprzednie kombinacje, czyli 3, ponieważ teraz są dwie opcje z trzech uprawnień. Lista byłaby kontynuowana w ten sposób, bez względu na liczbę podstawowych opcji. Na przykład, z 4 podstawowymi opcjami (pamiętaj, że wiemy również, że będzie 16 kombinacji, ponieważ są 4 opcje i 2 4 = 16):

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)
Daniel Ward
źródło
6
Ta odpowiedź jest bardzo zła, ponieważ nie rozpoznaje binarnego i, co ważniejsze, systemu liczb ósemkowych jako źródła bitów uprawnień do plików w systemie Unix. (Zabawne jest to, że nie są to 3, a nawet 4… to 6, choć obecnie nie używa się pełnych 18 bitów.)
mirabilos
1
Baza jest nieistotna, ponieważ 111 to 7; to, czy powiem, że uprawnienia to 111 czy 7, nie ma znaczenia, ponieważ jest to ta sama wartość. Użyłem dziesiętnego dla uproszczenia przykładu, aby pokazać matematykę. Mógłbym użyć binarnego, ale matematyka nie wyglądałaby tak prosto. Jakie znaczenie ma to, że bazy można tłumaczyć między sobą?
Daniel Ward
4

Jestem zaskoczony tyloma podobnymi odpowiedziami, które kompletnie mija się z celem.

Po określeniu 3 klas, które były potrzebne, przeczytaj, napisz i uruchom. Poszli z ósemkową (3 bity), aby zminimalizować miejsce potrzebne do zarządzania systemem plików .

Ununique
źródło
3

Z jakiegoś powodu projektanci UNIX zdecydowali się użyć liczb OCTAL do uprawnień do plików. Jak wiadomo, maksymalna wartość jednocyfrowej liczby ósemkowej wynosi 7. Okazało się, że jedna cyfra ósemkowa dla dostępu użytkownika, jedna dla dostępu grupowego i jedna dla dostępu do świata wystarcza na prawie wszystko. Maksymalna ósemkowa liczba 3digit to 777 i ma sens jedynie, że oznacza „dostęp do wszystkich / wszystkiego”.

DejanLekic
źródło
Nie sądzę, żeby to było dobre wytłumaczenie. Projektanci UNIX mogliby mieć liczby dziesiętne i nadal mieliby 7 oznaczających maksymalny dostęp zamiast 9 (jako maksymalna cyfra dziesiętna). 7 nie jest wybrane „subtractively” w oparciu o to, co możliwe, zaczynając od najwyższego możliwego jednej cyfry są liczbami, ale „addytywnie” opiera się na dostępie dozwolonym przez pojedynczych cyfr binarnych zaczynając od zera do żadnych praw.
LUB Mapper
Zauważ, że napisałem na samym początku „z jakiegoś powodu” ... - Nie chciałem się głębiej wyjaśniać, DLACZEGO wybrali liczby ósemkowe, ponieważ to nie było pytanie OP. Pytanie brzmiało, dlaczego 777 daje wszystkie uprawnienia.
DejanLekic
Nie ma znaczenia, dlaczego wybrali liczby ósemkowe. Chodzi mi o to, że powodem, dla którego maksymalne prawa są reprezentowane przez liczbę 7, nie jest to, że 7 zdarza się być maksymalną liczbą ósemkową.
LUB Mapper
2

W dzisiejszych czasach wszyscy wiemy, że bajt ma 8 bitów : jest to powszechnie uzgadniane od dziesięcioleci. Ale nie zawsze tak było, a Unix (który na wiele sposobów zainspirował Linuksa) został napisany w czasie, gdy wciąż był dyskutowany. W szczególności musiała być przenośna w systemach, które używały 6-bitowych lub 8-bitowych bajtów. Niektórzy ludzie, którzy to napisali, byli po jednej stronie debaty, a inni po drugiej stronie.

W pokrewnej uwadze, Base-2 (binarny) nie jest bardzo wygodnym zapisem do zapisywania wartości. W dzisiejszych czasach większość programistów pisze bardziej zwartą notację, która zamiast tego używa Base-16 (szesnastkowo) . 16 jest na tyle duże, że można dokładnie spakować cztery bity w jedną cyfrę szesnastkową: na przykład „0000” w systemie binarnym to 0x0 w systemie szesnastkowym (ten „0x” jest powszechnym sposobem na zwrócenie uwagi wpisz liczbę szesnastkową), a „1111” to 0xF (lub 15 w systemie dziesiętnym). Możesz napisać dowolną możliwą kombinację czterech bitów za pomocą pojedynczej cyfry szesnastkowej, po prostu licząc binarnie, a ze względu na sposób działania arytmetyki pozycyjnej możesz ją układać w stos: dwie cyfry szesnastkowe mogą kodować dowolną możliwą kombinację ośmiu bitów, po prostu licząc i tak dalej. Więc 8-bitowi ludzie to uwielbiali.

6-bitowi ludzie mieli na to swój sposób, ale zamiast używać Base-16, używali Base-8 (ósemkowe). Ma podobne zalety jak w systemie szesnastkowym: możesz przechowywać dowolną pozycję trzech bitów w postaci ósemkowej i możesz układać cyfry w podobny sposób. Tak jak 8-bitowi ludzie używali dwóch cyfr szesnastkowych dla bajtu, tak 6-bitowi ludzie używali dwóch cyfr ósemkowych dla bajtu. Nie widać już ósemki, ale zwykle zapisywano ją z wiodącym zerem: na przykład „111” to ósemka.

Co to wszystko ma wspólnego z uprawnieniami uniksowymi? Jeśli chodzi o Unixa, istnieją trzy rzeczy, które możesz zrobić z plikiem: możesz go odczytać, możesz do niego napisać lub możesz uruchomić go jako program. Jeśli zamierzasz ograniczyć to za pomocą uprawnień, potrzebujesz trochę dla każdego z nich: włącz to dla rzeczy, które ktoś może robić, i zostaw to dla rzeczy, których ktoś nie może robić. Ponieważ śledzone są trzy rzeczy, potrzebujesz trzech bitów, a ponieważ Unix śledzi je wzdłuż trzech linii (właściciel, grupa i wszyscy), potrzebujesz łącznie dziewięć bitów.

W pewnym momencie ktoś - prawdopodobnie w 6-bitowym obozie - powiedział: „Hej, możemy do tego użyć cyfr ósemkowych” . Okazało się to bardzo wygodnym zapisem: trzy cyfry ósemkowe wystarczą do zakodowania każdej możliwej kombinacji pól bitowych. Gdy zdecydowali się to zrobić, los 777 (i 000) został przypieczętowany, ponieważ liczby te byłyby takie same bez względu na to, jak ułożyły bity, ale kolejność miała znaczenie dla wszystkich innych liczb, więc postanowili to zrobić.

Ułożyli uprawnienia w trzy-bitowe pola: czytaj na początku, pisz na środku i wykonuj na końcu. Potem sami ułożyli pola: właściciel na początku, grupa na środku i inni na końcu. Gdy to zrobili, wszystko, co musieli zrobić, aby przypisać resztę liczb, liczyło się.

Ponieważ są to pola 3-bitowe, można powiedzieć, że każda cyfra ósemkowa kontroluje jedno z pól : pierwsza cyfra kontroluje uprawnienia właściciela, druga cyfra kontroluje uprawnienia grupy, a trzecia cyfra steruje innymi uprawnieniami. Zatem 777 (111 111 111) to wszystkie uprawnienia dla wszystkich, podczas gdy 700 (111 000 000) to wszystkie uprawnienia tylko dla właściciela. Inne kombinacje są również powszechne: 666 (110 110 110) jest odczytywany / zapisywany dla wszystkich, ale nie wykonywany), podczas gdy 555 (101 101 101) jest odczytywany / wykonywany dla wszystkich, ale nie zapisuje, a 400 (100 000 000) jest odczytany tylko dla właściciela i bez dostępu dla nikogo innego.

I dlatego 777 oznacza wszystkie uprawnienia. W dzisiejszych czasach jest to prawdopodobnie najpopularniejszy powód, dla którego ludzie w ogóle używają ósemki, chociaż Unix i jego potomkowie wciąż mają kilka innych jego pozostałości. Na przykład, odlub Octal Dump, jest sposobem na uzyskanie zrzutów binarnych pliku w postaci ósemkowej (ma szesnastkowego kuzyna, nazywanego xxd, ale nie jest tak dobrze znany i nie jest dostępny wszędzie). Dlatego też powinieneś być ostrożny z zerami na początku w niektórych językach programowania, ponieważ mogą myśleć, że zamierzasz pisać liczby ósemkowe, gdy tak naprawdę nie jest to twoja intencja.

The Spooniest
źródło
Po pierwsze, kiedy powstał Linux (około 1992 r.) 8-bitowa 6-bitowa debata dobiegła końca. 2. to NIE jest powód, dla którego tak się stało
Ahmed Masud
1
Podałem 8-bitowy / 6-bitowy materiał dla kontekstu historycznego. Linux został stworzony długo po zakończeniu tej debaty, to prawda, ale ponieważ czerpał tyle inspiracji z Uniksa, ta debata miała na nią podobny wpływ. Dlatego pomyślałem, że dobrym pomysłem byłoby wprowadzenie kontekstu historycznego.
The Spooniest