Мене в інтерв'ю запитали, чому так, 777 призначено приймати всі дозволи для файлу. Чому б не 555? Він сказав, що для цього є причина. Отже, в чому причина 777? Чому б не будь-яке інше число? Чи є в цьому числі якесь значення?
Мене в інтерв'ю запитали, чому так, 777 призначено приймати всі дозволи для файлу. Чому б не 555? Він сказав, що для цього є причина. Отже, в чому причина 777? Чому б не будь-яке інше число? Чи є в цьому числі якесь значення?
Відповіді:
Я спробую розглянути основну причину, чому це 777, а не aaa, або 999.
Пам'ятайте, що дозволи надаються у такому форматі:
u g o
rwx rwx rwx
де u = користувач, g = група, o = інше.
А тепер уявіть, що ви представляєте кожну з цих груп як двійкові. 1 - це правда, 0 - помилково.
Якщо ви хочете надати повний доступ усім, вам слід призначити такі дозволи в двійковій формі:
u g o
rwx rwx rwx
111 111 111
Тепер, якщо ви знаєте двійкове, ви зрозумієте, що перетворюючи 111
з двійкового в десятковий, ви отримуєте 7
.
Таким чином, ви можете представляти повний доступ як 777
.
Примітка. Ми дійсно перетворюємося з двійкового в восьмеричний. Дивіться редагування нижче.
Це працює і для всіх інших режимів доступу.
Наприклад, ми можемо легко розібратися, що 555
означає, перетворивши кожен 5
у бінарний та записуючи його у наведеному вище форматі. 5
у двійковій є 101
, тому у нас є такі дозволи:
u g o
r-x r-x r-x
101 101 101
5 5 5
Так само, якщо ми хочемо дати всі дозволи користувачеві, але лише дозволити читати іншим людям, ми можемо знайти числове представлення.
u g o
rwx r-- r--
111 100 100
7 4 4
Тепер ми знаємо, що 111
у двійковій є 7
десятковий, а 100
у двійковій - 4
у десятковій. Таким чином, дозволи будуть 744
.
Технічно, як підкреслили @ LưuVĩnhPhúc та @Braiam, ми перетворюємось з двійкового на восьмеричний, як описано нижче. Однак десяткові та восьмеричні подання чисел <8 однакові, тому для двійкових чисел з 3 цифрами або менше обидва як десяткові, так і восьмеричні подання однакові.
Якщо вони представлені у вигляді восьмеричних чисел, замість того, щоб розділяти їх на групи по три, а також робити двійкові до десяткових перетворень для кожної групи, ви можете насправді взяти всі три групи разом як єдине двійкове число та перетворити на восьмикутне.
Наприклад, ось деякі бінарні до восьмери перетворення:
0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744
Зауважте, що я передчуваю "0b" та "0o", щоб розрізняти двійкові та восьмеричні числа.
Якщо ви хочете пограти з цим, відкрийте термінал, запустіть, python
а потім пограйте з такими командами:
oct(0b111111111)
bin(0o555)
Не забудьте додати цифри "0b" або "0o" до того, щоб комп'ютер знав, яка база вас цікавить. (Якщо ви цього не зробите, вона вважатиме базовою 10.)
7
те саме в десяткових і восьмеричних - однак, 777
це не так. Коли ви говорите про гортання бітів, це має значення.
777
іноді називають Богом.
Читання дозволу на файл 4
, написання засобів дозволу на файл 2
та виконання засобів дозволу на файл 1
.
Тож загальна кількість цього є 7
.
Тепер те, що є 777: по-перше, 7
це власник файлу, що означає, що власник файлу має право читати, право і виконувати дозвіл.
2-е 7
для групи, до якої належить файл, це означає, що група також має всі дозволи на читання, запис та виконання.
І третє 7
- для інших дозвіл
Якщо ви даєте прав доступу до файлу 555
то файл owner, group and others
має тільки read
та execute
дозволу not write
дозволу , оскільки дозвіл на читання означає , що 4 і виконати засіб-так все отримує5
Не так багато слів, як головна відповідь:
Кожен файл має 3 варіанти дозволу: читати, записувати та виконувати. Ви можете вибрати жодне з них, одне з цих двох, або все це:
C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8
1 + 3 + 3 + 1 = 8
Отже, усього 8 комбінацій; 8 варіантів дозволів. Відлічуючи від 0, останнє число - 7 (від 0 до 7). Отже, представлені цифрами, ось усі варіанти:
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)
Існує три номери, тому що замовлення дістається [дозволи користувача] [групові дозволи] [інші дозволи]
Отже, 777 означає, що всі три групи читали, записували та виконували дозволи.
read
номер 4 замість числа 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)
Єдиний спосіб отримати унікальні комбінації для всіх можливостей - це використання потужностей 2 для основних варіантів. 2 0 = 1 (виконати), 2 1 = 2 (записати), 2 2 = 4 (прочитати), і якщо був би 4-й базовий варіант, він буде пронумерований 2 3 = 8. Зауважте, що write
це не вказано, поки всі комбінації були перераховані попередні варіанти (що є лише одним варіантом, оскільки це просто execute
). read
не відображається до тих пір, поки не будуть перераховані всі комбінації попередніх параметрів (знову ж таки один, оскільки існує лише одна комбінація з двома параметрами - execute
+ write
). execute
+ write
+read
не перераховано до тих пір, поки не будуть перераховані всі попередні комбінації, що становить 3, оскільки зараз є два варіанти з трьох дозволів. Список продовжуватиметься таким чином, незалежно від того, скільки існувало основних варіантів. Наприклад, з чотирма основними варіантами (зауважте, що ми також знаємо, що буде 16 комбінацій, оскільки є 4 варіанти та 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)
Чомусь дизайнери UNIX вирішили використовувати номери OCTAL для дозволу файлів. Як відомо, максимальне значення для одноцифрового восьмеричного числа - 7. Виявилося, що однієї восьмеричної цифри для доступу користувачів, однієї для групового доступу та однієї для доступу у світі достатньо майже для всього. Максимальне восьмеричне число 3digit - 777, і це має сенс лише для того, щоб він позначав "доступ до всіх / до всього".
Сьогодні ми всі знаємо, що байт - це 8 біт : це було узгоджено десятиліттями. Але це не завжди було так, і Unix (який багато надихав Linux) був написаний у той час, коли про це ще дискутували. Зокрема, вона мала бути портативною для систем, які використовують 6-бітні або 8-бітні байти. Одні з людей, які це написали, були з одного боку дебатів, а інші - з іншого.
У відповідній примітці Base-2 (двійковий) - не дуже зручна позначення для запису значень. В даний час більшість програмістів виписують більш компактні позначення, які використовують Base-16 (шістнадцятковий) . 16 - достатньо велика база, щоб ви могли точно упакувати чотири біти в одну шістнадцяткову цифру: наприклад, "0000" у двійковій формі є 0x0 у шістнадцятковій (що "0x" - це звичайний спосіб зазначити, що ви збираєтесь написати шістнадцяткове число), тоді як "1111" - 0xF (або 15 у десятковій кількості). Насправді ви можете записати будь-яку можливу комбінацію чотирьох біт, використовуючи одну шістнадцяткову цифру, просто підраховуючи двійкові, і через те, як працює позиційна арифметика, ви можете її скласти: дві шістнадцяткові цифри можуть кодувати будь-яку можливу комбінацію з восьми біт, просто підрахунком тощо. Тож 8-бітні люди любили це.
У 6-бітних людей це було по-своєму, але замість Base-16 вони використовували Base-8 (восьмеричний). Він має аналогічні переваги у шістнадцятковій: ви можете зберігати будь-яке положення трьох біт у восьмеричній цифрі, а також можете складати цифри аналогічно. Так як 8-розрядні люди використовували дві бали для шістнадцяткових цифр, 6-бітні люди використовували дві октальні цифри для байта. Октал ви вже не дуже бачите, але, як правило, це було відмічено з провідним нулем: наприклад, "111" - це 07 у восьмикутнику.
Тепер, що все це стосується дозволів Unix? Що стосується Unix, то три файли ви можете зробити з файлом: ви можете прочитати його, ви зможете записати в нього або можете виконати його як програму. Якщо ви збираєтесь обмежувати це дозволами, то вам потрібно трохи для кожного з них: увімкніть його для речей, які комусь дозволено робити, і залиште це для речей, які комусь не дозволено робити. Оскільки відстежуються три речі, вам потрібно три біти, а оскільки Unix відстежує їх у трьох рядках (власник, група та всі), вам потрібно всього дев'ять біт.
У якийсь момент вздовж лінії хтось - ймовірно, в 6-бітовому таборі - сказав "Гей, ми можемо використовувати для цього восьмеричні цифри" . І це виявилося дуже зручним позначенням: трьох восьмеричних цифр достатньо, щоб кодувати всі можливі поєднання бітових полів. Як тільки вони вирішили це зробити, доля 777 (і 000-х) була запечатана, оскільки ці цифри були б однаковими незалежно від того, як вони розташовували біти, але порядок мав значення для всіх інших номерів, тому вони почали робити це.
Вони упорядкували дозволи в три бітні поля: читати на початку, писати в середині та виконувати в кінці. Потім вони влаштовували самі поля: власник на старті, група в середині та інші в кінці. Як тільки вони це зробили, все, що їм потрібно було зробити, щоб присвоїти решту чисел, було підраховано.
Оскільки вони є 3-розрядними полями, ви можете сказати, що кожна восьмизначна керує одним із полів : перша цифра керує дозволами власника, друга цифра контролює групу дозволів, а третя цифра контролює інші дозволи. Таким чином, 777 (111 111 111) - це всі дозволи для кожного, тоді як 700 (111 000 000) - це всі дозволи лише для власника. Інші комбінації також поширені: 666 (110 110 110) читається / записується для всіх, але не виконується), тоді як 555 (101 101 101) читається / виконується для всіх, але не пише, а 400 (100 000 000) - лише для власника і немає доступу для когось іншого.
І тому 777 означає всі дозволи. У наші дні це, мабуть, найпопулярніша причина, коли люди взагалі використовують восьмигранник, хоча у Unix та його нащадків все ще є кілька інших залишків. Наприклад, od
або восьмеричний дамп - це спосіб отримати двійкові відвали файлу в восьмеричній формі (він має шістнадцятковий двоюрідний брат, який називається xxd
, але це не так відомо і не доступне скрізь). Це також, чому вам потрібно бути обережними, ведучи нулі в деяких мовах програмування, тому що вони можуть подумати, що ви маєте намір записати цифри в восьмериці, коли це не є вашим наміром.