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

54

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

Здравствуй, дорогой
источник
5
взгляните на help.ubuntu.com/community/FilePermissions
Авинаш Радж
2
Ссылайтесь на комментарий ссылки AvinashRaj и применяйте его к экземпляру. Вопрос "Почему?" зависит от того, что это за экземпляр и какой цели он служит ... :)
AzkerM
1
Он спрашивает о значении числа 7 против 5 или почему они являются цифрами, а не, скажем, буквами?
Брайам
4
Это отличный вопрос для интервью; Возможно, мне придется украсть это.
Digital Chris
5
Строго говоря, это не 777, а 0777.
Руслан

Ответы:

129

Я попытаюсь решить основную причину, почему это 777, а не ааа, или 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.)

daviewales
источник
17
Просто ради полноты, формат чисел называется восьмеричным, что буквально означает основание 8 (поскольку они начинаются с 0, это 7 + 1 = 8).
Брайам
3
davie: восьмеричное легко, потому что оно на самом деле группирует три бита, так же как шестнадцатеричные группы четыре. Десятичная дробь не является степенью 2, поэтому она не так хорошо группирует биты.
Конерак
2
Ну, вы получаете одно и то же число в любом случае. Я думаю, что более вероятно, что кто-то поймет двоичное в десятичное преобразование, чем двоичное в восьмеричное преобразование. Кроме того, я добавил раздел в конце, чтобы уточнить, что числа действительно восьмеричные, а не десятичные.
daviewales
3
7то же самое в десятичной и восьмеричной - однако, 777нет. Когда вы говорите о переворачивании битов, это имеет значение.
Сэм Дюфель
2
Просто для простоты 7 называют Божьим номером, а пользователя root, права доступа по умолчанию 777которого иногда называют Богом.
eyoung100
16

Средства разрешения чтения файла, средства разрешения 4записи файла 2и средства разрешения доступа к файлу 1.

Таким образом, итог всего этого 7.

Теперь 777: во-первых 7, для владельца файла, что означает, что у владельца файла есть права на чтение, праву и выполнение.

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

И третье 7- для других

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

Пракаш В Холкар
источник
Что такое группа и каковы эти другие разрешения? Спасибо за ответ.
hellodear
Перейдите по этой ссылке для группы и других разрешений, они будут применены к любому другому пользователю на сервере, который не принадлежит вам или не входит в вашу группу
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, поскольку теперь есть два варианта из трех разрешений. Список будет продолжаться таким образом, независимо от того, сколько будет базовых вариантов. Для примера, с 4 основными вариантами (обратите внимание, что мы также знаем, что всего будет 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-битные
целые в
1
База не важна, так как 111 - 7; скажу ли я, что права доступа 111 или 7, не имеет значения, потому что это одно и то же значение. Я использовал десятичную для простоты примера, чтобы показать математику. Я мог бы использовать двоичный файл, но математика не выглядела бы так просто. Какое имеет значение, когда базы можно переводить между собой?
Даниэль Уорд,
4

Я удивлен так много похожих ответов, которые совершенно не попадают в цель.

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

Ununique
источник
3

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

DejanLekic
источник
Я не думаю, что это хорошее объяснение. Разработчики 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 (и тысячи) была решена, потому что эти числа были бы одинаковыми, независимо от того, как они расположили биты, но порядок имел значение для всех других чисел, поэтому они приступили к выполнению этого.

Они распределили разрешения в трехбитные поля: чтение в начале, запись в середине и выполнение в конце. Затем они сами организовали поля: владелец в начале, группа в середине и другие в конце. После того, как они сделали это, все, что им нужно было сделать, чтобы присвоить оставшиеся цифры, было считать.

Поскольку они являются 3-битными полями, можно сказать, что каждая восьмеричная цифра контролирует одно из полей : первая цифра контролирует права владельца, вторая цифра контролирует права группы, а третья цифра контролирует другие разрешения. Таким образом, 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, но это не так хорошо известно и доступно не везде). Именно поэтому вам нужно быть осторожным с ведущими нулями в некоторых языках программирования, потому что они могут подумать, что вы намереваетесь писать цифры в восьмеричном виде, когда это не является вашим намерением.

Ложка
источник
Во-первых, когда был создан Linux (около 1992 года), 8-битные 6-битные дебаты были WAY окончены.
Ахмед Масуд
1
Я предоставил 8-битный / 6-битный материал для исторического контекста. Это правда, что Linux был создан задолго до того, как эти дебаты закончились, но, поскольку он черпал вдохновение в Unix, эти дебаты затронули его аналогичным образом. Вот почему я подумал, что было бы неплохо представить исторический контекст.
Самая ложная