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?
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?
Odpowiedzi:
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 111
z 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 555
oznacza, konwertując każdy 5
na plik binarny i zapisując go w powyższym formacie. 5
w 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 111
w systemie binarnym jest 7
dziesiętny, a 100
w systemie binarnym 4
dziesiętnym. W ten sposób uprawnienia będą 744
.
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, python
a 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.)
7
jest taki sam w liczbach dziesiętnych i ósemkowych - jednak 777
nie jest. Kiedy mówisz o przerzucaniu bitów, robi to różnicę.
777
czasami nazywane Bogiem.
Odczytywanie uprawnień do plików 4
, pisanie środków do uprawnień do plików 2
i wykonywanie uprawnień do plików 1
.
Więc w sumie jest to 7
.
Co to jest 777: po pierwsze 7
dla właściciela pliku, co oznacza, że właściciel pliku ma uprawnienia do odczytu, wykonania i wykonania.
2. 7
dotyczy grupy, do której należy plik, oznacza to, że grupa ma również wszystkie uprawnienia do odczytu, zapisu i wykonywania.
A trzeci 7
jest za pozwoleniem innych
Jeśli dasz plikowi pozwolenie, 555
plik będzie owner, group and others
miał tylko uprawnienie read
i pozwolenie, ponieważ uprawnienie do odczytu oznacza 4, a wykonanie oznacza 1, więc w sumie dostaje sięexecute
not write
5
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.
read
liczba 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: write
nie jest wymieniona, dopóki wszystkie kombinacje poprzednie opcje zostały wymienione (co jest tylko jedną opcją, ponieważ jest tylko execute
). read
nie 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
+read
nie 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)
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”.
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, od
lub 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.