Понимание разрешений UNIX и типов файлов

68

Я никогда не понимал, как chmodработал до сегодняшнего дня. Я следовал учебнику, который объяснил мне многое.

Например, я прочитал, что у вас есть три разные группы разрешений:

  • владелец ( u)
  • группа ( g)
  • каждый ( o)

Основываясь на этих трех группах, я теперь знаю, что:

  • Если файл принадлежит пользователю, права доступа определяют его права доступа.
  • Если группа файла совпадает с группой пользователя, разрешение группы определяет доступ.
  • Если пользователь не является владельцем файла и не входит в группу, используется другое разрешение.

Я также узнал, что у вас есть следующие разрешения:

  • читать ( r)
  • написать ( w)
  • выполнить ( x)

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

mkdir test

Затем я сделал несколько тестов:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Поработав некоторое время, я думаю, что я наконец понял, chmodкак вы устанавливаете разрешение с помощью этой команды.


Но...

У меня еще есть несколько вопросов:

  • Что означает dв начале?
  • Как называется и как используется содержащий слот и какие другие значения он может содержать?
  • Как я могу установить и сбросить это?
  • Какова ценность для этого d? (Поскольку у вас есть только 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • Почему люди иногда используют 0777вместо того, 777чтобы устанавливать свои разрешения?

Но так как мне не следует задавать несколько вопросов, я постараюсь задать это в одном вопросе.

В системе на основе UNIX, такой как все дистрибутивы Linux, относительно разрешений, что означает первая часть ( d) и как используется эта часть разрешений?

Питер
источник
3
Пожалуйста, в следующий раз постарайтесь задать только один вопрос, множественные вопросы, как правило, плохо подходят для ссылок и почти никогда не рассматриваются одновременно.
Киви
1
@Kiwy Извините, я думал, что сделаю это так, потому что это касается той же темы. Если вы хотите, вы можете предложить лучший заголовок для моего вопроса, чтобы улучшить его справку.
Питер
1
Кстати, значение для «d» - 040000 - его можно найти в заголовочных файлах под именем S_IFDIR. Вы не используете его при настройке режима файла, но stat()функция фактически возвращает значение 040750 для drwxr-x---.
Random832
2
@jamesqf На самом деле, теперь, когда я понимаю, как восьмеричные коды отображаются, мне проще думать об этом.
HalosGhost
4
@Peter: нет глупых вопросов - только глупые, которые не учатся, потому что они боятся задавать вопросы.
Mgarciaisaia

Ответы:

117

Я отвечу на ваши вопросы в трех частях: типы файлов, разрешения и варианты использования для различных форм chmod.

Типы файлов

Первый символ в ls -lвыводе представляет тип файла; dозначает, что это каталог. Его нельзя установить или отключить, это зависит от того, как был создан файл. Вы можете найти полный список типов файлов в документации по ls ; те, кого вы можете встретить

  • -: «Обычный» файл, созданный любой программой, которая может записать файл
  • b: блокировать специальный файл, как правило, дисковые устройства или устройства с разделами, можно создать с помощью mknod
  • c: символьный специальный файл, также может быть создан с помощью mknod(см. /devпримеры)
  • d: каталог, может быть создан с mkdir
  • l: символическая ссылка, может быть создана с ln -s
  • p: именованная труба, может быть создана с mkfifo
  • s: сокет, может быть создан с nc -U
  • D: door , созданная некоторыми серверными процессами в Solaris / openindiana.

права доступа

chmod 0777используется для установки всех разрешений в одном chmodисполнении, а не для объединения изменений u+и т. д. Каждая из четырех цифр представляет собой восьмеричное значение, представляющее набор разрешений:

  • suid, sgidИ «липкие» (см ниже)
  • пользовательские разрешения
  • групповые разрешения
  • «Другие» разрешения

Восьмеричное значение рассчитывается как сумма разрешений:

  • «Читать» 4
  • «Написать» 2
  • «Выполнить» - 1

Для первой цифры:

  • suid4; бинарные файлы с установленным битом запускаются от имени их владельца (обычно root)
  • sgid2; бинарные файлы с этим набором битов запускаются в качестве группы их владельцев (это использовалось для игр, поэтому можно делиться высокими результатами, но это часто представляет угрозу безопасности в сочетании с уязвимостями в играх), а файлы, созданные в каталогах с этим набором битов, принадлежат группа владельцев каталога по умолчанию (это удобно для создания общих папок)
  • «Липкий» (или «ограниченное удаление») равен 1; файлы в каталогах с этим набором битов могут быть удалены только их владельцем, владельцем каталога или root(см. /tmpобщий пример этого).

Смотрите на chmodстраницу руководства для деталей. Обратите внимание, что во всем этом я игнорирую другие функции безопасности, которые могут изменять права пользователей на файлы (SELinux, файловые ACL ...).

Специальные биты обрабатываются по-разному в зависимости от типа файла (обычный файл или каталог) и базовой системы. (Это упомянуто на chmodman-странице.) В системе, которую я использовал для тестирования (с coreutils8.23 на ext4файловой системе, работающей под ядром Linux 3.16.7-ckt2), поведение выглядит следующим образом. Для файла специальные биты всегда очищаются, если явно не установлено, что chmod 0777эквивалентно chmod 777, и обе команды очищают специальные биты и дают всем полные права доступа к файлу. Для каталога специальные биты никогда полностью не очищаются с использованием четырехзначной числовой формы, поэтому фактически chmod 0777эквивалентенchmod 777но это вводит в заблуждение, поскольку некоторые специальные биты останутся как есть. (В предыдущей версии этого ответа это неправильно.) Чтобы очистить специальные биты в каталогах, которые вы должны использовать u-s, g-sи / или o-tявно, или указать отрицательное числовое значение, chmod -7000то есть очистите все специальные биты в каталоге.

В ls -lвыходе suid, sgidи «липкие» появляются в месте xвхода: suidэто sили Sвместо пользователя x, sgidявляется sили Sвместо группы - х x, и «липкий» является tили Tвместо других x. Строчная буква означает, что установлены как специальный бит, так и исполняемый бит; заглавная буква означает, что установлен только специальный бит.

Различные формы CHMOD

Из-за поведения, описанного выше, использование полных четырех цифр chmodможет ввести в заблуждение (по крайней мере, оказалось, что я запутался). Это полезно, когда вы хотите установить специальные биты, а также биты прав доступа; в противном случае биты очищаются, если вы манипулируете файлом, сохраняются, если вы манипулируете каталогом. Так что chmod 2750гарантирует, что вы получите по крайней мере sgidи точно u=rwx,g=rx,o=; но chmod 0750не обязательно очищать специальные биты.

Использование числовых режимов вместо текстовых команд ( [ugo][=+-][rwxXst]), вероятно, является скорее привычкой и целью команды. Когда вы привыкли использовать числовые режимы, часто проще просто указать полный режим таким образом; и полезно иметь возможность думать о разрешениях, используя числовые режимы, так как многие другие команды могут использовать их ( install, mknod...).

Некоторые текстовые варианты могут пригодиться: если вы просто хотите убедиться, что файл может быть выполнен кем-либо, это chmod a+xбудет сделано независимо от того, какие есть другие разрешения. Аналогичным образом, +Xдобавляет разрешение на выполнение, только если одно из разрешений на выполнение уже установлено или файл является каталогом; это может быть удобно для восстановления разрешений в глобальном масштабе без необходимости обращаться к специальным файлам v. каталогам. Таким образом, chmod -R ug=rX,u+w,o=это эквивалентно применению chmod -R 750ко всем каталогам и исполняемым файлам и chmod -R 640ко всем другим файлам.

Стивен Китт
источник
Хотя другие ответы были довольно хорошими, вы действительно потратили некоторое время, отвечая на этот вопрос. Благодарю.
Питер
На * BSD каталоги ведут себя так, как будто их sgidбит был установлен всегда, независимо от его фактического значения. Во FreeBSD suidбит может быть сконфигурирован для работы аналогично sgid(то есть файлы и подкаталоги, созданные внутри, будут иметь того же владельца, что и каталог), при условии, что базовая файловая система это поддерживает и монтируется с suiddirопцией.
lcd047
« +Xдобавляет разрешение на выполнение только в том случае, если одно из разрешений на выполнение уже установлено или файл является каталогом» спасибо @ stephen-kitt, отсутствует документация «уже установлено», которая действительно заставила меня задуматься !
Райан Фишер
39

Итак, разрешения в Linux очень важны. Я постараюсь сделать краткое объяснение.

Для кусков файлового режима

Каждый файл Unix имеет набор разрешений, которые определяют, можете ли вы читать, записывать или запускать файл. Запуск ls -l отображает права доступа. Вот пример такого дисплея:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Я прикрепляю изображение кусочков файлового режима:

введите описание изображения здесь

Типа может быть другая вещь. Например:

  • д (каталог)
  • с (символьное устройство)
  • л (символическая ссылка)
  • p (именованная труба)
  • с (гнездо)
  • б (блочное устройство)
  • D (дверь, не распространенная в системах Linux, но была портирована)

Если вы хотите установить некоторые разрешения для всех каталогов, вы можете использовать атрибут R, например:

chmod -R 777 /some/directory/

Для chmod 777 против 0777

Команда chmodобычно ожидает, что ввод будет восьмеричным числом, начальный ноль относится к значению триплета битов sticky / sgid / suid. Однако в Си это будет иметь значение, поскольку 777будет переведено в 01411(восьмеричное), таким образом, установив бит закрепления (см. chmod(2)Страницу руководства ), разрешения на чтение для владельца и исполняемый бит для группы и других (что является довольно странной комбинацией) ,

РЕДАКТИРОВАТЬ 1

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

ValeriRangelov
источник
5
Вы ошибаетесь в отношении 777 против 0777. Оба являются восьмеричными (в данном случае десятичная дробь не имеет никакого смысла), но в четырехзначной форме первая цифра устанавливает специальные биты (sticky & setuid).
Орион
3
@orion Иногда это действительно так, например, в C-подобном коде chmod(777)фактически будет эквивалент выполнения chmod 1411(т. е. chmodкоманда с аргументом 1411).
Петер
2
... что в случае системного вызова (или его оболочки) и двоичного файла, имеющего одно и то же имя, может быть немного запутанным.
Петер
3
Python Master Race решить эту обратную задачу, запретив все «номера» , которые начинаются с 0, заставляя пользователю быть явным , если они хотят что - либо, кроме десятичной, например шестигранные: 0x1FFдвоичный: 0b111111111или восьмеричное: 0o777. PYTHON POWER
Ник Т
Источник изображения?
rugk
10

dозначает, что это каталог, если у вас есть файл, -и если это ссылка, вы найдете l. Это не может быть установлено / не установлено.

Если вы используете 0777 в качестве разрешений, вы даете полный контроль (чтение + запись + выполнение) каждому пользователю / группе системы. Это ленивый способ решения проблем, когда у вас есть пользователи / группы, которые не имеют доступа к каталогам / файлам.

Например, если вы перечислите содержимое каталога и получите это:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so - файл, принадлежащий пользователю root и группе root. Владелец имеет чтение и запись, то группа имеет только доступ для чтения и любой другой пользователь имеет доступ на чтение. Это можно перевести как 644.

Если я изменю его на 777, он будет выглядеть так:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so

jcbermu
источник
7

Получив ответ на мой вопрос и проведя некоторое исследование результатов, я нашел статью, в которой все очень хорошо объясняется. Я хотел бы поделиться некоторыми частями этой статьи здесь для будущих ссылок.

Разрешения на просмотр

Чтобы chmodизменить права доступа к файлу или каталогу, вам сначала необходимо узнать, какой режим доступа используется в данный момент. Вы можете просмотреть содержимое каталога в терминале по cdэтому каталогу, а затем использовать:

$ ls -l

-lПереключатель имеет важное значение , потому что использование lsбез него будет отображать только имена файлов или папок в каталоге.

Ниже приведен пример использования ls -lв моем домашнем каталоге:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

Что означают столбцы

Первый столбец - это тип каждого файла:

  • - обозначает нормальный файл.
  • d обозначает каталог, то есть папку, содержащую другие файлы или папки.
  • p обозначает именованный канал (он же FIFO).
  • l обозначает символическую ссылку.

Буквы после этого обозначают права доступа, этот первый столбец - то, что нас больше всего интересует. Второй - сколько ссылок в файле, мы можем смело игнорировать его. Третий столбец имеет два значения / имени: Первый (в моем примере 'peter') - это имя пользователя, которому принадлежит файл. Второе значение (в данном примере «пользователи») - это группа, к которой принадлежит владелец (Подробнее о группах).

Следующий столбец - это размер файла или каталога в байтах и ​​информация, после которой указаны даты и время последнего изменения файла или каталога, и, конечно же, имя файла или каталога.

Что означают разрешения

Первые три буквы, после первой -или d, - это разрешения, которые есть у владельца. Следующие три буквы - это разрешения, которые применяются к группе. Последние три буквы - это разрешения, которые применяются ко всем остальным.

Каждый набор из трех букв состоит из r wи x. rвсегда в первой позиции, wвсегда во второй позиции и xвсегда в третьей позиции. rэто разрешение на чтение, это разрешение wна запись и разрешение xна выполнение. Если -вместо одной из этих букв есть дефис ( ), это означает, что разрешение не предоставлено, а если письмо присутствует, оно предоставляется.

Папки

В случае папок биты режима можно интерпретировать следующим образом:

  • r (чтение) означает способность читать оглавление данного каталога,
  • w(запись) означает возможность записи оглавления данного каталога (создание новых файлов, папок; переименование, удаление существующих файлов, папок) тогда и только тогда, когда установлен бит выполнения. В противном случае это разрешение не имеет смысла.
  • x (выполнить) означает возможность войти в данный каталог с помощью команды cd и получить доступ к файлам, папкам в этом каталоге.

Изменение прав доступа с помощью команды chmod

chmodэто команда в Linux и других Unix-подобных операционных системах. Это позволяет вам изменять права доступа (или режим доступа) к файлу или каталогу.

Вы можете изменить разрешения двумя различными способами: - на основе текста - на основе chmod номераchmod

Текстовый метод

Чтобы изменить права доступа или режим доступа к файлу, мы используем команду chmod в терминале. Ниже приведена общая структура команды:

chmod who=permissions filename

Где Кто-нибудь из ряда букв, и каждое означает, кому вы собираетесь дать разрешение. Они заключаются в следующем:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

Права доступа являются такими же , как уже обсуждалось ( r, wи x).

Команда chmod позволяет нам добавлять и вычитать разрешения из существующего набора, используя + или - вместо =. Это отличается от приведенных выше команд, которые, по сути, переписывают разрешения (т. Е. Для изменения разрешения с r--на rw-, вам все равно нужно включить в команду, rа также wпосле нее . Если вы пропустили это , оно отнимает разрешение как они переписываются с помощью =. Использование + и - избегайте этого, добавляя или убирая из текущего набора разрешений).=chmodrr

Числовой метод

chmod Также можно установить разрешения, используя цифры.

Использование чисел - это еще один метод, который позволяет редактировать разрешения для всех трех владельцев, групп и других пользователей одновременно. Эта базовая структура кода такова:

chmod xxx file/directory

Где xxx - это трехзначное число, где каждая цифра может быть от 1 до 7. Первая цифра относится к разрешениям для владельца, вторая цифра относится к разрешениям для группы, а третья цифра применяется к разрешениям для всех остальных.

В этой числовой записи значения r, w и x имеют свои собственные числовые значения:

r=4
w=2
x=1

Чтобы придумать трехзначное число, вам нужно подумать, какие разрешения вы хотите иметь у владельца, группы и пользователя, а затем суммировать их значения. Например, скажем, я хотел предоставить владельцу каталога права на чтение и запись и выполнение, а я хотел, чтобы у группы и всех остальных были только права на чтение и выполнение. Я бы придумал числовые значения примерно так:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Это эквивалентно использованию следующего:

chmod u=rwx filename
chmod go=rx filename

Для большинства папок / каталогов установлено значение 755, чтобы разрешить чтение и запись и выполнение владельцу, но запретить запись для всех остальных, а файлы обычно 644, чтобы разрешить чтение и запись для владельца, но только чтение для всех остальных, обратитесь к последнему обратите внимание на отсутствие разрешений x для неисполняемых файлов - здесь то же самое.

Peter
источник
Просто копировать текст из другой статьи - по крайней мере - грубо. Возможно также нарушение авторских прав. Если он не только скопирован или вы действительно использовали мелкие детали (защищенные авторским правом благодаря добросовестному использованию), пожалуйста, по крайней мере, добавьте ссылку на статью, на которую вы ссылаетесь / цитируете.
rugk
0

Для д вопросов

Это говорит вам тип файла Unix. По умолчанию Unix имеет только 3 типа файлов. Они есть:

  • - - обычный файл
  • d - Каталог файлов
  • Специальный файл (с 5 подтипами):
    • b - заблокировать файл
    • c - файл символьного устройства
    • p - Файл именованного канала или просто файл канала
    • l - Символическая ссылка
    • s - файл сокета

Подробнее здесь: Типы файлов в Linux / Unix подробно описаны

0777 против 777

Липкий бит указан или нет. Когда установлен липкий бит каталога, файловая система обрабатывает файлы в таких каталогах особым образом, так что только владелец файла, владелец каталога или пользователь root могут переименовывать или удалять файл. Без установленного фиксированного бита любой пользователь с разрешениями на запись и выполнение для каталога может переименовывать или удалять содержащиеся в нем файлы независимо от владельца файла.

0777 устанавливает права доступа к файлу 777, а бит закрепления равен 0 - специальных режимов нет.

777 устанавливает права доступа к файлу 777, не изменяя прилипший бит.

Читать подробнее: sticky bit и chmod

CSNY
источник
2
Лучше: но это все еще не предлагает ничего, что другие ответы еще не покрыли ...
jasonwryan
1
(1) Существует три основных типа файлов: простые файлы, каталоги и все остальное. Какая? Где ты это взял? В отличной схеме простые файлы и каталоги очень похожи. Именованные каналы и символические ссылки больше похожи на простые файлы и каталоги, чем на файлы устройств или сокеты. (2) Вы думаете chmod 777, не очищает setuid, setgid и липкие биты? Попробуй.
G-Man
Unix имеет 7 типов файлов, а не 3.
wjandrea