Владелец, группа и почему из-за них появляется Permission denied
У каждого файла в Linux и macOS есть владелец и группа. Их вместе с правами показывает ls -l: в строке после набора прав и счётчика ссылок идут два имени, первое — владелец, второе — группа. Когда программа или вы сами пытаетесь изменить файл, система сравнивает ваш идентификатор с этими данными и решает, разрешено ли действие.
Типичная ситуация: вы однажды запустили команду через sudo в своей домашней папке, и созданные файлы получили владельца root. Позже обычный пользователь не может их изменить, и появляется ошибка Permission denied. Причина не в правах доступа как таковых, а в том, что владелец другой.
Команда chown (change owner) меняет владельца, а при необходимости и группу. Она не заменяет chmod, который меняет набор прав: это два независимых параметра, и про chmod рассказано в разделе словаря и в статье про права на macOS.
Чтобы узнать, кто вы, выполните id: команда выводит ваше имя, идентификатор и группы. Сравните это с ls -l по проблемному файлу. Если имена различаются, смена владельца может помочь, но решайте после понимания причины.
Синтаксис: пользователь, группа и их сочетания
Общий вид: chown владелец:группа путь. Двоеточие отделяет владельца от группы, и допустимы три варианта записи.
| Запись | Что меняется |
|---|---|
| chown anna файл | только владелец, группа прежняя |
| chown anna:staff файл | владелец и группа |
| chown :staff файл | только группа, владелец прежний |
В Linux также встречается запись через точку вместо двоеточия, но современные справки рекомендуют двоеточие. Имена пользователей и групп в разных системах свои: в macOS у обычного пользователя группа часто называется staff, а у администраторов есть группа admin; в Linux у каждого пользователя нередко есть одноимённая группа. Не копируйте имена из чужих примеров, проверьте свои командами id и ls -l.
Права администратора нужны почти всегда, если вы меняете владельца на другого пользователя: обычному пользователю система такой передачи не разрешает. Если вы остаётесь владельцем, а меняете только группу на ту, в которой состоите, права администратора могут не понадобиться. Для запуска с повышенными правами используют sudo, описанный в разделе словаря. Вводите его только когда понимаете, зачем.
Ключ -R: рекурсия и риск
Ключ -R применяет смену к папке и всему, что внутри. Это удобно, но именно с рекурсией связаны серьёзные ошибки. Неверный путь или лишний пробел способны затронуть системные каталоги, после чего система или программы перестают работать. Вернуть прежние значения вручную бывает сложно, потому что исходные владельцы у разных файлов отличались.
Перед рекурсивной командой выполните проверку:
- Выведите путь через echo, особенно если он содержит переменную: echo "$DIR". Пустая переменная может превратить путь в корень.
- Посмотрите содержимое: ls -la путь, и убедитесь, что это нужная папка.
- Оцените масштаб: find путь | wc -l покажет, сколько объектов затронет команда.
- Отработайте синтаксис на тестовой папке в своём домашнем каталоге.
- Только затем запускайте на реальном пути и ограничивайтесь самым узким каталогом.
Не запускайте chown -R на корне, на /etc, /usr, /bin, а также на всей домашней папке без необходимости. Обычный chown без -R меняет владельца цели символической ссылки, а не самой ссылки; для самой ссылки служит ключ -h. При -R переход по ссылкам регулируют ключи -H, -L и -P, и их умолчания и тонкости различаются в GNU и BSD версиях, поэтому смотрите man chown своей системы. Не запускайте рекурсивную смену, пока не проверили, нет ли внутри ссылок на посторонние каталоги.
Безопасная тренировка на тестовой папке
Тестовая папка позволяет понять поведение, ничего не рискуя. Выполните шаги в своём домашнем каталоге. Команды с sudo меняют владельца на другого пользователя, поэтому для практики достаточно менять группу на свою собственную или оставаться владельцем.
- mkdir -p ~/chown-test/sub && touch ~/chown-test/a.txt ~/chown-test/sub/b.txt — создаёт структуру.
- ls -lR ~/chown-test — запишите, кто владелец.
- id -gn — узнайте имя своей основной группы.
- chown :ИМЯ_ГРУППЫ ~/chown-test/a.txt — смените группу, подставив своё имя из предыдущей строки.
- chown -R :ИМЯ_ГРУППЫ ~/chown-test — применит смену ко всей тестовой папке.
После каждого шага смотрите ls -l, чтобы связать команду и результат. На этом этапе вы научились читать вывод и понимать, где менялась группа, а где владелец.
Дальнейшие опыты, связанные со сменой владельца на другого пользователя или на root, делайте только тогда, когда понимаете их цель: после такой смены вы можете потерять возможность изменять собственные файлы. Для проверки метаданных после смены удобен stat, в нём есть и владелец, и группа, и время смены метаданных.
Разбор типичных ошибок
Если chown сообщает об ошибке, сначала прочитайте текст. Он обычно указывает причину прямо.
| Сообщение | Вероятная причина | Что сделать |
|---|---|---|
| Operation not permitted | нет прав на смену владельца | использовать sudo или проверить, что вы владелец |
| No such file or directory | путь указан неверно | проверить ls и опечатки |
| invalid user | такого пользователя нет в системе | проверить имя командой id имя |
| invalid group | такой группы нет | посмотреть доступные группы |
| Read-only file system | диск смонтирован только для чтения | проверить параметры монтирования через mount |
Если вы работаете с внешним накопителем с файловой системой, не поддерживающей владельцев, смена может быть невозможна или не иметь эффекта. В этом случае владелец определяется параметрами монтирования, и менять его через chown бессмысленно: смотрите статью про mount.
Помните, что chown и chmod решают разные задачи. Иногда проблема доступа лежит в правах, а не во владельце, и достаточно изменить права, а не владельца. Сначала диагностируйте, потом меняйте. Перед массовыми изменениями делайте копию важных данных, а при сомнениях оставляйте всё как есть и обращайтесь к человеку, отвечающему за систему.