LinuxRuLinux без лишней теории
Права и владельцы

Права доступа в Linux: chmod, chown и разбор Permission denied

Редакция LinuxRu7 мин чтенияИнструкции

Права доступа в Linux задаются командой chmod для трёх групп: владельца, группы и остальных, а владельца меняет chown. Запись chmod 755 означает rwx для владельца и r-x для всех прочих, 644 подходит обычным файлам, а маска umask определяет права новых файлов.

Права доступа в Linux: chmod, chown и разбор Permission denied
Фото: TRANSviada, CC0, Wikimedia Commons
Содержание
  1. Как читать права
  2. Числовая запись
  3. Символьная запись
  4. Владелец chown
  5. umask
  6. SUID, SGID, sticky
  7. Permission denied
  8. ACL и практика
  9. Частые вопросы

Как читать права доступа в выводе ls -l

У каждого файла в Linux есть владелец, группа и три набора прав: для владельца (user), для группы (group) и для всех остальных (others). Увидеть их проще всего командой ls -l:

ls -l ~/script.sh /etc/shadow
# -rwxr-xr-- 1 anna anna  512 окт 20 10:15 /home/anna/script.sh
# -rw-r----- 1 root shadow 1203 окт 01 09:00 /etc/shadow

Первый символ показывает тип: - обычный файл, d каталог, l символическая ссылка. Дальше идут три тройки символов. В примере rwx у владельца anna, r-x у группы и r-- у остальных. Затем владелец и группа.

  • r (read): прочитать содержимое файла. Для каталога: увидеть список имён внутри.
  • w (write): изменить файл. Для каталога: создавать, удалять и переименовывать файлы в нём, даже чужие, если нет sticky-бита.
  • x (execute): запустить файл как программу. Для каталога: войти в него и обращаться к файлам по имени.

Право x на каталог новичков сбивает чаще всего. Без него нельзя открыть файл внутри, даже если сам файл доступен на чтение. Для всего пути важно, чтобы каждый каталог от корня до файла имел x для вас. Если нужен подробный вывод одного файла с правами в двух форматах, используйте stat.

Числовая запись: что значит chmod 755

Каждое право имеет вес: r = 4, w = 2, x = 1. Сумма весов внутри тройки даёт одну цифру, а три цифры подряд описывают права владельца, группы и остальных. Отсюда расшифровка самого частого вопроса: chmod 755 означает 7 = 4+2+1 (rwx) для владельца, 5 = 4+1 (r-x) для группы и 5 (r-x) для остальных. Владелец может всё, остальные читают и запускают, но не меняют.

РежимСимвольноГде применяется
755rwxr-xr-xКаталоги, скрипты и программы, доступные всем на чтение
644rw-r--r--Обычные файлы: конфиги, документы, страницы сайта
700rwx------Личные каталоги, например ~/.ssh
600rw-------Секреты: приватные ключи, файлы паролей
775rwxrwxr-xОбщий каталог для группы
664rw-rw-r--Файлы, которые правит вся группа
777rwxrwxrwxПочти никогда: писать может любой процесс в системе
chmod 755 ~/bin/backup.sh
chmod 600 ~/.ssh/id_ed25519
# рекурсивно для каталога и всего содержимого
chmod -R 750 ~/projects/secret

Перед тремя цифрами иногда пишут четвёртую, например chmod 2775. Она задаёт специальные биты, о них ниже.

Символьная запись chmod: u, g, o и плюс с минусом

Числа удобны, когда вы задаёте права целиком. Если нужно поменять один бит и не трогать остальные, удобнее символьная форма: кому (u, g, o или a для всех), действие (+ добавить, - убрать, = установить ровно) и права.

chmod +x script.sh          # сделать исполняемым
chmod u+x,g-w file         # владельцу добавить x, группе убрать w
chmod o= private.txt       # отобрать у остальных все права
chmod a+r report.pdf       # всем разрешить чтение
chmod -R u+rwX,go-rwx ~/docs

Обратите внимание на заглавную X в последней строке. Она добавляет право выполнения только каталогам и тем файлам, которые уже исполняемы у кого-то. Это спасает от классической ошибки, когда chmod -R +x делает исполняемыми все документы и картинки.

Есть и удобный способ скопировать права с образца: chmod --reference=образец файл. Работает в GNU coreutils, то есть в любом обычном дистрибутиве.

chown: как сменить владельца и группу

Менять владельца файла может только root, поэтому команда почти всегда идёт через sudo. Формат: chown пользователь:группа файл.

sudo chown anna file.txt              # только владелец
sudo chown anna:www-data site/        # владелец и группа
sudo chown :developers shared.txt     # только группа
sudo chown -R anna:anna ~/Downloads   # рекурсивно
# группу владелец файла может сменить и без sudo, если сам в ней состоит
chgrp developers notes.md

Самый частый сценарий для chown на домашнем компьютере: вы что-то скачали или распаковали через sudo, и в домашнем каталоге появились файлы, принадлежащие root. Редактор их не сохраняет, файловый менеджер не удаляет. Лечится одной командой sudo chown -R $USER:$USER ~/путь. Как добавить пользователя в группу, чтобы общий каталог стал доступен, рассказано в статье пользователи, группы и sudo. Помните, что новая группа начинает действовать после повторного входа в сеанс.

umask: права для новых файлов

Когда программа создаёт файл, она просит права 666 для файлов и 777 для каталогов. Из них вычитается маска umask. При маске 022 получаются привычные 644 и 755, при маске 002 файлы и каталоги становятся доступны на запись группе: 664 и 775.

umask          # показать текущую маску, например 0022
umask -S       # то же в символьном виде: u=rwx,g=rx,o=rx
umask 077      # до конца сеанса: новые файлы только для себя

Чтобы маска сохранилась, допишите строку umask 027 в ~/.bashrc или ~/.profile. Общесистемное значение задаётся в /etc/login.defs через модуль pam_umask, а у служб systemd собственный параметр UMask= в unit-файле. Значение по умолчанию в разных дистрибутивах отличается, поэтому проверяйте командой, а не по чужой инструкции.

SUID, SGID и sticky bit

Четвёртая цифра в начале режима отвечает за специальные биты: 4 для SUID, 2 для SGID, 1 для sticky.

SUID

Программа запускается с правами владельца файла, а не того, кто её запустил. Пример: /usr/bin/passwd принадлежит root и имеет SUID, поэтому обычный пользователь может сменить свой пароль в защищённом /etc/shadow. В выводе ls -l вместо x у владельца стоит s. Ставить SUID на свои скрипты не нужно, ядро Linux его для скриптов игнорирует, а для бинарников это потенциальная дыра.

SGID

На каталоге SGID заставляет новые файлы наследовать группу каталога. Это основа общих папок для команды:

sudo mkdir /srv/shared
sudo chown root:developers /srv/shared
sudo chmod 2775 /srv/shared

Sticky bit

На каталоге запрещает удалять и переименовывать чужие файлы, даже если на каталог есть право записи. Классический пример: /tmp с режимом 1777, в выводе ls -ld /tmp последним символом стоит t. Подробнее об этом каталоге в статье каталог tmp в Linux. Найти все файлы с SUID в системе можно через find, приёмы поиска описаны в материале поиск файлов в Linux:

sudo find / -xdev -perm -4000 -type f 2>/dev/null

Permission denied: частые причины и решения

Ошибка одна, а причин много. Проверяйте по порядку:

  1. У скрипта нет права x. Решение: chmod +x script.sh или запуск через интерпретатор bash script.sh.
  2. Нет права x на одном из каталогов пути. Команда namei -l /полный/путь/к/файлу покажет права каждого компонента пути одним списком.
  3. Файл принадлежит root. Последствие работы через sudo. Верните владельца командой chown.
  4. Раздел смонтирован с noexec. На флешках и некоторых разделах запуск программ запрещён опцией монтирования. Проверьте findmnt -T путь.
  5. Файловая система без прав Unix. На FAT32 и exFAT chmod и chown не работают, права задаются опциями uid, gid, umask при монтировании.
  6. SELinux или AppArmor. В Fedora права могут быть в порядке, а доступ запрещает метка SELinux. Смотрите ls -Z и восстанавливайте метки restorecon -Rv путь.
  7. Атрибут immutable. Даже root не изменит файл с атрибутом i. Проверка lsattr файл, снятие sudo chattr -i файл.
  8. sudo и перенаправление. В sudo echo текст > /etc/файл перенаправление выполняет ваша оболочка без прав root. Правильно: echo текст | sudo tee /etc/файл.

Никогда не лечите Permission denied командой chmod -R 777. Это открывает запись всем процессам системы, ломает SSH (он откажется работать с ключами при слишком открытых правах) и маскирует настоящую причину. Найдите, какого именно права не хватает и кому, и выдайте ровно его.

ACL и аккуратная массовая правка прав

Классических трёх наборов прав иногда мало: нужно дать доступ одному конкретному пользователю, не добавляя его в группу. Для этого есть списки ACL:

setfacl -m u:boris:rx ~/shared-photos      # дать boris чтение и вход
setfacl -d -m u:boris:rx ~/shared-photos   # то же для новых файлов внутри
getfacl ~/shared-photos
setfacl -b ~/shared-photos                 # убрать все ACL

Если у файла есть ACL, в ls -l после прав появляется знак +.

Когда нужно привести в порядок права целого дерева, например сайта или архива, задавайте режимы раздельно для каталогов и файлов:

find ~/site -type d -exec chmod 755 {} +
find ~/site -type f -exec chmod 644 {} +

Для каталога SSH нужны строгие права, иначе сервер не примет ключ: chmod 700 ~/.ssh и chmod 600 ~/.ssh/authorized_keys. Подробности в статье как подключиться по SSH, а базовые команды для работы с файлами собраны в материале основные команды Linux. Полное описание синтаксиса chmod есть в руководстве GNU Coreutils.

Частые вопросы

Что значит chmod 755?

Владелец может читать, писать и запускать (7), группа и остальные только читать и запускать (5). Обычный режим для каталогов и скриптов.

Чем отличаются chmod 644 и 664?

При 644 писать может только владелец, при 664 ещё и группа. Остальные в обоих случаях только читают.

Как сменить владельца файла в Linux?

Командой sudo chown пользователь:группа файл, для каталога с содержимым добавьте ключ -R.

Почему chmod не работает на флешке?

FAT32 и exFAT не хранят права Unix. Права задаются опциями uid, gid и umask при монтировании.

Можно ли поставить chmod 777, чтобы всё заработало?

Не стоит: это открывает запись всем процессам и скрывает настоящую причину ошибки. Выдайте только недостающее право нужному пользователю.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.