chmod — что это и зачем
chmod (change mode) — команда Linux для изменения прав доступа к файлу или каталогу. Управляет тем, кто может читать, писать и выполнять файл — владелец, группа, остальные. Понимание chmod нужно для SSH-ключей, веб-серверов и любой работы с правами доступа в Ubuntu.
chmod
chmod (change mode) — команда Linux для изменения прав доступа к файлу или каталогу. Управляет тем, кто может читать, писать и выполнять файл — владелец, группа, остальные. Понимание chmod нужно для SSH-ключей, веб-серверов и любой работы с правами доступа в Ubuntu.
Что это в одном абзаце
В UNIX у каждого файла есть три категории доступа: владелец (user), группа (group), все остальные (other). Для каждой категории — три типа разрешений: чтение (r), запись (w), выполнение (x). chmod — команда, которая эти разрешения меняет.
chmod 644 config.txt # rw для владельца, r для группы и остальных
chmod +x script.sh # добавить право на выполнение всем
chmod u+w,go-w report.pdf # +write владельцу, -write группе и остальным
chmod -R 755 /opt/myapp # рекурсивно для каталога и всего внутри
Посмотреть текущие права — через ls -l:
-rw-r--r-- 1 user user 1234 May 4 10:00 config.txt
drwxr-xr-x 2 user user 4096 May 4 10:00 myapp/
Первая колонка — это «режим» (mode), который и меняет chmod.
Как читать вывод ls -l
Слева от размера файла десять символов:
-rw-r--r--
│└┬┘└┬┘└┬┘
│ │ │ └─ права для остальных (other) — r--
│ │ └──── права для группы (group) — r--
│ └─────── права для владельца (user) — rw-
└────────── тип файла: '-' (обычный), 'd' (каталог), 'l' (симлинк)
r — read, w — write, x — execute. Прочерк - — права нет.
Для каталогов биты значат немного другое:
r— можно листинговать содержимое (ls).w— можно создавать и удалять файлы внутри.x— можно «войти» в каталог (cd) и обращаться к файлам по имени.
Поэтому, например, для папки ~/.ssh/ нужны rwx (700) — чтобы вы могли заходить и видеть содержимое, но никто другой не мог даже прочитать список файлов с приватными ключами.
Восьмеричная нотация
Самый частый способ задать права — через число из трёх (или четырёх) цифр:
| Цифра | Биты | Что значит |
|---|---|---|
| 0 | --- |
ничего |
| 1 | --x |
только выполнение |
| 2 | -w- |
только запись |
| 3 | -wx |
запись + выполнение |
| 4 | r-- |
только чтение |
| 5 | r-x |
чтение + выполнение |
| 6 | rw- |
чтение + запись |
| 7 | rwx |
всё |
Три цифры — это разрешения для владельца / группы / остальных:
chmod 755 script.sh # rwx / r-x / r-x — стандарт для исполняемых
chmod 644 README.md # rw- / r-- / r-- — стандарт для текстовых
chmod 600 ~/.ssh/id_ed25519 # rw- / --- / --- — приватный ключ
chmod 700 ~/.ssh/ # rwx / --- / --- — каталог с ключами
chmod 750 /var/log/myapp/ # rwx / r-x / --- — папка лога для группы
Запомните три ключевых пресета:
- 644 — обычный файл, читать может любой, писать только владелец.
- 755 — исполняемый файл или папка, доступная для входа всем.
- 600 / 700 — приватные данные владельца (SSH-ключи, секреты, домашние папки).
Символьная нотация
Альтернатива числам — изменения «дельтой»:
chmod u+x script.sh # владельцу +x
chmod g-w shared.log # группе убрать запись
chmod o=r public.txt # остальным = только чтение
chmod a+r,a-w report.pdf # всем (a=all) +read, -write
Кому: u (user), g (group), o (other), a (all = u+g+o).
Действие: + (добавить), - (убрать), = (установить ровно).
Что: r, w, x (плюс специальные s, t, X).
Когда удобнее символьная: «добавить +x скрипту» — короче, чем считать 755. Когда удобнее восьмеричная: «дать стандартный пресет» — chmod 755 понятнее.
Рекурсивный chmod и -X
Для каталогов часто нужно применить права ко всему содержимому:
sudo chmod -R 755 /var/www/myapp
Грабли: -R 755 поставит x-бит на все файлы, в том числе на текстовые. Это не страшно, но «грязно». Чище — использовать заглавный X, который ставит x только если файл уже исполняемый или это каталог:
sudo chmod -R u=rwX,go=rX /var/www/myapp
Альтернатива — раздельные команды для файлов и каталогов:
sudo find /var/www/myapp -type d -exec chmod 755 {} +
sudo find /var/www/myapp -type f -exec chmod 644 {} +
Это идеоматический паттерн при разворачивании сайта на сервер.
chmod и владелец vs группа
chmod не меняет владельца файла — только права. Чтобы поменять владельца, нужен chown:
sudo chown www-data:www-data /var/www/myapp/ # сменить user и group
sudo chown -R deploy:deploy /opt/myapp # рекурсивно
Поэтому стандартный «деплой-чанк» это два шага: сначала chown, потом chmod.
SUID, SGID, sticky-bit
Реже встречающиеся биты — четвёртая (опциональная) цифра в восьмеричной нотации:
- SUID (4xxx) —
sвместоxу владельца. Программа выполняется с правами владельца файла, а не запускающего. Так работаетpasswd: вы запускаете, но он внутри пишет в/etc/shadowот имени root. - SGID (2xxx) —
sу группы. Для каталогов: новые файлы внутри наследуют группу каталога. Удобно для общих папок команды. - Sticky-bit (1xxx) —
tу остальных. На каталогах: только владелец файла может удалить файл, даже если у других естьw. Так защищён/tmpот того, чтобы пользователи не удаляли чужие файлы.
chmod 4755 /usr/bin/myapp # SUID
chmod 2775 /shared # SGID
chmod 1777 /tmp # sticky
В обычной серверной практике вы их редко ставите руками — они уже правильно настроены в системных файлах.
Частые вопросы
Что значит chmod в Linux
Команда «change mode» — изменение прав доступа к файлу. Управляет тем, кто из трёх категорий (владелец, группа, остальные) может читать (r), писать (w) и выполнять (x) файл. Действует только в UNIX-подобных системах с моделью POSIX-прав; в Windows права устроены принципиально иначе.
Что значат цифры 755 и 644
Восьмеричная запись прав. Три цифры — для владельца / группы / остальных. Каждая цифра — сумма: 4 (read) + 2 (write) + 1 (execute). 755 = rwxr-xr-x (владельцу всё, группе и остальным чтение и вход в каталог). 644 = rw-r--r-- (владельцу чтение и запись, всем остальным только чтение). 600 = rw------- — приватный файл.
Какие права ставить SSH-ключу
Каталог ~/.ssh/ — 700 (только владелец видит и заходит). Приватный ключ (id_ed25519) — 600 (только владелец читает и пишет). authorized_keys на сервере — тоже 600. Если права шире, SSH-демон откажется работать с сообщением «bad ownership or modes». Подробно — в гайде по SSH-ключам.
Чем chmod отличается от chown
chmod меняет права (что можно делать с файлом). chown меняет владельца и группу (кому он принадлежит). Это две независимые оси: можно сменить владельца, не меняя прав, и наоборот. На деплое обычно делают подряд: сначала chown -R www-data:www-data, потом chmod нужного режима.
Что такое chmod -R
Флаг -R (recursive) применяет права ко всему содержимому каталога рекурсивно. chmod -R 755 /var/www/site пройдётся по всем файлам и подкаталогам и поставит им 755. Грабли: на текстовые файлы тоже навесится +x, что некрасиво. Чище — chmod -R u=rwX,go=rX <path> (заглавный X ставит execute только если он уже был или это каталог).
Почему chmod требует sudo
Менять права чужого файла — нет. Если файл ваш, chmod без sudo сработает. sudo нужен, когда вы пытаетесь поменять права файлу, у которого другой владелец (например, в /etc/, /var/, в чужих домашних папках). Поэтому для системных файлов почти всегда sudo chmod ....
Что почитать
- SSH-ключи на Ubuntu: вход без пароля — каноничный пример, где chmod критичен: SSH откажется работать с приватным ключом, если права шире 600.
- sudo — почему
chmodчаще всего идёт через sudo при работе с системными файлами. - демон в Linux — типичная задача после установки демона: дать
www-dataили сервисному юзеру нужный доступ через chown + chmod.