chmod
Права доступа к файлам и каталогам — числами (644) и буквами (u+x), плюс setuid, setgid и sticky-бит
chmod меняет права доступа: кто может читать, писать и выполнять файл. Права задаются для трёх классов — владельца (u), группы (g) и всех остальных (o). Менять права может только владелец файла или root.
Синтаксис
chmod [опции] режим файл…
chmod [опции] --reference=образец файл…
Режим пишут числом (640) или буквами (u+x,g-w). Посмотреть текущие права: ls -l файл или stat -c '%a %A' файл.
Как читать права
| Бит | Число | Для файла | Для каталога |
|---|---|---|---|
r | 4 | читать содержимое | видеть список имён |
w | 2 | менять содержимое | создавать, удалять, переименовывать файлы внутри |
x | 1 | запускать | заходить (cd) и обращаться к файлам по имени |
Цифра для класса — сумма битов: 7 = rwx, 6 = rw-, 5 = r-x, 4 = r--, 0 = ---. Три цифры идут в порядке владелец, группа, остальные: 640 = rw-r-----.
Строка ls -l вида -rwxr-x---: первый символ — тип (- файл, d каталог, l ссылка), затем по три символа на владельца, группу и остальных. + в конце (-rw-r--r--+) значит, что у файла есть ACL — дополнительные права, которые видны в getfacl.
Числовой режим
| Запись | Что значит |
|---|---|
644 | rw-r--r-- — обычный файл |
600 | rw------- — секреты, ключи |
755 | rwxr-xr-x — каталоги и программы |
700 | rwx------ — личный каталог |
4755 | ведущая цифра — особые биты: 4 setuid, 2 setgid, 1 sticky, их сумма |
0 | --------- — нет прав ни у кого (кроме root) |
Символьный режим
Формат: [кому][оператор][что], несколько через запятую: u+x,go-w.
| Часть | Значения |
|---|---|
| кому | u владелец, g группа, o остальные, a все; без буквы — все, но с учётом umask |
| оператор | + добавить, - убрать, = выставить ровно эти (остальные снять) |
| что | r, w, x; X — x только каталогам и файлам, где x уже у кого-то есть |
| особые биты | s — setuid (u+s) или setgid (g+s); t — sticky (+t) |
| копия класса | g=u — группе те же права, что у владельца; o=g и т. п. |
Особые биты
| Бит | На файле | На каталоге |
|---|---|---|
setuid u+s / 4xxx | программа выполняется с правами владельца файла (passwd, sudo) | не используется |
setgid g+s / 2xxx | программа выполняется с правами группы файла | новые файлы и подкаталоги получают группу каталога |
sticky +t / 1xxx | не используется | удалить или переименовать файл может только его владелец (как в /tmp) |
В ls -l эти биты занимают место x: s/t — бит стоит вместе с x, S/T — бит стоит, а x нет.
Опции
| Опция | Что делает |
|---|---|
-R | рекурсивно по каталогу (символические ссылки внутри не трогает) |
-v / -c | сообщать о каждом файле / только о тех, где права изменились |
-f | не печатать сообщения об ошибках (код возврата всё равно ненулевой) |
--reference=образец | скопировать права с другого файла |
--preserve-root | отказаться работать рекурсивно на / (по умолчанию защиты нет) |
Примеры
# скрипт: владельцу всё, остальным чтение и запуск
chmod 755 deploy.sh
# закрытый конфиг: читать и писать может только владелец
chmod 600 ~/.ssh/config
# добавить право запуска владельцу, не трогая остальное
chmod u+x script.sh
# у группы убрать запись, остальным убрать всё
chmod g-w,o= report.txt
# группе — те же права, что у владельца
chmod g=u shared.txt
# каталог проекта: каталогам 755, файлам 644 — одной командой
chmod -R u=rwX,go=rX ~/project
# то же через find — если нужны разные права файлам и каталогам
find /srv/app -type d -exec chmod 750 {} +
find /srv/app -type f -exec chmod 640 {} +
# общий каталог команды: группа пишет, новые файлы наследуют группу
chmod 2775 /srv/shared
# каталог для всех, где нельзя удалять чужие файлы
chmod 1777 /srv/upload
# скопировать права с образца и показать, что поменялось
chmod -c --reference=/etc/hosts /etc/hosts.new
# посмотреть права числом и буквами
stat -c '%a %A %n' /etc/passwd /tmp
Подводные камни
chmod -R 644на каталоге снимает с подкаталогов битx, и обычный пользователь больше не сможет в них зайти. Для рекурсивных правок используйXилиfind -type f/-type dотдельно.- Каталог без
xбесполезен: имена файлов видны (приr), но открыть файл внутри нельзя — «Permission denied». - Удалить файл можно без прав на него. Удаление — это запись в каталог: при
wна каталог файл с правами000удаляется. Защита — sticky-бит на каталоге. - Режим без класса учитывает umask. При umask
027командаchmod +xдобавит бит только владельцу и группе, аchmod -wне тронет биты, закрытые маской. Пиши класс явно:a+x,u+x. - setgid на каталоге не снимается числом из трёх цифр.
chmod 755на каталоге с режимом2775оставит2755. Сними явно:chmod g-s каталогилиchmod 00755. SилиTзаглавной буквой вls -lзначит, что setuid/setgid/sticky стоит, а битxпод ним — нет. Обычно это ошибка.chownсбрасывает setuid/setgid. Сначалаchown, потомchmod.- Символические ссылки.
chmodпо ссылке меняет права целевого файла; у самой ссылки права всегда777и ни на что не влияют. - root игнорирует
rиw. Проверять, что файл закрыт, нужно от имени обычного пользователя, а не из root-оболочки.