В мире Linux и Unix-подобных систем нет волшебных заклинаний, но есть команда chmod — мощный инструмент, который, подобно стражу у ворот, решает, кто и что может делать с вашими файлами и папками. Понимание chmod — это не просто технический навык, а ключ к безопасности, стабильности и осознанному управлению вашей системой. Давайте разберемся, как эта магия работает на самом деле.
Что такое права доступа и зачем они нужны?
Представьте, что ваш файл — это дом. Права доступа определяют: кто из жильцов (пользователей) может зайти в дом (прочитать файл), кто может переставить мебель (записать в файл), а кому разрешено даже запустить лифт (выполнить файл как программу). Без этой системы любой пользователь или процесс мог бы делать с вашими конфиденциальными документами или системными файлами всё что угодно.
Права доступа — фундаментальный механизм безопасности многопользовательских систем. Их неправильная настройка — одна из частых причин уязвимостей.
Три кита: Владелец, Группа и Все остальные
Права в Linux всегда рассматриваются для трех категорий пользователей:
- u (user/owner): Владелец файла.
- g (group): Члены группы, к которой привязан файл.
- o (others): Все остальные пользователи системы.
Также есть категория a (all), которая означает всех сразу (u+g+o).
Три базовых права: Чтение, Запись, Выполнение
Для каждой категории можно задать три типа доступа:
- r (read) — Чтение (4): Для файла — возможность просмотреть содержимое. Для директории — возможность посмотреть список файлов в ней (команда
ls). - w (write) — Запись (2): Для файла — возможность изменить или удалить содержимое. Для директории — возможность создавать, переименовывать или удалять файлы внутри нее.
- x (execute) — Выполнение (1): Для файла — возможность запустить файл как программу или скрипт. Для директории — возможность «войти» в нее (сделать ее текущей рабочей директорией, командой
cd).
Два основных способа: Символьный и Цифровой
Символьный (буквенный) метод
Более наглядный для человека. Синтаксис: chmod [категория][оператор][права] файл.
Операторы: + (добавить право), - (убрать право), = (установить право в точности).
Примеры:
chmod u+x script.sh— Добавить владельцу право на выполнение файлаscript.sh.chmod go-w secret.txt— Отнять у группы и всех остальных право на запись в файлsecret.txt.chmod a=rw config.cfg— Установить для всех (владельца, группы, остальных) только права на чтение и запись (но не выполнение).
Цифровой (восьмеричный) метод
Более компактный и часто используемый в скриптах. Каждое право имеет вес: r=4, w=2, x=1. Права для категории суммируются.
Как считать: Для каждой категории (u, g, o) вычисляется сумма от 0 до 7. Затем три цифры записываются подряд.
- 7 (4+2+1) = rwx (чтение, запись, выполнение)
- 6 (4+2+0) = rw- (чтение, запись)
- 5 (4+0+1) = r-x (чтение, выполнение)
- 4 (4+0+0) = r-- (только чтение)
- 0 (0+0+0) = --- (нет прав)
Примеры:
chmod 755 script.sh— Владелец: rwx (7), Группа: r-x (5), Остальные: r-x (5). Стандартные права для исполняемых программ.chmod 644 document.txt— Владелец: rw- (6), Группа: r-- (4), Остальные: r-- (4). Стандартные права для обычных файлов.chmod 700 ~/.ssh/id_rsa— Только владелец может читать и записывать этот приватный ключ. Никто больше — идеально для безопасности.
Команда ls -l покажет права доступа в символьном виде в начале каждой строки (например, -rwxr-xr--). Первый символ указывает тип объекта («-» для файла, «d» для директории).
Особые права: SUID, SGID, Sticky Bit
Помимо основных трех, существуют специальные биты, которые добавляют четвертую цифру в начало цифровой записи:
- SUID (4): Установленный на исполняемый файл, заставляет его выполняться с правами его владельца, а не запустившего пользователя. Пример:
chmod 4755 /usr/bin/passwd. - SGID (2): Для директории — файлы, созданные в ней, будут наследовать группу директории, а не создателя. Для файла — аналогично SUID, но для группы.
- Sticky Bit (1): Для директории (например,
/tmp) разрешает удалять файлы внутри только их владельцам, даже если у других есть право на запись в директорию.chmod 1777 /tmp.
Рекурсивное изменение прав
Чтобы изменить права для всей директории и всего ее содержимого (поддиректорий и файлов), используйте ключ -R (recursive).
Пример: chmod -R 755 /var/www/my_site/ — установит права 755 для всех файлов и папок внутри my_site.
Будьте крайне осторожны с chmod -R! Неправильно заданные права для системных файлов могут «сломать» работу ОС. Всегда проверяйте путь, по которому применяете команду.
Практические сценарии и лучшие практики
- Веб-сервер: Файлы — 644, директории и CGI-скрипты — 755. Пользователь веб-сервера (например, www-data) должен иметь доступ на чтение.
- Закрытые данные: Конфиги с паролями, SSH-ключи — 600 (только владелец).
- Общая папка для группы: Директория — 2770 (включен SGID), файлы в ней — 660. Это позволит членам одной группы совместно работать с файлами.
- Никогда не используйте
chmod 777(полный доступ всем) как «решение» проблем с доступом. Это грубейшая ошибка безопасности!
FAQ: Часто задаваемые вопросы
Как посмотреть текущие права доступа к файлу?
Используйте команду ls -l имя_файла. Права отобразятся в виде 10 символов в начале строки.
Что делать, если я получил ошибку «Permission denied»?
Вам не хватает прав на выполнение операции. Либо запустите команду с повышенными привилегиями через sudo (если это системный файл и вы администратор), либо измените права на файл/директорию, если вы его владелец.
Чем опасны широкие права (например, 777)?
Любой пользователь или вредоносный скрипт в системе сможет прочитать, изменить или удалить такие файлы. Если это файлы веб-сервера, доступные из интернета, это открывает двери для взлома.
Как рекурсивно изменить права только для файлов или только для папок?
Можно скомбинировать find и chmod. Например:
find /path -type f -exec chmod 644 {} \; — изменить все файлы на 644.
find /path -type d -exec chmod 755 {} \; — изменить все директории на 755.
Можно ли отменить изменения chmod?
Нет отдельной команды «отката». Нужно знать или вычислить предыдущие корректные права и установить их заново. Поэтому перед массовыми изменениями делайте бэкапы или проверяйте команды на тестовых файлах.