Команда chmod

В UNIX-подобных операционных системах файл ассоциируется с набором свойств, который позволяет разграничить спектры потенциальных действий его владельца и всех остальных пользователей. Этот набор свойств называется правами доступа, а команда chmod позволяет вызывать соответствующую утилиту для его модификации.

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

В UNIX пользователи, которые могут потенциально работать с файлом, разделяются на три группы, причем каждой из групп соответствуют свои права доступа. Этими группами являются:

  • владелец файла (user) — тот пользователь, который создал его.
  • группа владельцев файла (group) — другие пользователи, которые имеют такие же права, как и создавший файл пользователь.
  • все остальные пользователи (other).

Для обозначения этих групп обычно используются буквы u, g и o соответственно.

В соответствии с описанным разделением, файл может быть:

  • читаемым (readable) — содержимое файла может быть просмотрено.
  • записываемым (writeable) — содержимое файла может быть модифицировано.
  • исполняемым (executable) — бинарный файл может быть исполнен.

Для обозначения этих состояний также используются буквы r, w и x соответственно.

Другими атрибутами являются:

  • бит suid или sgid, обозначаемый с помощью буквы s.
  • бит sticky, обозначаемый с помощью буквы t (используется крайне редко).

Нотация

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

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

Буквенная нотация

Предположим, что требуется установить права доступа, позволяющие читать и модифицировать файл пользователям из группы его владельцев. В этом случае может использоваться следующая нотация:

g+rw

Или предположим, что файл могут читать, модифицировать и исполнять все пользователи, а нам нужно ограничить доступ к нему со стороны этих пользователей:

o-rwx

В общем, описание прав доступа начинается с символа, соответствующего типу группы пользователей, затем идет символ + для установки или символ - для снятия прав доступа, после чего описание заканчивается последовательностью символов, соответствующей правам доступа.

Числовая нотация

Числовое представление прав доступа имеет формат группы восьмеричных значений. В первую очередь вам следует уяснить, что каждое из шестнадцатеричных значений соответствует блоку из четырех двоичных значений, а каждое из восьмеричных значений — блоку из трех двоичных значений.

Также следует помнить о том, что при использовании команды ls -l права доступа к файлу выводятся в следующем формате:

-rwxr-xr-x    1 yourusername     yourgroup           19 Oct 22 09:25 yourfile

Описание прав доступа -rwxr-xr-x в данном случае может рассматриваться как блок двоичных значений или битовое поле. После преобразования его в восьмеричное значение можно получить 0755, а в двоичное — 0111101101.

Мы можем представить права каждой группы пользователей с помощью отдельного восьмеричного значения.

Значение Представление Комментарий
400 -r-------- Владелец может читать файл
040 ----r----- Участники группы владельцев могут читать файл
004 -------r-- Все остальные пользователи могут читать файл
200 --w------- Владелец может модифицировать файл
020 -----w---- Участники группы владельцев могут модифицировать файл
002 --------w- Все остальные пользователи могут модифицировать файл
100 ---x------ Владелец может исполнять файл
010 ------x--- Участники группы владельцев могут исполнять файл
001 ---------x Все остальные пользователи могут исполнять файл
4000 s--------- Для файла установлен бит suid
2000 s--------- Для файла установлен бит sgid
1000 t--------- Для файла установлен бит sticky

Эти числовые значения сами по себе не очень-то полезны, но мы можем складывать их для формирования числовых представлений прав доступа. Например, значение 4, соответствующее праву чтения (r--) для одной из групп пользователей и значение 2, соответствующее праву записи (-w-) опять же для одной из групп пользователей могут в сумме дать значение 6 или 100 в двоичном представлении, которое будет соответствовать правам чтения и записи. Также следует понимать, что в группе из трех восьмеричных чисел «место» каждого числа указывает на группу пользователей. Например, при установке восьмеричного значения прав доступа 600 или 0110000000 в двоичном представлении пользователь сможет читать и модифицировать файл, а участники группы владельцев и все остальные пользователи не смогут сделать с ним ничего. При установке восьмеричного значения прав доступа 060 или 0000110000 в бинарном представлении аналогичные права получат уже участники группы владельцев файла и так далее.

Например, если нам нужно разрешить чтение и модификацию файла владельцу и участникам группы владельцев и при этом запретить доступ к файлу всем остальным пользователям, мы можем использовать значение прав доступа 660.

Стоит упомянуть и о дополнительных битах: если четвертая цифра отброшена, chmod не будет изменять их значения. Для сброса битов suid, sgid и sticky вам придется добавить в начало значения прав доступа цифру 0.

Примеры использования

Установка прав доступа

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

$ chmod g+rwx <имя файла>

Или следующим образом, если вам нравится числовая нотация:

$ chmod 755 <имя файла>

Числовое значение прав доступа 755 может быть преобразовано в двоичное значение 0111101101, а также в буквенное представление -rwxr-xr-x и позволяет всем пользователям читать и исполнять файл, при этом участники группы владельцев и все остальные пользователи не могут модифицировать его.

Рекурсивная установка прав доступа

Команда chmod может использоваться для рекурсивной установки прав доступа для файлов и директорий из любого фрагмента дерева файловой системы, то есть, установки одних и тех же прав доступа для всех файлов из директории и ее поддиректорий благодаря поддержке параметра -R. Например, команда

$ chmod -R 755 *

позволяет установить права доступа 755 для всех файлов из текущей директории.

Ограничение доступа третьих лиц к файлам из домашних директорий пользователей

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

# cd /home; chmod -R 750 *

позволяет осуществлять доступ к файлам из домашних директорий лишь их непосредственным владельцам.