Файлы и права доступа: chmod, chown и всё такое
Файлы и права доступа: chmod, chown и всё такое
Ты написал деплой-скрипт, запускаешь - Permission denied. Знакомо? Это права доступа. В Linux каждый файл имеет владельца и набор разрешений.
Как читать права
ls -la
# -rw-r--r-- 1 user group 1234 Apr 22 10:00 config.yml
# drwxr-xr-x 2 user group 4096 Apr 22 10:00 scripts/
Разберём -rw-r--r--:
- rw- r-- r--
│ │ │ │
│ │ │ └── другие (other): только чтение
│ │ └─────── группа (group): только чтение
│ └──────────── владелец (user): чтение + запись
└─────────────── тип: - файл, d каталог, l ссылка
Три права: r (read), w (write), x (execute).
chmod - меняем права
chmod +x deploy.sh # добавить право на выполнение
chmod 755 deploy.sh # rwxr-xr-x (стандарт для скриптов)
chmod 644 config.yml # rw-r--r-- (стандарт для конфигов)
chmod 600 .env # rw------- (только владелец)
Числовая нотация:
| Число | Права | Значение |
|---|---|---|
| 7 | rwx | всё |
| 6 | rw- | чтение + запись |
| 5 | r-x | чтение + выполнение |
| 4 | r-- | только чтение |
| 0 | - | ничего |
chown - меняем владельца
chown user:group file.txt # сменить владельца и группу
chown -R www-data:www-data /var/www # рекурсивно для каталога
chown root:root /etc/nginx/nginx.conf
Типичная ситуация: nginx работает от пользователя www-data, а файлы принадлежат root. Решение - chown.
Пользователи и sudo
whoami # кто я
id # подробно: uid, gid, группы
sudo command # выполнить от root
sudo -u postgres psql # выполнить от другого пользователя
Символические ссылки
ln -s /opt/myapp/current /opt/myapp/latest # симлинк
ls -la /opt/myapp/latest # покажет → current
Симлинки используются повсеместно: /usr/bin/php → конкретная версия (php8.2), конфиги nginx в sites-enabled → sites-available.
Полезные команды для файлов
file document.pdf # определить тип файла
du -sh /var/log/ # размер каталога
df -h # свободное место на дисках
find / -name "*.log" -size +100M # логи больше 100MB
which nginx # где лежит бинарник
Мини-задание
- Создай скрипт
hello.shс содержимым#!/bin/bashиecho "Hello" - Попробуй запустить
./hello.sh- получиPermission denied - Дай права:
chmod +x hello.shи запусти снова - Проверь права через
ls -la hello.sh
Итог
- Каждый файл имеет владельца, группу и три набора прав (user/group/other).
chmodменяет права,chownменяет владельца. Числовая нотация - быстрее.600для секретов,644для конфигов,755для скриптов.777- не используй.
Типичная ошибка
Лечить Permission denied через chmod 777 или sudo. Это как открыть все двери, потому что не нашёл нужный ключ. Разберись, какому пользователю нужен доступ, и дай минимально необходимые права.
Мини-практика
Создай каталог /tmp/permissions-lab. Внутри создай три файла: public.txt (644), secret.env (600), deploy.sh (755). Проверь через ls -la, что права выставлены верно. Попробуй прочитать secret.env от другого пользователя (через sudo -u nobody cat secret.env) - должен получить отказ.