Chmod

Программа chmod предназначена для изменения прав доступа к файлам.

chmod [параметры] права файл...
Внимание! В Linux нет права на изменение права. Поэтому хозяин файла всегда может изменять права доступа на свои и только свои файлы. Суперпользователь может менять права доступа у любых файлов в системе.

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

Числовой формат записи прав доступа

Числовой формат записи наиболее распространен, но он труден для понимания тем, кто начинает работу с Linux. Вам обязательно придется его изучить, так как числовой формат используется для указании прав доступа в литературе по Linux.

Права доступа — это биты в inode файла. Биты делятся на три группы, каждую группу представляют в виде десятичного числа.

Возьмем одну группу бит и запишем таблицу преобразования из двоичного в десятичный форматы:

r w x
0 0 1 1
0 1 0 2
1 0 0 4

Теперь, чтобы определить права доступа, достаточно воспользоваться приведенной таблицей. Например, правам доступа r-- соответствует число 4, правам r-x соответствует число 4+1=5 и т.д.

Для облегчения понимания приведу полную таблицу преобразования:

r w x
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

Поскольку мы имеем три группы бит, в результате получается три числа. Например:

rw-rw---- — 660
rwxr-x--x — 751
rwxrwxrwx — 777

В первом примере первая 6 — это права доступа хозяина файла, вторая 6 — права доступа группы, которой принадлежит файл, а 0 — это права доступа всех остальных пользователей системы.

При вызове программы chmod можно указывать не все три числа. Тогда числа начинают считаться справа. Например:

$ ls -l test
-rw-r--r--  1 artur users 12 2005-06-06 11:53 test
$ chmod 6 test
$ ls -l test
------rw-  1 artur users 12 2005-06-06 11:53 test
$

установит права rw- для всех остальных пользователей системы. А следующая программа:

$ chmod 66 test
$ ls -l test
----rw-rw-  1 artur users 12 2005-06-06 11:53 test
$

установит права rw- для группы и для всех остальных пользователей системы.

Символьный формат записи прав доступа

Символьный формат прав доступа можно описать при помощи следующего шаблона:

[ugoa][[+-=][rwxst]][,...]
  • u — права пользователя.
  • g — права группы.
  • o — права всех остальных.
  • a — права пользователя, группы и всех остальных.
  • + — установить бит в единицу.
  • — установить бит в ноль.
  • = — установить три бита.
  • r — бит r.
  • w — бит w.
  • x — бит x.
  • s — SUID или SGID бит (о них будет рассказано ниже).
  • t — stiky бит (об этом праве будет рассказано ниже).

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

$ ls -l test
-rw-rw—-  1 artur users 12 2005-06-06 11:53 test
$ chmod o+r file
$ ls -l test
-rw-rw-r--  1 artur users 12 2005-06-06 11:53 test
$

Права стали такими: rw-rw-r--. Как видно, был изменен всего лишь один бит. Таким же образом можно сбрасывать биты в ноль:

$ chmod g-w test
$ ls -l test
-rw-r--r--  1 artur users 12 2005-06-06 11:53 test
$

Можно одновременно изменять права для, например, хозяина и группы:

$ chmod ug+x test
$ ls -l test
-rwxr-xr--  1 artur users 12 2005-06-06 11:53 test*
$

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

$ chmod o=rw test
$ ls -l test
-rwxr-xrw-  1 artur users 12 2005-06-06 11:53 test*
$

Если не удается записать изменения прав при помощи одной записи, их можно написать несколько. В качестве символа разделителя используют запятую.

$ chmod o-rw,g-r test
$ ls -l test
-rwx--x---  1 artur users 12 2005-06-06 11:53 test*
$

Копирование прав доступа

В новой версии программы chmod появился параметр --reference. При помощи reference можно указать файл, права доступа которого будут копироваться на другие файлы.

$ ls -l
итого 0
-rw-r--r--  1 artur users 0 2005-06-07 12:21 newtest
-rwx--x---  1 artur users 0 2005-06-07 12:20 test*
$ chmod --reference=newtest test
$ ls -l
итого 0
-rw-r--r--  1 artur users 0 2005-06-07 12:21 newtest
-rw-r--r--  1 artur users 0 2005-06-07 12:20 test
$