среда, 9 декабря 2009 г.

Управление разрешениями и атрибутами файлов в Linux/Unix.

В этой статье расскажу как управлять разрешениями на файлы и папки в linux/unix. Речь пойдет о командах chmod, chown и chgrp. Так же рассмотрю комбинацию команд find и chmod.

Синтаксис команды chown (Change OWNer - изменить владельца):

chown [опции] пользователь[:группа] файл...

Основные опции:

-R: Рекурсивное изменение владельца каталогов и их содержимого.
-v: Подробное описание действия (или отсутствия действия) для каждого файла.
-c: Подробно описывать действие для каждого файла, владелец которого действительно изменяется.

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

chown www /www/mysite.ru/html: изменяет владельца папки /www/mysite.ru/html на www
chown root:adm /www/mysite.ru/html/index.php: изменяет владельца файла /www/mysite.ru/html/index.php на root и группу на adm
chown -Rc user:media *.mp3 karaoke/: изменяет владельца всех файлов в текущем каталоге, чьи имена заканчиваются на .mp3, и всех файлов и подкаталогов в каталоге karaoke/ на пользователя user и группу media, сообщая только о тех файлах, которые были затронуты командой.

Синтаксис команды chgrp (CHange GRouP - изменить группу) очень похож на синтаксис команды chown:

chgrp [опции] группа файл...

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

chgrp www /www/mysite.ru/html: изменяет группу-владельца папки /www/mysite.ru/html на www
chgrp adm /www/mysite.ru/html/*.php: изменяет группу-владельца всех php файлов в папке /www/mysite.ru/html/ на adm

Синтаксис команды chmod (CHange MODe - изменить режим):

chmod [опции] режим файл...

-c, --changes: Подробно описывать действия для каждого файла, чьи права действительно изменяются.
-f, --silent, --quiet: Не выдавать сообщения об ошибке для файлов, чьи права не могут быть изменены.
-v, --verbose: Подробно описывать действие или отсутствие действия для каждого файла.
-R, --recursive: Рекурсивное изменение прав доступа для каталогов и их содержимого.

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

Формат символьного режима таков:
`[ugoa...][[+-=][rwxXstugo...]...][,...]'.

Каждый аргумент -- это список символьных команд изменения прав доступа, разделенных запятыми. Каждая такая команда начинается с нуля или более букв `ugoa', комбинация которых указывает, чьи права доступа к файлу будут изменены: пользователя, владеющего файлом (u); других пользователей в данной группе (g); других пользователей, не входящих в данную группу (o) или же всех пользователей (a). Буква `a' эквивалентна `ugo'. Если не задана ни одна буква, то автоматически будет использоваться буква `a', но биты, установленные в umask, не будут затронуты.

Оператор `+' добавляет выбранные права доступа к уже имеющимся у каждого файла; `-' удаляет эти права; а `=' присваивает только эти права каждому указанному файлу.

Буквы `rwxXstugo' выбирают новые права доступа для пользователя, заданного одной из букв `ugoa': чтение (r); запись (w); выполнение (или доступ к каталогу) (x); выполнение, если файл является каталогом или уже имеет право на выполнение для какого-нибудь пользователя (X); setuid- или setgid-биты (s); sticky-бит (t); установка для остальных таких же прав доступа, которые имеет пользователь, владеющий этим файлом (u); установка для остальных таких же прав доступа, которые имеет группа файла (g); установка для остальных таких же прав доступа, которые имеют остальные пользователи (не входящие в группу файла) (o). (Так, `chmod g-s file' снимает бит set-group-ID (sgid), `chmod ug+s file' устанавливает биты suid и sgid, в то время как `chmod o+s file' ничего не делает).

`sticky-бит' не описывается в POSIX. Такое специфическое название он получил из-за первоначальной функции, которую он выполнял: сохранял исполняемый код программы на устройстве подкачки. В настоящее время установка sticky-бита для каталога, приводит к тому, что только владелец файла и владелец этого каталога могут удалять этот файл из каталога. (Обычно это используется в каталогах типа /tmp, куда все имеют права на запись).

Числовой режим состоит из не более четырех восьмеричных цифр (от нуля до семи), которые складываются из битовых масок 4, 2 и 1. Любые пропущенные разряды дополняются лидирующими нулями. Первая цифра выбирает установку идентификатора пользователя (setuid) (4) или идентификатора группы (setgid) (2) или sticky-бита (1). Вторая цифра выбирает права доступа для пользователя, владеющего данным файлом: чтение(4), запись (2) и выполнение (1); третья цифра выбирает права доступа для пользователей, входящих в данную группу, с тем же смыслом, что и у второй цифры; и четвертый разряд выбирает права доступа для остальных пользователей (не входящих в данную группу), опять с тем же смыслом.

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

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

chmod -R o-w /www: рекурсивно удаляет разрешение на запись для остальных у всех файлов и подкаталогов в каталоге /www.
chmod -R g+w /www: рекурсивно добавляет разрешение на запись для группы-владельца у всех файлов и подкаталогов в каталоге /www.
chmod -R og-w,o-x folder/: рекурсивно удаляет разрешение на запись для группы и остальных у всего каталога folder/, и удаляет разрешение на выполнение для остальных.
chmod -c 644 misc/file*: изменяет разрешения для всех файлов в каталоге misc/, чьи имена начинаются с file на rw-r--r-- (т.е. разрешение на чтение для всех и разрешение на запись только для владельца), и сообщает только о тех файлах, которые были подвержены действию команды.

Так же chmod можно использовать вместе с командой find для разделения папок и файлов:
Формат такого использования следующий:

find <dir> -type <type> -exec chmod 777 {} \;

Например:

Установка прав только для всех файлов в каталоге /www/html:
find /www/html -type f -exec chmod 640 {} \;

Установка прав только для всех поддиректорий в дирректории /www/html: find /www/html -type d -exec chmod 750 {} \;