Linux - многопользовательская система, причем она изначально разрабатывалась многопользовательской. Во всем мире миллионы устройств работают на каком-либо дистрибутиве (в каком-то роде можно это назвать версией) Linux. В том числе подавляющее большинство серверов, и даже Android, установленный на миллионах смартфонах - это Linux (т.к. в его состав входит ядро Linux). Так как же изменить права доступа к определенным файлам?
Для этого существует утилита chmod (change mode), которая позволяет изменить права для владельца, группы и других пользователей на какой-либо файл. Но давайте по порядку.
Категории пользователей в Linux
1. В Linux главным пользователем, которых имеет полный доступ ко всем файлам, является суперпользователь (администратор) или root-пользователь. Не важно какие права доступа установлены на файл или директорию (а директория, как мы помним из предыдущей статьи "типы файлов" - это тоже файл), root-пользователь всегда имеет полные права на все файлы.
2. Владелец файла - изначально это тот, кто создал файл. Но владельца файла можно позже поменять. Владелец файла может быть только один.
3. Группа файла - изначально это группа владельца файла, но ее можно легко поменять на любую другую группу.
4. Остальные пользователи - это те, кто не относится к предыдущим 3 категориям.
Какие есть права доступа
есть 3 основных права:
* чтение - есть возможность увидеть содержимое файла
* изменение - запись, изменение имени, удаление
* выполнение - файл можно запустить (актуально для программ)
Но в какой-то момент стало понятно, что недостаточно этих прав, поэтому в 1979 г. были разработаны 3 дополнительных права доступа:
* SUID (set user ID upon execution - установка ID владельца файла во время его выполнения) - разрешить какому-либо пользователю выполнение файла от имени суперпользователя (только выполнение)
* SGID (set group ID upon execution - установка ID группы во время выполнения; имеется ввиду ID той группы, которой присвоен доступ к файлу) - разрешить какой-либо группе выполнение от имени суперпользователя. Если SGID установлен на папку, все файлы созданные в ней будут связаны с группой этой папки, а не с пользователем. Такое поведение используется для организации общих папок
* sticky-bit - используется почти только для каталогов; благодаря нему каждый может читать, изменять, добавлять, выполнять и удалять свои файлы в каталог, но не может изменять и удалять файлы других пользователей. Например, папка /tmp как раз имеет такой флаг. Этот флаг также используется для организации общих папок
sticky-bit был разработан еще в 1974 году, другие 2 дополнительных права были разработаны Денисом Ритчи - одним из разработчиков Си, на котором позже и было написано Линусом Торвальдсом ядро Linux.
Вообще благодаря SUID и SGID, операционная система в некоторой степени Linux стала более уязвима
Как посмотреть права для определенного файла
Для этого можно воспользоваться утилитой ls
У этой команду можно вызывать с опциями:
- -l вывести файлы в виде списка (с доп. информацией о файле: тип файла и права доступа, владелец файла, группа файла, размер, дата создания и название )
- -а вывести все файлы, в т.ч. скрытые
- -h показать размер файла в удобном виде (например не в виде 29902, а как 29 Кбайт)
- -i показать иноду файла (индексный номер файла; почти каждому файлу присваивается уникальное число, чтобы его было проще найти)
Опции можно комбинировать. Таким образом, чтобы вывести все файлы в папке (скрытые тоже) вместе с информацией о файлах нужно выполнить:
ls -la
Интерпретация выведенной информации
остальные 9 позиций разделены поровну на 3 категории пользователей - владельца, группы и остальных.
Для владельца (2-4 позиция):
r (read)
w (write)
x (execute) или s (SUID)
Для группы (5-7 позиция):
r (read)
w (write)
x (execute) или s (SGID)
Для остальных (8-10 позиция):
r (read)
w (write)
x (execute) или t (sticky-bit)
Примеры
В этих примерах мы не будем учитывать первую позицию, отведенную под тип файла (об этом можно прочитать тут).
Если видим такую последовательность:
r w - r w - r - -
это означает, что владелец может читать и изменять файл; группа может тоже читать и изменять; остальные пользователи тоже могут только читать (характерно для созданных обычных файлов)
Если такая последовательность:
r w x - - x - - x
значит владелец имеет все права, а группу и остальные могут только выполнять файл (обычно такие права ставят для программ, написанных каким-либо пользователем)
Если такая:
r w x r w x r w x
то у всех есть полные права (это характерно для символьных ссылок на файлы)
Если такая:
- - - - - - - - -
это значит, что ни у кого нет никаких прав на этот файл. Работать с такими файлами может только суперпользователь, как мы помним, у него есть все права на все файлы, не зависимо от установленных флагов доступа
Как поменять права доступа + примеры
Итак, чтобы дать файлу права нужно прописать
chmod <опции> <для кого изменяем права><+ или -><набор прав> <файл(ы)>
для кого изменяем права: u (user = владелец файла), g (group), o (other)
добавить/отнять: + (добавить права) или - (отнять права)
Набор прав: r (read), w (write), x (execute), s (SUID или SGID), t (sticky-bit)
Можно одновременно писать несколько категорий для кого меняем права и несколько флагов прав
Опции для chmod
Рассмотрим только 2 наиболее часто требующиеся опции:
-R применить рекурсивно
-v выводить максимум информации
Пример
создадим 9 файлов и применим к ним разные права
займемся изменением прав:
file1.txt - владельцу дали право на выполнение
file2.txt - владельцу, группе и остальным убрали все права (чтение, изменение, выполнение)
file3.txt - группе и остальным убрали все права
file4.txt - остальным убрали все права (т.к. у остальных было право только на чтение, можно было бы сделать o-r)
file5.txt - сначала пользователю и группе дали право на выполнение, а затем у остальных убрали право на чтение
Теперь изменим права для каталогов, это делается точно также. В случае с текстовыми файлами, мы не применяли специальные права, давайте это сделаем с папками
Кстати, забыл сказать, что с помощью знака "равно" можно назначить только заданные права.
Допустим у файла были права r w x r w - r - -
если выполнить команду chmod ugo=x <file>
то у файла будут следующие права - - x - - x - - x
Итого касательно директорий
* если у директории убрать флаг r, то в нее можно будет попасть и создавать там файлы, но нельзя будет посмотреть ее содержимое
* если у директории убрать флаг w, то нельзя будет создавать файлы в директории (и переносить их туда/оттуда), а также удалять оттуда файлы, хотя копировать оттуда можно, при этом имя папки менять можно (если стоит флаг x), но удалить директорию нельзя
* если у директории убрать флаг x, то в папку невозможно будет зайти, но можно посмотреть что в ней лежит, хотя дополнительную информацию о файлах в ней (права доступа, когда создана и пр.) посмотреть нельзя будет, также нельзя будет перемещать или копировать файлы в нее/из нее или удалять файлы в ней (т.е. по сути работает как флаги x + w ) и саму папку тоже нельзя будет удалить, но можно поменять ее имя
на этом все!
P.S.: есть еще циферные коды для смена прав на файл, скажите, нужно ли об этом рассказать отдельно?