В ОС 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 — это простой инструмент для смены владельца и группы файла или папки. Она очень полезна при управлении правами доступа в системе.
Мы с вами на простых примерах рассмотрели, как легко можно изменить владельца или группу. А дополнительные опции как рекурсия, отдельный пользователь или переход по ссылкам, делают данный инструмент более гибким.