← Весь справочник

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' файл.

Как читать права

БитЧислоДля файлаДля каталога
r4читать содержимоевидеть список имён
w2менять содержимоесоздавать, удалять, переименовывать файлы внутри
x1запускатьзаходить (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.

Числовой режим

ЗаписьЧто значит
644rw-r--r-- — обычный файл
600rw------- — секреты, ключи
755rwxr-xr-x — каталоги и программы
700rwx------ — личный каталог
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-оболочки.

См. также

chown · umask · acl · stat · ls · find · useradd