chown — что это и зачем
chown (change owner) — команда Linux для смены владельца и группы файла или каталога. Парная к chmod: chown управляет тем, **кому** принадлежит файл, chmod — тем, что **можно с ним делать**. Базовая команда деплоя: дать сервисному пользователю доступ к каталогу приложения.
chown
chown (change owner) — команда Linux для смены владельца и группы файла или каталога. Парная к chmod: chown управляет тем, кому принадлежит файл, chmod — тем, что можно с ним делать. Базовая команда деплоя: дать сервисному пользователю доступ к каталогу приложения.
Что это в одном абзаце
В Linux у каждого файла два метаданных-«хозяина»: пользователь-владелец и группа. По умолчанию это тот, кто файл создал. Когда вы разворачиваете на сервере приложение под отдельным юзером (www-data для nginx, postgres для PostgreSQL, свой myapp для своего сервиса), нужно отдать каталог этому пользователю — иначе он не сможет в него писать. Именно эту задачу решает chown.
sudo chown alice:alice file.txt # сменить и владельца, и группу на alice
sudo chown www-data /var/www/html # сменить только владельца
sudo chown :developers shared.log # сменить только группу (двоеточие в начале)
sudo chown -R www-data:www-data /var/www # рекурсивно для всего содержимого
В отличие от chmod, обычный пользователь не может «отдать» свой файл другому — только root может менять владельца. Поэтому chown почти всегда идёт с sudo.
Синтаксис
Базовая форма: chown <владелец>[:<группа>] <файл>....
Варианты:
alice— сменить только владельца, группу не трогать.alice:devs— сменить и владельца наalice, и группу наdevs.alice:— сменить владельца наalice, группу — на основную группуalice(берётся из/etc/passwd).:devs— сменить только группу.
Полезные флаги:
-R— рекурсивно, со всем содержимым каталога.-h— менять владельца самого симлинка, а не файла, на который он указывает (по умолчанию chown идёт по симлинкам).--from=oldowner— менять только если текущий владелец совпадает. Полезно при пакетной правке: «всё, что было уdeploy, передатьmyapp».
Посмотреть текущего владельца — через ls -l:
$ ls -l /var/www/myapp
-rw-r--r-- 1 www-data www-data 1234 May 4 10:00 index.html
Третья и четвёртая колонки — владелец и группа.
Типичные сценарии на Ubuntu
1. Развернули код приложения, надо отдать сервисному юзеру.
sudo chown -R myapp:myapp /opt/myapp
После этого systemd-сервис, который работает под User=myapp, сможет читать и писать в свой каталог.
2. Скопировали сайт в /var/www/, надо отдать nginx.
sudo chown -R www-data:www-data /var/www/site
Без этого nginx ловит «Permission denied» при попытке прочитать index.html.
3. Пользователь deploy в группе www-data, общий каталог.
sudo chown -R deploy:www-data /var/www/site
sudo chmod -R u=rwX,g=rX,o= /var/www/site
sudo chmod g+s /var/www/site # SGID на каталог
chown deploy:www-data + chmod g+s означает: владелец deploy (он деплоит), группа www-data (nginx читает). SGID-бит на каталоге заставит новые файлы внутри наследовать группу www-data автоматически.
4. Откат после случайного chown -R на /usr.
К сожалению, без бэкапа точно вернуть оригинальные владельцы нельзя. На свежей системе Ubuntu эту проблему «лечат» через переустановку всех пакетов с восстановлением прав, но это отдельная боль. Поэтому никогда не запускайте chown -R на корень или /usr — всегда дважды проверяйте путь.
chown vs chmod — что когда
| Задача | Команда |
|---|---|
| «Сделать файл исполняемым» | chmod +x |
| «Никто кроме меня не должен читать» | chmod 600 |
| «Этот каталог должен принадлежать nginx» | chown www-data |
«Сервис должен писать в /var/log/myapp/» |
chown myapp + chmod 750 |
| «Папка с SSH-ключами на сервере» | chmod 700 (владелец уже правильный) |
Они дополняющие, не альтернативные. На деплое почти всегда идут парой:
sudo chown -R myapp:myapp /opt/myapp
sudo find /opt/myapp -type d -exec chmod 755 {} +
sudo find /opt/myapp -type f -exec chmod 644 {} +
Подробно про права (rwx, восьмеричная нотация, рекурсия) — в термине chmod.
Частые вопросы
Что значит chown в Linux
Команда «change owner» — изменение владельца и/или группы файла. Только root может менять владельца на любого, обычный пользователь не может «отдать» свой файл. Поэтому в реальной работе chown почти всегда запускается через sudo.
Чем chown отличается от chmod
chown меняет, кому принадлежит файл (владелец, группа). chmod меняет, что можно с ним делать (rwx для u/g/o). Это две независимые оси: можно сменить владельца, не трогая права, и наоборот. На деплое часто работают парой: сначала chown сервисному юзеру, потом chmod нужного режима.
Зачем нужен sudo для chown
Менять владельца файла на чужого — операция, которую может делать только root. Иначе любой юзер мог бы «свалить» свой файл на другого пользователя и подсунуть ему вредоносный скрипт. Поэтому даже изменение принадлежности своего файла на другого пользователя требует sudo.
Как сделать рекурсивный chown
sudo chown -R user:group /path/to/dir. Флаг -R (recursive) пройдётся по всему содержимому каталога. Стандартный паттерн при деплое: sudo chown -R www-data:www-data /var/www/site. Будьте осторожны с путём — chown -R на /usr или /etc может сломать систему.
Как сменить только группу, без владельца
Через chown :group <файл> (двоеточие в начале). Например, sudo chown :developers shared.log — сменит группу на developers, владельца не тронет. Альтернативный вариант — отдельная команда chgrp, она делает только это.
Что делает chown user: (с двоеточием на конце)
Сменит и владельца на user, и группу — на основную группу этого пользователя (читается из /etc/passwd). Удобно, когда у юзера и его основной группы одно имя (стандарт на Ubuntu): sudo chown -R alice: /home/alice — присвоит alice:alice всему содержимому.
Что почитать
- chmod — парная команда для управления правами доступа. На деплое почти всегда идут вместе: chown + chmod.
- sudo — chown почти всегда требует root, поэтому через sudo.
- SSH-ключи на Ubuntu — пример, где владелец критичен:
~/.ssh/authorized_keysдолжен принадлежать вам, иначе SSH-демон откажется его читать.