Команда chown Linux: пример использования и основные моменты.

В ОС Linux всё объекты — это файлы. Чтобы управлять доступом к этим файлам, система позволяет менять владельца и группу файла.

Это важно для общей безопасности системы и правильной работы программ. В этой статье я расскажу, что такое команда chown в Linux, как её использовать и приведу простые примеры.

Что такое команда chown в Linux?

Команда chown используется для изменения владельца файла или директории, а также группы, к которой он принадлежит. Когда вы создаёте файл в Linux, его владельцем становится тот пользователь, от имени которого он создан, а группа — основная группа этого пользователя. Но иногда нужно изменить владельца или группу — для этого используют команду chown.

Основной синтаксис команды

chown имя_пользователя[:имя_группы] путь/к/файлу

Например, чтобы сменить владельца файла на пользователя waky_user:

[root@waky example]# ll test_dir
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]# chown waky_user test_dir/file_1.txt
[root@waky example]# ll test_dir
total 0
-rw-r--r-- 1 waky_user root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root      root 0 Jun  2 14:55 file_2.txt
[root@waky example]#

У нас есть директория test_dir в которой два файла, file_1.txt и file_2.txt соответственно. До использования chown оба принадлежат пользователю и группе root.
Мы используем chown чтобы сменить владельца первого файла. При второй проверке видно, что у  file_1.txt теперь владелец waky_user, а значит у него теперь есть доступ к файлу.

Если нужно изменить и группу вместе с владельцем, пишите через двоеточие:

[root@waky example]# chown waky_user:waky_group test_dir/file_2.txt
[root@waky example]# ll test_dir
total 0
-rw-r--r-- 1 waky_user root       0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 waky_user waky_group 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Мы установили для второго файла и владельца и группу.

Основные опции команды chown

  • -R или –recursive — применяет изменения ко всем файлам внутри директории и её поддиректорий
  • –from — вносит изменения только для файлов с определенным владельцем/группой.
  • -c или –changes — показывает список изменений после выполнения команды.
  • -f или –silent — минимальный вывод, скрывает сообщения об ошибках.
  • –dereference — меняет права у файла, на который ссылается символическая ссылка.
  • -h или –no-dereference — не трогает файлы по ссылкам, только сами ссылки.
  • -H – переход по символической ссылке на директорию
  • -L – переходить по всем символическим ссылкам на директории
  • -P – запрет на переход по символическим ссылкам на директории

Примеры использования команды chown

Простая смена владельца файла

Мы хотим сменить только владельца файла:

[root@waky example]# chown root test_dir/file_1.txt
[root@waky example]# ll test_dir
total 0
-rw-r--r-- 1 root      root       0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 waky_user waky_group 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Смена владельца и группы файла

Нам нужно сменить и владельца и группу:

[root@waky example]# chown root:root test_dir/file_2.txt
[root@waky example]# ll test_dir
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Изменение владельца у папки и её содержимого (рекурсивно)

У нас есть директория и в ней два файла. У всех них пользователь и группа – root :

[root@waky example]# ll
total 15364
drwxr-xr-x 2 root  root        42 Jun  2 14:55 test_dir
[root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Если мы применим смену пользователя/группы только к директории test_dir, ее содержимое сохранит свои прежние настройки:

[root@waky example]# chown waky_user:waky_group test_dir/
[root@waky example]# ll
total 15364
drwxr-xr-x 2 waky_user waky_group       42 Jun  2 14:55 test_dir
 [root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Поменялся владелиц и группа у директории, но файлы остались без изменения. Чтобы изменения коснулись не только самой директории, но и всего ее содержимого, используйте рекурсию -R:

[root@waky example]# chown -R waky_user:waky_group test_dir/
[root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 waky_user waky_group 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 waky_user waky_group 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Смена только определенного владельца или группы

Обновление только тех файлов, у которых текущий владелец —  waky_user:

[root@waky example]# chown -R --from=waky_user:waky_group root:root test_dir/
[root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Команда изменит владельца и группу для директории и содержимого (рекурсивно), для файлов у которых владелец waky_user и группа waky_group. Можно использовать и по-отдельности.

[root@waky example]# chown -R --from=:waky_group root:root test_dir/
[root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Так мы сменили владельца и группу для файлов из группы waky_group.

[root@waky example]# chown -R --from=root: :waky_group test_dir/
[root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 root waky_group 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root waky_group 0 Jun  2 14:55 file_2.txt
[root@waky example]# 

А теперь мы изменили группу на waky_group, там, где пользователь root.

Вывод изменений в результате работы команды

Если мы хотим увидеть, какие изменения и с какими файлами произошли используем -c:

[root@waky example]# chown -R -c waky_user test_dir/
changed ownership of 'test_dir/file_1.txt' from root to waky_user
changed ownership of 'test_dir/file_2.txt' from root to waky_user
changed ownership of 'test_dir/' from root to waky_user
[root@waky example]#

Работа с символическими ссылками

У нас есть вторая директория test_dir_2, в которой есть как обычные файлы, так и символические ссылки на файлы из первой директории. Убедимся что в обоих директориях все файлы принадлежат root:

[root@waky example]# chown -R root:root test_dir/ test_dir_2/
[root@waky example]# ll test_dir
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]# ll test_dir_2/
total 0
-rw-r--r-- 1 root root  0 Jun  2 15:51 file_3.txt
-rw-r--r-- 1 root root  0 Jun  2 15:51 file_4.txt
lrwxrwxrwx 1 root root 22 Jun  2 16:00 link_to_file_1 -> ../test_dir/file_1.txt
lrwxrwxrwx 1 root root 22 Jun  2 16:00 link_to_file_2 -> ../test_dir/file_2.txt
[root@waky example]# 

Сменим пользователя для test_dir_2:

[root@waky example]# chown -R --no-dereference waky_user test_dir_2/
[root@waky example]# ll test_dir_2/
total 0
-rw-r--r-- 1 waky_user root  0 Jun  2 15:51 file_3.txt
-rw-r--r-- 1 waky_user root  0 Jun  2 15:51 file_4.txt
lrwxrwxrwx 1 waky_user root 22 Jun  2 16:00 link_to_file_1 -> ../test_dir/file_1.txt
lrwxrwxrwx 1 waky_user root 22 Jun  2 16:00 link_to_file_2 -> ../test_dir/file_2.txt
[root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root root 0 Jun  2 14:55 file_2.txt
[root@waky example]#

Команда сменила пользователя для файлов и ссылок, но владелиц файлов на которые ссылаются ссылки остался без изменений.

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

Правда, в данном случае аргумент –no-dereference избыточен, так как командаchown по умолчанию придерживается такого правила.

Сменим группу для файлов источников:

[root@waky example]# chown -R --dereference -H :waky_group test_dir_2/
[root@waky example]# ll test_dir_2/
total 0
-rw-r--r-- 1 waky_user waky_group  0 Jun  2 15:51 file_3.txt
-rw-r--r-- 1 waky_user waky_group  0 Jun  2 15:51 file_4.txt
lrwxrwxrwx 1 waky_user root       22 Jun  2 16:00 link_to_file_1 -> ../test_dir/file_1.txt
lrwxrwxrwx 1 waky_user root       22 Jun  2 16:00 link_to_file_2 -> ../test_dir/file_2.txt
[root@waky example]# ll test_dir/
total 0
-rw-r--r-- 1 root waky_group 0 Jun  2 14:55 file_1.txt
-rw-r--r-- 1 root waky_group 0 Jun  2 14:55 file_2.txt
[root@waky example]#

В результате, в директории test_dir_2 группа сменилась только для файлов, у ссылок осталась прежняя. В директории test_dir сменилась группа у изначальных файлов, на которые ссылались ссылки.

Заключение

Команда chown в Linux — это простой инструмент для смены владельца и группы файла или папки. Она очень полезна при управлении правами доступа в системе.

Мы с вами на простых примерах рассмотрели, как легко можно изменить владельца или группу. А дополнительные опции как рекурсия, отдельный пользователь или переход по ссылкам, делают данный инструмент более гибким.