В одном из интервью меня спросили, почему 777 назначено для получения всех разрешений для файла. Почему не 555? Он сказал, что есть причина для всего. Итак, в чем причина 777? Почему не любой другой номер? Есть ли какое-то значение в этом числе?
В одном из интервью меня спросили, почему 777 назначено для получения всех разрешений для файла. Почему не 555? Он сказал, что есть причина для всего. Итак, в чем причина 777? Почему не любой другой номер? Есть ли какое-то значение в этом числе?
Ответы:
Я попытаюсь решить основную причину, почему это 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.)
7
то же самое в десятичной и восьмеричной - однако, 777
нет. Когда вы говорите о переворачивании битов, это имеет значение.
777
которого иногда называют Богом.
Средства разрешения чтения файла, средства разрешения 4
записи файла 2
и средства разрешения доступа к файлу 1
.
Таким образом, итог всего этого 7
.
Теперь 777: во-первых 7
, для владельца файла, что означает, что у владельца файла есть права на чтение, праву и выполнение.
2-й 7
- для группы, к которой принадлежит файл, это означает, что группа также имеет все права на чтение, запись и выполнение.
И третье 7
- для других
Если вы даете разрешение файла , 555
то файл owner, group and others
только read
и execute
разрешение not write
разрешение , потому что чтение означает разрешение 4 и выполнение средства 1 так , общая получает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, поскольку теперь есть два варианта из трех разрешений. Список будет продолжаться таким образом, независимо от того, сколько будет базовых вариантов. Для примера, с 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)
Я удивлен так много похожих ответов, которые совершенно не попадают в цель.
После определения 3 классов, которые были необходимы, прочитайте, напишите и выполните. Они пошли с восьмеричным (3 бита), чтобы минимизировать пространство, необходимое для управления файловой системой .
По какой-то причине разработчики 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 (и тысячи) была решена, потому что эти числа были бы одинаковыми, независимо от того, как они расположили биты, но порядок имел значение для всех других чисел, поэтому они приступили к выполнению этого.
Они распределили разрешения в трехбитные поля: чтение в начале, запись в середине и выполнение в конце. Затем они сами организовали поля: владелец в начале, группа в середине и другие в конце. После того, как они сделали это, все, что им нужно было сделать, чтобы присвоить оставшиеся цифры, было считать.
Поскольку они являются 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
, но это не так хорошо известно и доступно не везде). Именно поэтому вам нужно быть осторожным с ведущими нулями в некоторых языках программирования, потому что они могут подумать, что вы намереваетесь писать цифры в восьмеричном виде, когда это не является вашим намерением.