Как устроены права доступа в Unix
У каждого файла есть три набора по три бита прав: для владельца файла, для его группы и для всех остальных. Каждый набор может разрешать чтение (r, значение 4), запись (w, 2) и выполнение (x, 1). Сложите значения в каждом наборе — получится одна восьмеричная цифра, поэтому права записывают тремя цифрами: rwxr-xr-x — это 4+2+1, 4+1, 4+1 = 755.
Для каталогов те же биты означают немного другое: чтение позволяет вывести список записей, запись — создавать и удалять записи, а выполнение — входить в каталог и обращаться к файлам внутри. Каталог без x непригоден даже при наличии r.
Специальные биты
Четвёртая, ведущая цифра хранит ещё три бита. setuid (4) запускает исполняемый файл от имени его владельца — именно так passwd может править файл, принадлежащий root. setgid (2) делает то же для группы, а на каталоге заставляет новые файлы наследовать группу каталога, что и нужно для общих папок проекта. sticky (1) на каталоге не даёт пользователям удалять чужие файлы; у /tmp права 1777.
Символьный режим
chmod принимает и изменения, а не только абсолютные значения: u+x добавляет выполнение владельцу, go-w снимает запись у группы и остальных, a=r даёт всем только чтение. X (заглавная) добавляет выполнение только каталогам и файлам, у которых оно уже где-то есть, поэтому chmod -R a+rX — безопасный способ открыть дерево на чтение.
umask
Новые файлы начинают с 666, а каталоги с 777, минус umask. Распространённая umask 022 даёт 644 и 755; 077 даёт 600 и 700 (приватно). umask без аргументов показывает текущее значение.
Распространённые значения
| Восьмеричное | Символьное | Применение |
|---|---|---|
| 644 | rw-r--r-- | Обычные файлы, веб-контент |
| 755 | rwxr-xr-x | Исполняемые файлы, скрипты, каталоги |
| 600 | rw------- | Приватные ключи, .env, файлы с паролями |
| 700 | rwx------ | ~/.ssh и другие приватные каталоги |
| 664 / 775 | rw-rw-r-- / rwxrwxr-x | Файлы / каталоги для совместной работы в группе |
| 2775 | rwxrwsr-x | Общий каталог с наследованием группы |
| 1777 | rwxrwxrwt | /tmp |
| 4755 | rwsr-xr-x | Программы с setuid, например passwd, sudo |
Вопросы
Что означает chmod 755?
Владелец может читать, писать и выполнять; группа и остальные — читать и выполнять. Это обычный режим для программ, скриптов и каталогов.
Что делает chmod 777 и почему это плохо?
Он позволяет каждому пользователю системы читать, записывать и выполнять файл. На общей или доступной из интернета машине это значит, что изменить его может кто угодно, включая скомпрометированный сервис. Это почти никогда не правильное решение ошибки доступа; обычно помогает смена владельца (chown) или 755/644.
Почему мой скрипт выдаёт «permission denied»?
У него нет бита выполнения. Выполните chmod +x script.sh (или 755). Если файл лежит на файловой системе, смонтированной с noexec, или строка shebang указывает на отсутствующий интерпретатор, вы получите то же сообщение.
Что означают s или t в выводе ls -l?
Строчная s в позиции выполнения владельца или группы означает, что setuid или setgid установлен вместе с выполнением; заглавная S — что специальный бит установлен без выполнения (обычно ошибка). t и T — то же самое для бита sticky. Вставьте строку в поле символьного режима, чтобы расшифровать её.
В чём разница между chmod и chown?
chmod меняет биты прав доступа; chown меняет, какому пользователю и группе принадлежит файл. Многие проблемы «permission denied» — это проблемы владения: биты правильные, но не для того пользователя.
Как задать права рекурсивно?
chmod -R. Чтобы не сделать каждый файл исполняемым, используйте chmod -R u=rwX,go=rX dir, где заглавная X применяет выполнение только к каталогам и уже исполняемым файлам.