Чому 777 призначено chmod, щоб дозволити все у файлі?


54

Мене в інтерв'ю запитали, чому так, 777 призначено приймати всі дозволи для файлу. Чому б не 555? Він сказав, що для цього є причина. Отже, в чому причина 777? Чому б не будь-яке інше число? Чи є в цьому числі якесь значення?



2
Зверніться до коментаря посилання @ AvinashRaj та застосуйте його до примірника. Питання "Чому?" залежить від того, який це екземпляр і з якою метою він служить ... :)
AzkerM

1
Він запитує про значення числа 7 проти 5 чи чому вони є цифрами замість, скажімо, букв?
Брайам

4
Це чудове питання інтерв'ю; Можливо, доведеться його вкрасти.
Цифровий Кріс

5
Власне кажучи, це не 777, а 0777.
Руслан

Відповіді:


129

Я спробую розглянути основну причину, чому це 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.)


17
Просто для повноти формат чисел називається восьмериками, що буквально означає базу 8 (оскільки вони починаються з 0 - це 7 + 1 = 8).
Брайам

3
davie: восьмеричний легко, тому що він фактично групує три біти, так само як і шістнадцяткові групи чотири. Десяткові не є потужністю 2, тому він не групує біти так добре.
Конерак

2
Що ж, ви отримуєте однаковий номер в будь-якому випадку. Я думаю, що більш ймовірно, що хтось зрозуміє перетворення двійкової в десяткову, ніж перетворення двійкової в восьмеричну. Крім того, я додав розділ наприкінці, щоб уточнити, що числа дійсно вісімкові, а не десяткові.
daviewales

3
7те саме в десяткових і восьмеричних - однак, 777це не так. Коли ви говорите про гортання бітів, це має значення.
Сем Дуфель

2
Просто для тривіального ради 7 називають числом Бога, а кореневий користувач, який дозволів за замовчуванням 777іноді називають Богом.
eyoung100

16

Читання дозволу на файл 4, написання засобів дозволу на файл 2та виконання засобів дозволу на файл 1.

Тож загальна кількість цього є 7.

Тепер те, що є 777: по-перше, 7це власник файлу, що означає, що власник файлу має право читати, право і виконувати дозвіл.

2-е 7для групи, до якої належить файл, це означає, що група також має всі дозволи на читання, запис та виконання.

І третє 7- для інших дозвіл

Якщо ви даєте прав доступу до файлу 555то файл owner, group and othersмає тільки readта executeдозволу not writeдозволу , оскільки дозвіл на читання означає , що 4 і виконати засіб-так все отримує5


Що таке група та які ті інші дозволи? Дякуємо за відповідь
привіт

Будь ласка, перейдіть за цим посиланням на групові та інші дозволи, вони будуть застосовані до будь-кого іншого на сервері, який або не ви, чи не є у вашій групі
Prakash V Holkar,

7

Не так багато слів, як головна відповідь:

Кожен файл має 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)

6
Ця відповідь є абсолютно поганою, оскільки не вдається розпізнати двійкову і, що ще важливіше, восьмеричну систему числення як джерело для бітів дозволу файлів Unix. (Як не дивно, їх немає 3, а то й 4… вони 6, хоча повних 18 біт наразі не використовуються.)
mirabilos

1
Основа неважлива, оскільки 111 - 7; Я кажу, що дозволи дозволені 111 або 7 не має значення, тому що це однакове значення. Я використовував десятковий для простоти прикладу, щоб показати математику, що займається. Я міг би використати бінарне, але математика не виглядала б так просто. Що має значення, коли основи можна перекладати між собою?
Даніель Уорд

4

Я здивований такою кількістю подібних відповідей, які повністю пропускають оцінку.

Після визначення 3-х класів, які були потрібні для читання, запису та виконання. Вони йшли з восьмериками (3 біти), щоб мінімізувати простір, необхідний для управління файловою системою .


3

Чомусь дизайнери UNIX вирішили використовувати номери OCTAL для дозволу файлів. Як відомо, максимальне значення для одноцифрового восьмеричного числа - 7. Виявилося, що однієї восьмеричної цифри для доступу користувачів, однієї для групового доступу та однієї для доступу у світі достатньо майже для всього. Максимальне восьмеричне число 3digit - 777, і це має сенс лише для того, щоб він позначав "доступ до всіх / до всього".


Я не думаю, що це хороше пояснення. Дизайнери UNIX могли мати десяткові цифри, і все одно вони мали б 7, що позначають максимальний доступ, а не 9 (як максимальний десятковий розряд). 7 не обрана «субтрактивна» засноване на тому, що номери можливі , починаючи з максимально можливою однією цифрою, але «адитивно» на основі доступу , дозволених окремих двійкових розрядів , починаючи з нуля без будь - яких прав на всіх.
АБО Mapper

Зауважте, я писав на самому початку "чомусь" ... - Я не хотів заглиблюватись у пояснення того, ЧОМУ вони вибрали восьмеричні номери, оскільки це не було питанням ОП. Питання полягало в тому, чому 777 дає всі дозволи.
DejanLekic

Тут не має значення, чому вони вибирали восьмеричні числа. Моя думка полягає в тому, що причина того, що максимальні права представлені цифрою 7, полягає не в тому, що 7 трапляється як максимальне восьмеричне число.
АБО Mapper

2

Сьогодні ми всі знаємо, що байт - це 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, але це не так відомо і не доступне скрізь). Це також, чому вам потрібно бути обережними, ведучи нулі в деяких мовах програмування, тому що вони можуть подумати, що ви маєте намір записати цифри в восьмериці, коли це не є вашим наміром.


Перш за все, коли було створено Linux (близько 1992 р.), 8-розрядний 6-бітний дебат закінчився. 2-е, що НЕ є причиною, чому це було зроблено
Ахмед Масуд

1
Я надав 8-бітний / 6-бітний матеріал для історичного контексту. Linux був створений задовго після того, як закінчилися дебати, це правда, але, оскільки він так багато свого натхнення потягнув від Unix, на це обговорили подібні дебати. Ось чому я подумав, що було б корисно ввести історичний контекст.
Найспокійніший
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.