Как изменить владельца и права файлов в Linux: chown, chmod и find

При работе с сайтом на Linux-сервере иногда нужно изменить владельца файлов, группу или права доступа. Это бывает после переноса сайта, распаковки архива, восстановления резервной копии, работы скрипта от другого пользователя или некорректной настройки веб-сервера. Для этих задач обычно используются команды:

  • chown — изменить владельца и группу;
  • chmod — изменить права доступа;
  • find — применить разные права отдельно к файлам и каталогам.

Команды можно выполнять через SSH или непосредственно в терминале сервера.

Как посмотреть текущего владельца и права

Перед изменениями полезно сначала посмотреть текущее состояние файла или каталога:

				
					ls -la
				
			
Например:
				
					drwxr-xr-x  5 user www-data 4096 site
-rw-r--r--  1 user www-data 1250 index.php
				
			

Здесь:

  • user — владелец;
  • www-data — группа;
  • drwxr-xr-x и -rw-r—r— — права доступа.

Для конкретного файла:

				
					ls -l index.php
				
			

Как изменить владельца файла

Для изменения владельца используется chown. Синтаксис:

				
					chown пользователь файл
				
			
Например:
				
					sudo chown alex index.php
				
			

После этого владельцем index.php станет пользователь alex.

GNU chown позволяет изменять владельца, группу или оба значения одновременно

Как изменить владельца и группу

Указывается конструкция:
				
					chown пользователь:группа файл
				
			
Например:
				
					sudo chown alex:www-data index.php
				
			
Для каталога:
				
					sudo chown alex:www-data /var/www/example.com
				
			
Если нужно изменить только группу, владельца можно не указывать:
				
					sudo chown :www-data index.php
				
			

Как изменить владельца всех файлов и каталогов рекурсивно

Для обработки всего дерева используется параметр -R:
				
					sudo chown -R alex:www-data /var/www/example.com
				
			

Команда изменит владельца и группу самого каталога и всего содержимого внутри него.

Рекурсивное поведение chown -R предусмотрено как GNU Coreutils, так и POSIX. Перед выполнением такой команды особенно важно проверить путь. Ошибка вроде:

				
					sudo chown -R alex:www-data /
				
			
может изменить владельцев огромного количества системных файлов и фактически сломать систему.

Как изменить права доступа chmod

Для изменения прав используется команда chmod. Например:

				
					chmod 644 index.php
				
			
или:
				
					chmod 755 public
				
			

Числа обозначают комбинации прав:

  • 4 — чтение (read);
  • 2 — запись (write);
  • 1 — выполнение (execute).

Они складываются:

  • 7 = 4 + 2 + 1 — чтение, запись и выполнение;
  • 6 = 4 + 2 — чтение и запись;
  • 5 = 4 + 1 — чтение и выполнение;
  • 4 — только чтение.

Три цифры относятся соответственно к:

  • владельцу;
  • группе;
  • остальным пользователям.

Поэтому: 

  • 755
означает:
				
					владелец: читать + писать + выполнять
группа:   читать + выполнять
остальные: читать + выполнять
				
			

А:

  • 644

означает:

				
					владелец: читать + писать
группа:   читать
остальные: читать
				
			
chmod предназначен именно для изменения прав доступа к файлам и каталогам.

Почему для каталогов часто используют 755, а для файлов 644

Для обычного сайта часто встречается схема:
				
					каталоги: 755
файлы:    644
				
			

Причина в том, что каталог должен иметь право execute, чтобы пользователь мог переходить внутрь него и обращаться к находящимся там объектам.

Обычному PHP-, HTML- или CSS-файлу право выполнения обычно не требуется.

Но это не универсальное правило для любого сервера. Нужные права зависят от:

  • пользователя, под которым работает веб-сервер;
  • PHP-FPM; групп;
  • механизма деплоя;
  • задач приложения.

Поэтому не стоит механически выставлять 755/644 на всё, не понимая конфигурацию.

Как установить 755 только для папок

Если нужно изменить права каталогов, не затрагивая файлы:
				
					find /var/www/example.com -type d -exec chmod 755 {} \;
				
			
-type d означает только каталоги.

Как установить 644 только для файлов

Для файлов:
				
					find /var/www/example.com -type f -exec chmod 644 {} \;
				
			
Так можно получить распространённую схему:
				
					find /var/www/example.com -type d -exec chmod 755 {} \;
find /var/www/example.com -type f -exec chmod 644 {} \;
				
			
Это безопаснее, чем:
				
					chmod -R 755 /var/www/example.com
				
			
потому что последний вариант сделает исполняемыми также обычные файлы.

Как изменить владельца только файлов

Например:
				
					find /var/www/example.com -type f -exec chown alex:www-data {} \;
				
			
Только каталогов:
				
					find /var/www/example.com -type d -exec chown alex:www-data {} \;
				
			
Хотя если владелец должен быть одинаковым для всего сайта, проще использовать:
				
					sudo chown -R alex:www-data /var/www/example.com
				
			

Символьная запись chmod

Необязательно задавать права цифрами. Например:
				
					chmod u+x script.sh
				
			
добавит право выполнения владельцу.
				
					chmod g-w file.txt
				
			
уберёт право записи у группы.
				
					chmod o-r file.txt
				
			

уберёт право чтения у остальных пользователей. Обозначения:

  • u — owner/user;
  • g — group;
  • o — others;
  • a — all.

А действия:

  • + — добавить;
  • — — убрать;
  • = — установить точно заданные права.

Когда появляется Permission denied

Если при выполнении команды возникает:
				
					Permission denied
				
			
или:
				
					Operation not permitted
				
			

у текущего пользователя, скорее всего, недостаточно прав для изменения файла.

Попробуйте выполнить команду через sudo:

				
					sudo chown alex:www-data index.php
				
			
или:
				
					sudo chmod 644 index.php
				
			
Но sudo не следует использовать просто как способ «заставить команду работать». Сначала убедитесь, что меняете именно нужный объект.
				
					sudo chmod 644 index.php
				
			

Почему после загрузки или распаковки сайта меняется владелец

Такая ситуация часто возникает, когда файлы создаются разными процессами. Например:

  • файлы загружены одним SSH-пользователем;
  • PHP работает от другого пользователя;
  • архив распаковывался через административную панель сайта;
  • файл создал веб-сервер;
  • резервная копия восстанавливалась от root.

В итоге внутри одного сайта могут появиться разные владельцы. Это способно привести к ситуациям, когда:

  • CMS не может обновить файл;
  • WordPress не устанавливает плагин;
  • PHP не может записать кэш;
  • пользователь по SFTP не может удалить файл;
  • веб-сервер не может читать или изменять каталог.

Здесь правильное решение — не выдавать всему сайту 777, а разобраться, какой пользователь должен владеть файлами и какой группе действительно нужен доступ.

Почему chmod 777 — плохое решение

Иногда при ошибке доступа советуют выполнить:
				
					chmod -R 777 /var/www/example.com
				
			

Для рабочего сайта это почти всегда плохой подход. 777 разрешает чтение, запись и выполнение владельцу, группе и всем остальным пользователям системы.

Это не исправляет причину неправильного владельца или группы — только убирает ограничения доступа. Если сайт заработал только после 777, нужно выяснить:

  • от какого пользователя работает PHP;
  • кому принадлежат файлы; какая установлена группа;
  • какой процесс пытается писать в каталог.

После этого выставить минимально необходимые права.

Практический пример для сайта

Допустим, сайт находится здесь:
				
					/var/www/example.com
				
			

и должен принадлежать пользователю deploy, а веб-сервер работает с группой www-data. Владелец и группа:

				
					sudo chown -R deploy:www-data /var/www/example.com
				
			
Каталоги:
				
					find /var/www/example.com -type d -exec chmod 755 {} \;
				
			
Файлы:
				
					find /var/www/example.com -type f -exec chmod 644 {} \;
				
			
Это только пример. На конкретном сервере схема может быть другой.

Как проверить результат

После изменений:
				
					ls -la /var/www/example.com
				
			
Для отдельного файла:
				
					stat /var/www/example.com/index.php
				
			

Проверьте:

  • владельца;
  • группу;
  • права;
  • что сайт продолжает работать;
  • что приложение может записывать только туда, куда ему действительно нужно.

Главное

Для смены владельца:
				
					sudo chown user:group file
				
			
Рекурсивно:
				
					sudo chown -R user:group /path/to/site
				
			
Для изменения прав:
				
					chmod 644 file
chmod 755 directory
				
			
Отдельно для файлов и каталогов:
				
					find /path/to/site -type f -exec chmod 644 {} \;
find /path/to/site -type d -exec chmod 755 {} \;
				
			

И главное правило: не использовать chmod -R 777 как универсальное решение ошибок доступа. Сначала нужно определить правильного владельца, группу и требования конкретного приложения.

Свежие записи
Команда RD

Команда RD и RMDIR позволяют удалять как каталоги, так и

Команда RENAME

RENAME что это? Команда RENAME позволяет переименовать файл или каталог.

Команда MD

Команда md позволяет создавать каталог или промежуточные каталоги в указанном

SEO и диагностика сайтов
help2site
Оптимизация сайта

Оглавление SEO оптимизация. Что такое seo оптимизация. SEO оптимизация сайта – это тема сегодняшней статьи на блоге. Приветствую всех читателей и желаю всем успехов в изучении

CMS и сайты
help2site
Движок wordpress — первое знакомство.

Движок wordpress (вордпресс) – это тема сегодняшнего урока по курсу как сделать сайт на wordpress. В первом знакомстве с системой вордпресс мы поговорим только о функционале,

Разработка сайтов
help2site
Изучение HTML. Вёрстка сайта из PSD шаблона.

В данной статье речь пойдёт о сайтах, которые разработчики создают вручную, т. е. верстают. Статья предназначена для пользователей, знакомых с HTML и CSS. Также желательно знать хотя бы основы Adobe Photoshop

Windows и Windows Server
help2site
Как отключить стандартный брандмауэр Windows XP

У windows xp существует свой собственный фаервол. Кого-то он вполне устраивает, но из-за своей назойливости и навсегда стабильной работы, он не устраивает большинство пользователей. Чтобы

Разработка сайтов
help2site
Как правильно подключить шрифт от GoogleFonts

Используя пресеты шрифтов от google fonts разработчики редко заглядывают в код генерируемого css файла. А зря, там самое интересное.  Я хочу рассказать как избежать распространенных

Разработка сайтов
help2site
Работа с датами и временем на PHP

Рассмотрим, как работать с датами и временем в PHP. Время в Unix-компьютерах Для Unix-компьютеров начало отсчета времени –– полночь 1 января 1970 года. Любая дата