Команда chmod Linux
Система полномочий в Linux имеет очень важное значение, поскольку благодаря ей можно разделять привилегии между пользователями, ограничить доступ к нежелательным файлам или возможностям, контролировать доступные действия для сервисов и многое другое. В Linux существует всего три вида прав — право на чтение, запись и выполнение, а также три категории пользователей, к которым они могут применяться — владелец файла, группа файла и все остальные.
Эти права применяются для каждого файла, а поскольку все в системе Linux, даже устройства, считаются файлами, то, получается что эти права применимы ко всему. Мы более подробно рассматривали как работают права доступа к файлам Linux в отдельной статье, а этой, я хочу остановиться на команде chmod, которая используется для установки прав.
Команда chmod Linux
Эта команда имеет типичный для команд linux синтаксис, сначала команда, затем опции, а в конце файл или папка, к которой ее нужно применить:
$ chmod опции права /путь/к/файлу
Сначала рассмотрим какими бывают права доступа linux и как они устанавливаются. Пред этим рекомендую прочитать статью про права, ссылка на которую есть выше. Есть три основных вида прав:
Также есть три категории пользователей, для которых вы можете установить эти права на файл linux:
Синтаксис настройки прав такой:
группа_пользователей действие в ид_прав
В качестве действий могут использоваться знаки «+» — включить или «-« — отключить. Рассмотрим несколько примеров:
- u+x — разрешить выполнение для владельца;
- ugo+x — разрешить выполнение для всех;
- ug+w — разрешить запись для владельца и группы;
- o-x — запретить выполнение для остальных пользователей;
- ugo+rwx — разрешить все для всех;
Но права можно записывать не только таким способом. Есть еще восьмеричный формат записи, он более сложен для понимания, но пишется короче и проще. Я не буду рассказывать как считать эти цифры, просто запомните какая цифра за что отвечает, так проще:
Права на папку linux такие же, как и для файла. Во время установки прав сначала укажите цифру прав для владельца, затем для группы, а потом для остальных. Например, :
- 744 — разрешить все для владельца, а остальным только чтение;
- 755 — все для владельца, остальным только чтение и выполнение;
- 764 — все для владельца, чтение и запись для группы, и только чтение для остальных;
- 777 — всем разрешено все.
Каждая из цифр не зависит от предыдущих, вы вбираете именно то, что вам нужно. Теперь давайте рассмотрим несколько опций команды, которые нам понадобятся во время работы:
- -c — выводить информацию обо всех изменениях;
- -f — не выводить сообщения об ошибках;
- -v — выводить максимум информации;
- —preserve-root — не выполнять рекурсивные операции для корня «/»;
- —reference — взять маску прав из указанного файла;
- -R — включить поддержку рекурсии;
- —version — вывести версию утилиты;
Теперь, когда вы знаете опции и как настраиваются права доступа chmod, давайте рассмотрим несколько примеров как работает команда chmod linux.
Примеры использования chmod
Я не буду приводить много примеров, так как там и так все более-менее понятно после пояснения правил создания выражений установки прав. Сначала самый частый случай — разрешить выполнения скрипта владельцу:
Или можно воспользоваться цифровой записью:
chmod 766 file
ls — l file
Недостаток цифровой записи в том, что вы не можете модифицировать уже существующие права доступа linux. Например, в первом варианте вы просто добавили флаг выполнения для владельца файла, а все остальные права оставили неизменными. В восьмеричном варианте мы полностью заменили текущие права новыми — все для владельца и чтение/запись для группы и остальных. Как видите, права установлены как и ожидалось. Теперь отключим выполнение владельцем:
Дальше разрешим только чтение всем, кроме владельца:
Файлы с правами 000 недоступны никаким пользователям, кроме суперпользователя и владельца. Вернем права обратно:
Такая же ситуация с файлами, владельцем которых вы не являетесь, если вы хотите изменить их права — используйте sudo. Из модификаторов прав вы можете конструировать любые последовательности, я думаю тут нет смысла разбирать их все. Для того чтобы поменять права на все файлы в папке используйте опцию -R:
chmod -R ug+rw dir
ls -l dir/
Также вы можете смотреть подробную информацию про вносимые изменения, например:
Выводы
В этой небольшой статье была рассмотрена команда chmod linux. Она очень часто используется наряду с такими командами, как chown и umask для управления правами. Надеюсь, эта информация была полезной для вас. Если у вас остались вопросы, спрашивайте в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Как изменить права только к файлам/каталогам?
Нужно задать права 755 только для каталогов и отдельно права 644 только для файлов. Как это сделать с помощью chmod?
find -type d -exec chmod 755 '<>' \; find -type f -exec chmod 644 '<>' \;
find -type d -exec chmod 755 <> \; find -type f -exec chmod 644 <> \;
Мне в последнее время больше нравится так:
Да, xargs как-то изящнее, но менее гибко.
Не проще ли find -type d -exec chmod 755 \*
На место «<>» — подставляется имя файла, кавычки нужны для экранирования символов-разделителей вроде пробела.
Не проще ли find -type d -exec chmod 755 \*
У меня такой вариант не работает, поэтому не понял.
Зато портабельнее — своими глазами видел find без exec-а! Честное слово видел! (Аж челюсть выпала — оно-ж даже на 386bsd было. )
man xargs
догадаешься почему — получишь печеньку
Когда мало файлов xargs быстрее, так как для каждого файла не вызывается chmod, это хотите сказать?
а ещё символ ‘ в имени файла
похоже, что без разницы — большой список или нет.
а ещё символ ‘ в имени файла
find -type d -print0 | xargs -0 chmod 755
не распарсил что ты пытался сказать, чем меньше execve — тем быстрее; вот с xargs их намноого меньше
Ок. Полагал, что xargs выполняет команду, только прочитав весь поток целиком.
хм. ну тут кагбе не распараллелишь, ибо всё упрётся в seek-time винта
Я о другом — xargs же разбивает полученный список по группам и для каждой группы выполняет execve->chmod, а не ждёт SIGPIPE/что-то_там и выполняет chmod для всего полученного списка из 100500 файлов.
вы бы прочитали man find, а потом лезли со своими учениями
А, всё, у xargs есть соответствующие ключи -L -n, отвечающие за разбивку. Тогда xargs в любых ситуациях лучше получается.
а если пробел в имени файла, срыватель покровов?
$ find -name "'" -maxdepth 1 -exec chmod -v 0000 <> + права доступа «./'» изменены на 0000 (---------)
$ mv "'" "' > '" $ find -name "'*" -maxdepth 1 | xargs chmod -v 1111 xargs: unmatched одинарная quote; by default quotes are special to xargs unless you use the -0 option $ find -name "'*" -maxdepth 1 -print0 | xargs -0 chmod -v 1111 права доступа «./'\n'» изменены на 1111 (--x--x--t)
$ find -name "'*" -maxdepth 1 -exec chmod -v 0222 <> \; права доступа «./'\n'» изменены на 0222 (-w--w--w-)
а если пробел в имени файла, срыватель покровов?
да хоть \r — УМВР. Сам проверь.
А, всё, у xargs есть соответствующие ключи -L -n, отвечающие за разбивку. Тогда xargs в любых ситуациях лучше получается.
find -name "'*" -maxdepth 1 -print0 | xargs -0 chmod -v 1111 find -name "'*" -maxdepth 1 -exec chmod -v 1111 <> +
А ещё такой вариант. Допустим, на одну из директорий установлены права 0000 и find выдаст ошибку чтения каталога. Тогда и +, и | xargs варианты завершатся с ошибкой и нужно явно вызывать для каждого объекта chmod?
Век живи, век учись. Не знал об x и X
ну если я правильно распарсил документацию — да. Очевидно, что xargs -0 нужно если требуется обработать имена найденных файлов. ИМХО.
Допустим, на одну из директорий установлены права 0000 и find выдаст ошибку чтения каталога. Тогда и +, и | xargs варианты завершатся с ошибкой и нужно явно вызывать для каждого объекта chmod?
нет. Существует 3 порядка (order) обхода дерева:
1. прямой: корень, потом поддеревья/листья.
2. обратный: поддеревья, а потом корень.
3. центрированый. Применяется в бинарных деревьях — левое поддерево — корень — правое. Для ФС не применяется, приходится всё сортировать с нуля.
Так вот, по умолчанию применяется 1й обход. Возможен chmod <> (конечно, если он разрешает права). А с ключом -depth производится 2й обход, и возможно удаление (-delete, -exec rm), и chmod, который запрещает доступ (даже тому, кто обходит).
Век живи, век учись. Не знал об x и X
на практике они очень редко помогают.
Тогда и +, и | xargs варианты завершатся с ошибкой
забыл сказать — xargs НЕ меняет порядок аргументов. В отличие например от *, которая не просто выдаёт список, но его сортирует по алфавиту. По этому, в частности, xargs на больших каталогах намного быстрее, особенно в UTF-8, чем звёздочка.
на практике они очень редко помогают.
Не думаю, что случай ТС-а уникален. У самого часто такая потребность возникала после копирования с флешек c fat.
Не думаю, что случай ТС-а уникален. У самого часто такая потребность возникала после копирования с флешек c fat.
Mount options for fat
(Note: fat is not a separate filesystem, but a common part of the msdos, umsdos and vfat filesystems.)
dmask=value Set the umask applied to directories only. The default is the umask of the current process. The value is given in octal.
fmask=value Set the umask applied to regular files only. The default is the umask of the current process. The value is given in octal.
Спасибо за информацию! Полагаю, что понял всё верно.
Меня вот какой случай интересует. Независимо от порядка обхода дерева очередной элемент дерева может находится в директории, для которой установлены права 0000, но xargs/+ не выполнили для неё chmod 755.
kolan@corka ~/tmp/find $ mkdir -p a/b/c mkdir: создан каталог «a» mkdir: создан каталог «a/b» mkdir: создан каталог «a/b/c» kolan@corka ~/tmp/find $ chmod 0000 a/b/c a/b a права доступа «a/b/c» изменены с 0775 (rwxrwxr-x) на 0000 (---------) права доступа «a/b» изменены с 0775 (rwxrwxr-x) на 0000 (---------) права доступа «a» изменены с 0775 (rwxrwxr-x) на 0000 (---------) kolan@corka ~/tmp/find $ ll . a a/b ls: невозможно получить доступ к a/b: Отказано в доступе .: итого 4 d--------- 3 kolan kolan 4096 апр. 29 12:25 a ls: невозможно открыть каталог a: Отказано в доступе kolan@corka ~/tmp/find $ find -type d -print0 | xargs -0 chmod -v 0777 find: `./a': Отказано в доступе права доступа «.» оставлены в виде 0777 (rwxrwxrwx) права доступа «./a» изменены с 0000 (---------) на 0777 (rwxrwxrwx) kolan@corka ~/tmp/find $ ll . a a/b .: итого 4 drwxrwxrwx 3 kolan kolan 4096 апр. 29 12:25 a a: итого 4 d--------- 3 kolan kolan 4096 апр. 29 12:25 b ls: невозможно открыть каталог a/b: Отказано в доступе kolan@corka ~/tmp/find $ find -type d -exec chmod -v 0777 <> + find: `./a/b': Отказано в доступе права доступа «.» оставлены в виде 0777 (rwxrwxrwx) права доступа «./a» оставлены в виде 0777 (rwxrwxrwx) права доступа «./a/b» изменены с 0000 (---------) на 0777 (rwxrwxrwx) kolan@corka ~/tmp/find $ ll . a a/b .: итого 4 drwxrwxrwx 3 kolan kolan 4096 апр. 29 12:25 a a: итого 4 drwxrwxrwx 3 kolan kolan 4096 апр. 29 12:25 b a/b: итого 4 d--------- 2 kolan kolan 4096 апр. 29 12:25 c
Но без +, то есть когда в chmod передаются аргументы по одному, команда завершится без ошибок.
kolan@corka ~/tmp/find $ find -type d -exec chmod -v 0777 <> \; права доступа «.» оставлены в виде 0777 (rwxrwxrwx) права доступа «./a» изменены с 0000 (---------) на 0777 (rwxrwxrwx) права доступа «./a/b» изменены с 0000 (---------) на 0777 (rwxrwxrwx) права доступа «./a/b/c» изменены с 0000 (---------) на 0777 (rwxrwxrwx) kolan@corka ~/tmp/find $ ll . a a/b .: итого 4 drwxrwxrwx 3 kolan kolan 4096 апр. 29 12:25 a a: итого 4 drwxrwxrwx 3 kolan kolan 4096 апр. 29 12:25 b a/b: итого 4 drwxrwxrwx 2 kolan kolan 4096 апр. 29 12:25 c
Итого, если не известно, есть ли права на чтение+выполнение для низлежащих директорий, я так понимаю, оптимальным вариантом будет.
find -type d -exec chmod -v 0755 <> \; find -type f -exec chmod -v 0644 <> +
Вторая команда может быть заменена на xargs, если есть какие-то дополнительные требования к разбивке группы аргументов.
find -type f -print0 | xargs -0 chmod -v 0644