Почему 777 назначено chmod, чтобы разрешить все в файле?

51

Меня спросили в интервью, почему 777 назначается для получения всех разрешений для файла. Почему бы не 555? Он сказал, что есть причина для всего. Итак, в чем причина 777? Почему нет другого номера? Есть ли какое-либо значение в этом номере?     

задан hellodear 27.05.2014 в 10:41
источник

7 ответов

128

Я попытаюсь устранить основную причину , почему это 777, а не aaa или 999.

Помните, что разрешения имеют следующий формат:

 u   g   o
rwx rwx rwx

где u = user, g = group, o = other.

Теперь представьте, что вы представляете каждую из этих групп как двоичную. 1 истинно, 0 - false.

Если вы хотите предоставить полный доступ ко всем, вы должны назначить следующие разрешения в двоичном формате:

 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 .

Edit:

Технически, как показано @ LưuVĩnhPhúc и @Braiam, мы преобразуем из двоичного в восьмеричное, как описано ниже. Однако десятичные и восьмеричные представления чисел & lt; 8 одинаковы, поэтому для двоичных чисел с 3 цифрами или меньше, как десятичные, так и восьмеричные представления одинаковы.

При представлении в виде восьмеричных чисел, а не разбиении на группы по три, и преобразовании двоичных чисел в десятичные числа в каждой группе, вы можете взять все три группы вместе как одно двоичное число и преобразовать в восьмеричные.

Например, здесь приведены бинарные и восьмеричные преобразования:

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

Обратите внимание, что я предваряю «0b» и «0o», чтобы различать двоичные и восьмеричные числа.

Если вы хотите поиграть с этим, откройте терминал, запустите python , а затем поиграйте со следующими командами:

oct(0b111111111)
bin(0o555)

Не забудьте добавить цифры «0b» или «0o» к номерам, чтобы компьютер знал, какую базу вас интересует. (Если вы этого не сделаете, он будет считать базой 10.)

    
ответ дан daviewales 27.05.2014 в 16:17
источник
16

Чтение разрешений на чтение означает 4 , разрешение файла записи означает 2 и разрешение на использование файла 1 .

Таким образом, общее число составляет 7 .

Теперь что такое 777: first 7 для владельца файла означает, что владелец файла имеет право на чтение, право и исполнение.

2nd 7 для группы, к которой принадлежит файл, означает, что группа также имеет все права на чтение, запись и выполнение.

И третий 7 для других прав

Если вы даете разрешение файла 555 , то файл owner, group and others имеет только read и execute разрешения not write , потому что разрешение на чтение означает 4 и выполняет средство 1, поэтому итоговое значение получает 5

    
ответ дан Prakash V Holkar 27.05.2014 в 10:58
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 (read), и если были 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)
    
ответ дан Daniel Ward 27.05.2014 в 20:50
4

Я удивляюсь многим подобным ответам, которые полностью упускают из виду.

После определения 3 классов, которые были необходимы, прочитайте, напишите и выполните. Они пошли с восьмеричным (3 бита) на , чтобы свести к минимуму пространство, необходимое для управления файловой системой .

    
ответ дан Ununique 31.05.2014 в 00:12
3

По какой-то причине разработчики UNIX решили использовать номера OCTAL для доступа к файлам. Как вы знаете, максимальное значение для восьмеричного восьмеричного номера равно 7. Получилось, что для восьмой цифры для доступа к пользователю, для группового доступа и для доступа к миру достаточно одной восьмеричной цифры. Максимальное восьмеричное число 3digit составляет 777, и имеет смысл только «доступ ко всем / всем».

    
ответ дан DejanLekic 30.05.2014 в 13:53
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-битные поля, вы можете сказать, что каждая восьмеричная цифра управляет одним из полей : первая цифра управляет разрешениями владельца, вторая цифра управляет групповыми разрешениями, а третья digit управляет другими разрешениями. Таким образом, 777 (111 111 111) - все разрешения для всех, а 700 (111 000 000) - все разрешения только для владельца. Другие комбинации также распространены: 666 (110 110 110) читается / записывается для всех, но не выполняется), тогда как 555 (101 101 101) читается / выполняется для всех, но не записывается, а 400 (100 000 000) только для владельца и без доступа для других.

И вот почему 777 означает все разрешения. В наши дни это, вероятно, самая популярная причина, по которой люди используют восьмеричные вообще, хотя Unix и его потомки все еще имеют несколько других остатков. Например, od или Octal Dump - способ получить двоичные дампы файла в восьмеричной форме (у него есть шестнадцатеричный двоюродный брат, который называется xxd , но это не так хорошо известно и недоступно везде) , Именно поэтому вам нужно быть осторожным с ведущими нулями на некоторых языках программирования, потому что они могут подумать, что вы намереваетесь писать числа в восьмеричном, если это не ваше намерение.

    
ответ дан The Spooniest 30.05.2014 в 17:30
0

Другие дали очень хорошие технические объяснения того, что означает число для компьютера, просто для того, чтобы замаскировать их, 7 = 4 (читать) + 2 (написать) + 1 (выполнить), а три цифры означают это: 7 (владелец) 7 (группа) 7 (гость)

Но если бы это было единственное условие, то число могло бы быть легко 3 (0 + 1 + 2) или 6 (1 + 2 + 3).

У меня очень сильное чувство, что выбор 777 - очень хорошая скрытая шутка, которую люди подают в качестве конвенции, поскольку 777 также известен как «номер бога» (так же, как 666 - число дьявола "). Он якобы представляет триумф божественного числа (7) над числом дьявола (666).

И только бог может защитить файл, который имеет 777 как его разрешения.

Ссылка: Ссылка

    
ответ дан kapv89 31.05.2014 в 16:09