linux permissions

chmod

Изменить права доступа к файлу или директории

Описание

Команда chmod (change mode) — одна из фундаментальных команд UNIX-систем, появившаяся ещё в Version 1 AT&T Unix (1971). Она позволяет управлять правами доступа к файлам и директориям, определяя, кто может читать, записывать и исполнять файл.

В Linux каждый файл имеет три категории пользователей: владелец (user/owner), группа (group) и остальные (others). Для каждой категории задаются три типа прав: чтение (r=4), запись (w=2) и исполнение (x=1). Команда chmod позволяет задавать права как в символьном (u+x), так и в числовом восьмеричном (755) формате.

Используйте chmod, когда нужно: сделать скрипт исполняемым, ограничить доступ к конфиденциальному файлу, выдать группе право на запись в общую директорию, или настроить права рекурсивно для целого дерева файлов.

Синтаксис

chmod [ОПЦИИ] РЕЖИМ ФАЙЛ...
chmod [ОПЦИИ] ЧИСЛОВОЙ_РЕЖИМ ФАЙЛ... # Примеры: chmod 755 script.sh chmod u+x,g-w,o-r file.txt chmod -R 644 /var/www/html/

Компоненты символьного режима

ЧастьЗначениеВарианты
КомуКатегория пользователяu (владелец), g (группа), o (остальные), a (все)
ДействиеЧто делать с правом+ (добавить), - (убрать), = (установить точно)
ПравоТип доступаr (чтение=4), w (запись=2), x (исполнение=1), s (SUID/SGID), t (sticky bit)

Числовой (восьмеричный) режим

# Три цифры: владелец | группа | остальные # Каждая цифра = сумма: r(4) + w(2) + x(1) chmod 755 file # rwxr-xr-x : владелец=7(rwx), группа=5(r-x), остальные=5(r-x) chmod 644 file # rw-r--r-- : владелец=6(rw-), группа=4(r--), остальные=4(r--) chmod 600 file # rw------- : только владелец может читать и писать

Флаги и опции

ФлагОписаниеПример
-R, --recursive Рекурсивно изменить права для всех файлов и поддиректорий chmod -R 755 /var/www/
-v, --verbose Вывести подробную информацию о каждом обработанном файле chmod -v 644 file.txt
-c, --changes Вывести информацию только о файлах, права которых реально изменились chmod -c 755 *.sh
-f, --silent Подавить сообщения об ошибках (тихий режим) chmod -f 644 /etc/passwd
--reference=FILE Использовать права указанного файла-образца как источник chmod --reference=src.sh dst.sh
--preserve-root Запретить рекурсивную операцию на корневом каталоге / chmod --preserve-root -R 755 /
--no-preserve-root Разрешить операцию на / (опасно, по умолчанию в некоторых системах) chmod --no-preserve-root -R 644 /
--version Показать версию утилиты и выйти chmod --version
--help Показать справку по использованию chmod --help

Специальные биты

БитЧисловое значениеОписание
SUID (s)4xxx, напр. 4755Файл запускается с правами владельца (напр. /usr/bin/passwd)
SGID (s)2xxx, напр. 2755Файл запускается с правами группы; для директорий — новые файлы наследуют группу
Sticky bit (t)1xxx, напр. 1777В директории удалить файл может только его владелец (напр. /tmp)

Паттерны использования

Сделать скрипт исполняемым

chmod +x deploy.sh
chmod u+x,go-x secret-script.sh
# Проверить результат:
ls -l deploy.sh
# -rwxr-xr-x 1 user group 1024 Jun 11 deploy.sh

Защита конфиденциального файла

# Только владелец может читать/писать
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
# Директория ~/.ssh — только владелец
chmod 700 ~/.ssh

Права для веб-сервера

# Файлы: чтение для всех, запись только владельцу
chmod -R 644 /var/www/html/
# Директории: +x чтобы можно было войти
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

Общая директория для группы

# Группа может читать и писать
chmod 775 /shared/project/
# SGID: новые файлы наследуют группу
chmod 2775 /shared/project/
ls -ld /shared/project/
# drwxrwsr-x 2 user devteam /shared/project/

Символьные операции — добавить/убрать

# Добавить право на исполнение для всех
chmod a+x script.sh
# Убрать запись у остальных и группы
chmod go-w important.conf
# Установить точные права (заменить)
chmod u=rwx,go=r-- file.txt

Sticky bit для /tmp

# Директория доступна всем, но удалять
# файл может только его владелец
chmod 1777 /tmp
ls -ld /tmp
# drwxrwxrwt 12 root root 4096 /tmp
#           ^ 't' — sticky bit активен

Советы и предупреждения

Совет: быстрая проверка прав
После изменения прав всегда проверяйте результат командой ls -l файл или stat файл. Команда stat показывает права и в символьном, и в числовом виде одновременно: stat -c "%a %n" файл выведет только числовые права.
Совет: find + chmod для разделения файлов и директорий
При рекурсивной установке прав удобно разделять файлы и директории, так как директориям нужен бит x для возможности входа:
find /path -type f -exec chmod 644 {} +
find /path -type d -exec chmod 755 {} +
Флаг + вместо \; передаёт несколько файлов за раз — работает быстрее.
Осторожно: chmod -R на системных директориях
Никогда не запускайте chmod -R 777 / или аналогичные команды на корневой файловой системе. Это уничтожит права доступа всей системы и сделает её неработоспособной. Всегда используйте --preserve-root как защиту.
Осторожно: chmod 777 — антипаттерн
Установка прав 777 (все для всех) — частая ошибка начинающих. Это означает, что любой пользователь системы может изменить или удалить файл. Для веб-файлов используйте 644, для скриптов — 755, для приватных ключей — 600.