Freebsd сменить владельца файла

Обновлено: 03.07.2024

Права доступа к файлам и директориям в Linux

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

Эти три свойства можно настроить отдельно для:

  • пользователя (владельца файла)
  • группы
  • всех остальных

То есть к примеру для владельца файла можно установить право чтения, записи и выполнения файла; для этого же файла для группы можно установить только право чтения; а для всех остальных можно установить полный запрет доступа.

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

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

Каждый пользователь может быть в одной или более группах.

Команда chown

Команда chown используется для изменения владельца и группы владельцев файла или директории. Для использования этой команды требуются привилегии суперпользователя. Синтаксис chown выглядит примерно так:

chown может поменять владельца файла, либо группа владельцев, либо оба этих значения.

Аргумент Результат
bob Меняет владельца файла с текущего на пользователя bob.
bob:users Меняет владельца файла с текущего владельца на пользователя bob и меняет группу владельцев на группу users.
:admins Меняет группу владельцев на группу admins. Владелец файла не меняется.
bob: Меняет владельца файла с текущего на владельца с именем пользователя bob и меняет группу владельцев на группу, с которой совершил вход пользователь bob — обычно это основная группа пользователя.

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


Здесь мы видим, что пользователь root копирует файл из своей домашней директории в директорию пользователя mial. Затем root меняет владельца файла с root (результат использования sudo) на mial. Использование двоеточия без указания имени группы также меняет группу владельцев на основную группу пользователя mial.

Как поменять владельца только для файлов, с определённым владельцем или группой владельцев

Возможно ситуация, когда в директорию, где уже находились файлы, скопировали несколько файлов и нужно изменить владельца и/или группу только для этих файлов, а остальные файлы оставить нетронутыми. В этом случае для фильтрации применяется опция --from=ТЕКУЩИЙ_ВЛАДЕЛЕЦ:ТЕКУЩАЯ_ГРУППА. Эта опция изменяет владельца и/или группу каждого файла только если текущий владелец и/или группа совпадают с указанными. Как группа, так и владелец могут быть опущены; в этом случае совпадение для данного атрибута не обязательно.

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

Если вам нужно скопировать значения владельцев и группы владельцев одного файла на другой файл, то используйте опция --reference=ФАЙЛ_ОБРАЗЕЦ. В этом случае вместо указанных значений ВЛАДЕЛЕЦ:ГРУППА будут использоваться владелец и группа ФАЙЛА_ОБРАЗЦА.

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

Для рекурсивного изменения владельца и/или группы владельцев используйте опцию -R.

Следующие параметры влияют на способ обхода дерева каталогов при заданном параметре -R. Если указано несколько этих параметров, действует только последний.

-H

если аргумент командной строки является символьной ссылкой на каталог, перейти по ней

-L

переходить по любой встреченной символьной ссылке на каталог

-P

не переходить по символьным ссылкам (по умолчанию)

Программа chgrp для смены группы владельцев

В более старых версиях Unix команда chown изменяла только владельца файла, а не группы. Для этого была использована отдельная команда, chgrp. Это работает почти так же, как chown, за исключением того, что у неё меньше опций.

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

Безусловно, это может сделать root.
Поменять владельца файла не может никто, кроме root'а.
А вот группу для файла может, также, поменять сам владелец файла, но только в том случае, если он сам является членом этой (новой) группы.

Для изменения владельца файла служит команда chown ("change owner"). С ее помощью можно заодно заменить и группу, хотя для изменения этого атрибута есть специальная команда chgrp ("change group").

Подробно об этих командах можно прочитать в соответствующих man'уалах ( man chown и man chgrp ). Поэтому, рассмотрим только их краткое описание.

Команда chown выглядит очень просто если же вы хотите поменять не только владелец, но и группу, то

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

Ну и, конечно, если вы хотите заменить владельца (группу) сразу на нескольких файлах, вместо имени файла можно указать подходящий "шаблон", например "*" (выполнить операцию для всех файлов в текущей директории).

Если же вы хотите, чтобы аналогичная операция была проделана не только в текущей директории, но и во всех "нижележащих" поддиректориях, вам поможет ключ -R (recursively).

заменит владельца на vasia , а группу на users для всех файлов и поддиректорий, находящихся в текущей директории и "ниже", то есть в самих поддиректориях.

Команда chgrp очень похожа не предыдущую, толко в качестве первого аргумента ей нужно указать название новой группы для файла (или файлов).

Естественно, все что было сказано о команде chown относительно выполнения ее над несколькими файлами и о ключе -R , также относится и к команде chgrp .

Права доступа (permissions)

Итак, для изменения прав доступа (permissions) служит команда chmod ("change mode"). В целом эта команда выглядит как и предыдущие (которые меняют владельца и группу)

Но, в отличии от предыдущих команд, второй аргумент ("что сделать") имеет несколько более сложный вид. В нем можно выделить три части

"категория юзеров" "операция" "биты прав доступа" u (user) владелец
g (group) группа
o (other) все остальные
a (all) все три категории -
+
= r
w
x
s или t

Как понятно из таблицы, первой задается категория юзеров (владелец, группа или "все остальные"). Причем, можно поставить сразу несколько букв, обозначив тем самым сразу несколько категорий. Например, go будет означать, что права меняются сразу и для группы и для "всех остальных". Если надо изменить права сразу для трех категорий, можно написать три буквы - ugo или одну букву a (все три категории).

Следом указывается "операция" (добавить права или наоборот - убрать). И, наконец, после "операции" один или несколько битов доступа, которые требуется изменить. Значение этих битов подробно рассматривалось выше, поэтому здесь не будем на них останавливаться.

Некоторых пояснений, наверное, требует "операция". Как можно догадаться, знаки "-" и "+" означают "убрать" или "поставить" соответствующие права.

А знак " остальные", но никак не повлияет на биты r и w для этой же категории. А указав действие как o=rx , вы тем самым скажете системе - "установить биты r и x , и убрать бит w , если он там был".

Бит s имеет разный смысл ( suid или sgid ) в зависимости от того, в какой части permissions он находится. Поэтому, если вы хотите поставить именно suid бит, то "что сделать" должно выглядеть как u+s , а если вам нужен sgid , то - g+s . Sticky бит ставится командой chmod a+t . .

Как видите, синтаксис этой команды достаточно гибкий (хотя и несколько сложноватый). Кроме того, второй аргумент ("что сделать") может состоять из нескольких "действий" перечисленных через запятую.

Например, можно задать команду

это будет означать - "для всех категорий права r-x , а для владельца еще и w (право записи)".

Кроме того, команда chmod (точнее - ее первый аргумент) имеет еще одну форму.

Поскольку, все биты доступа это действительно двоичные биты из одной ячейки, "продвинутый" пользователь может указать сразу число (в восьмеричном виде) которое должно получится после изменения прав.

Восьмеричное представление выбрано потому, что при переводе в него двоичного числа, каждая группа из трех бит "сворачивается" в одну цифру. Таким образом, вам надо просто указать три цифры, каждая из которых описывает отдельную категорию юзеров (точнее - права для этой категории). Например, permissions rwxr-xr-x можно представить в восьмеричном виде как 755 . И, следовательно, такие права могут быть выставлены командой

Что касается выполнения этой операций над несколькими файлами или "рекурсивного" обхода всех поддиректорий, здесь все так же, как для команд chown, chgrp . В качестве имени файла может быть задан "шаблон", а для обхода всех поддиректорий используйте ключ -R .

И, конечно, я советую все таки прочитать man chmod .

Флаги.

Кто может менять флаги (и какие) подробно описывалось в разделе о флагах.

Команда, которая их ставит/убирает - chflags ("change flags"). Формат ее достаточно простой

  • sappend - sappnd
  • uappend - uappnd
  • sunlink - sunlnk
  • uunlink - uunlnk
  • simmutable - schange или schg
  • uimmutable - uchange или uchg
  • arcived - arch
  • (флаг nodump не сокращается :-)

Для того, чтобы убрать флаг, надо указать его название с префиксом no - nosappnd, nosunlnk, noschg и т.п.

Исключение составляет флаг nodump . Чтобы его убрать нужно сказать не nonodump , а просто dump . :-)

Естественно, как и предыдущие команды chflag s может применяться к нескольким файлам и "рекурсивно" обходить поддиректории (ключ тот же - -R ).

Команда Chown в Linux

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

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

Как пользоваться chown

Прежде чем перейти к использованию chown команды, давайте начнем с обзора основного синтаксиса.

В chown выражении команды принимает следующий вид:

USER является именем пользователя или идентификатором пользователя (UID) нового владельца. GROUP это имя новой группы или идентификатор группы (GID). FILE(s) это имя одного или нескольких файлов, каталогов или ссылок. Числовые идентификаторы должны начинаться с + символа.
  • USER - Если указан только пользователь, указанный пользователь станет владельцем данных файлов, владение группой не изменится.
  • USER: - Когда за именем пользователя следует двоеточие : , а имя группы не указывается, пользователь становится владельцем файлов, а принадлежность группы файлов изменяется на группу входа пользователя.
  • USER:GROUP - Если указаны и пользователь, и группа (без пробелов между ними), пользовательское владение файлами изменяется на данного пользователя, а групповое владение изменяется на данную группу.
  • :GROUP - Если пользователь не указан, а перед группой стоит двоеточие : , то только группа, владеющая файлами, будет изменена на данную группу.
  • : Если задано только двоеточие : , без указания пользователя и группы, никаких изменений не производится.

По умолчанию в случае успеха chown не выводит никаких данных и возвращает ноль.

Используйте ls -l команду, чтобы узнать, кому принадлежит файл или к какой группе принадлежит файл:

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

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

Чтобы изменить владельца файла, используйте chown команду, за которой следует имя пользователя нового владельца и целевой файл в качестве аргумента:

Например, следующая команда изменит владельца файла с именем file1 на нового владельца с именем linuxize :


Чтобы изменить владельца нескольких файлов или каталогов, укажите их в виде списка через пробел. Команда ниже меняет владельца файла с именем file1 и каталогом dir1 на нового владельца с именем linuxize :


Числовой идентификатор пользователя (UID) можно использовать вместо имени пользователя. Следующий пример изменит владельца файла с именем file2 на нового владельца с UID 1000 :


Если в качестве имени пользователя существует числовой владелец, то владение будет перенесено в имя пользователя. Чтобы избежать этого префикса, идентификатор с помощью + :

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

Чтобы изменить владельца и группу файла, используйте chown команду, за которой следует новый владелец и группа, разделенные двоеточием ( : ) без промежуточных пробелов и целевого файла.

Следующая команда изменит владельца файла с именем file1 на нового владельца с именем linuxize и группой users :

Если вы опустите имя группы после двоеточия ( : ), группа файла изменится на группу входа указанного пользователя:

Как изменить группу файла

Чтобы изменить только группу файла, используйте chown команду с двоеточием ( : ) и именем новой группы (без пробелов между ними) и целевой файл в качестве аргумента:

Следующая команда изменит группу-владельца файла с именем file1 на www-data :

Еще одна команда, которую вы можете использовать для изменения групповой принадлежности файлов - это chgrp .

Как изменить владельца символических ссылок

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

Например, если вы попытаетесь изменить владельца и группу символической ссылки, на symlink1 которую указывает ссылка /var/www/file1 , chown изменит владельца файла или каталога, на который указывает символическая ссылка:

Скорее всего, вместо смены целевого владельца вы получите ошибку «невозможно разыменовать symlink1: Permission denied».

Ошибка возникает из-за того, что по умолчанию в большинстве дистрибутивов Linux символические ссылки защищены, и вы не можете работать с целевыми файлами. Эта опция указана в /proc/sys/fs/protected_symlinks . 1 значит включен и 0 отключен. Мы рекомендуем не отключать защиту символических ссылок.

Чтобы изменить групповое владение самой символической ссылкой, используйте -h параметр:

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

Чтобы рекурсивно работать со всеми файлами и каталогами в данном каталоге, используйте параметр -R ( --recursive ):

Следующий пример изменит владельца всех файлов и подкаталогов в /var/www каталоге на нового владельца и группу с именем www-data :

Если каталог содержит символические ссылки, передайте -h опцию:

Другими параметрами, которые можно использовать при рекурсивном изменении владельца каталога, являются -H и -L .

Если аргумент, переданный chown команде, является символической ссылкой, указывающей на каталог, эта -H опция заставит команду пройти по ней. -L указывает chown на прохождение каждой символической ссылки в каталог, который встречается. Обычно вы не должны использовать эти параметры, потому что вы можете испортить вашу систему или создать угрозу безопасности.

Использование справочного файла

--reference=ref_file Опция позволяет изменить пользователя и группы владельца указанные файлы , чтобы быть такими же , как в указанном отпечатком ( ref_file ). Если ссылочный файл является символической ссылкой, chown будут использоваться пользователь и группа целевого файла.

Например, следующая команда назначит пользователя и владельца группы file1 для file2

Вывод

chown утилита командной строки Linux / UNIX для изменения владельца файла и / или группы

Чтобы узнать больше о chown команде, посетите страницу руководства chown или введите man chown свой терминал.

Права доступа играют важную роль в формировании концепции безопасности ОС. В FreeBSD права доступа являются довольно простыми, в отличии от операционной системы Windows, где есть восходящее, нисходящее наследование. Конечно, такая гибкость в установлении прав доступа к определённым ресурсам это положительный момент, но слишком сложная система выставления прав может привести к серьёзной ошибке, что в свою очередь может скомпрометировать систему в целом.
В операционной система FreeBSD существует всего три стандартных флага (так же имеются специальные флаги), которые определяют те или иные права доступа:
r – чтение
w – запись
x – выполнение

Данные флаги применяются к следующим трём категориям:
u - Пользователь (owner)
g - Группа (group)
o - Другие (other)

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

Для просмотра установленных прав доступа, соответствующего владельца и группы на какой-либо ресурс используется команда ls(1) с опцией -l:

Как видно из примера, каталог имеет для владельца (atrium) права на чтение, запись и выполнение, для группы (wheel) права на чтение и выполнение, для всех остальных пользователей права доступа отсутствуют.

Для того чтобы понимать все тонкости прав доступа важно уяснить порядок их проверки:

1.Первоначально проверяется не является ли пользователь владельцем файла и если он таковым является, определяются его права и дальше проверка прав доступа не идёт, т.е если даже пользователь состоит в группе у которой права намного ниже чем у владельца, права группы даже не будут проверяться. Если пользователь является владельцем ресурса и для него не определены какие-либо права, то доступ запрещается.

Пример:
Пользователь atrium является владельцем определённого файла и состоит в группе wheel. Права доступа на файл определены как rwx-r-x----, т.е владелец файла может записывать, исполнять, читать файл, а группа только читать и исполнять. Далее попробуем произвести запись в файл:

Как видим запись в файл произошла успешно.

2.Если пользователь не является владельцем файла, то проверятся, не состоит ли он в группе, которая имеет права доступа к ресурсу, если это так, то система определяет права доступа пользователю соответствующие правам группы. Если пользователь состоит в группе и для группы отсутствуют права, то доступ запрещается.

3.Далее, если пользователь не является владельцем файла и не состоит в группе, которая имеет доступ к файлу, то ему назначаются права определённые для других.

4.Особо проверяются права доступа для пользователя root. Если система видит, что пользователь имеет UID = 0, что соответствует root, независимо от login_name, то система вообще не проверяет права доступа к ресурсу, так как пользователь root имеет неограниченный доступ к системе.

Виды представления прав доступа:

Права доступа можно представить как в цифровом виде, так и в символьном.

1. Цифровой вариант

Так как права доступа назначаются трём категориям, и имеется три вида прав доступа, в результате всего назначается девять флагов:

(111 – 111 -111) – соответствует правам доступа 777.

Представление прав доступа основано на двоичной системе. Т.е каждой категории можно назначит три флага – чтение (r), запись (w), выполнение (x), что соответствует (111). 1 означает присутствие того или иного флага, 0 – соответственно отсутствие того или иного флага.

Для перевода двоичной системы в десятичную используется следующая таблица соответствия, читается она справа налево:

128 64 32 16 8 4 2 1

Управление правами доступа во FreeBSD

Как же нам перевести наши права доступа в десятичную систему? Давайте потренируемся.
Назначим файлу с именем test.txt следующие права доступа:

Теперь переведём полученные цифры:

u(user) – 111 – смотрим нашу таблицу соответствия справа налево, данной последовательности соответствуют цифры – 124, далее полученные цифры суммируем и получаем – 1+2+4 = 7
g(group) – 101 – проделываем то же самое – 1+4 = 5
o(other) – 100 – проделываем то же самое – 4 = 4

В результате наши права доступа на файл выглядят следующим образом – 754 и их можно назначить с помощью команды chmod(1).

Для обратного перевода, цифрового значения в двоичное, необходимо разделить на 2, остаток при делении соответствует единице, если деление без остатка – 0, записывается справа налево.


Так же для облегчения запоминания составим таблицу соответствующую цифровому представлению прав доступа:

Как видно из составленной таблицы для того чтобы назначить права доступа на ресурс для той или иной категории, всего лишь необходимо сложить права доступа данной категории между собой. Т.е нам, к примеру, необходимо назначить следующие права доступа на файл:

1.Для владельца - чтение, запись, выполнение
2.Для группы – чтение и запись
3.Для других – чтение

Владелец: 0400 + 0200 + 0100 = 0700
Группа: 0040 + 0020 = 0060
Другие: 0004 = 0004

В итоге мы получаем права доступа для файла – 764, данные права можно назначить с помощью команды chmod(1).

2. Символьный вариант

Символьный вариант назначения прав доступа запомнить довольно легко. При данном способе назначения прав доступа учитываются четыре категории:
a - Все (all) (ugo)
u - Владелец (owner)
g - Группа (group)
o - Другие (other)

Для этих трёх категорий назначаются права доступа:
r – право на чтение [см. Таблица 1.4]
s – для u (owner) – setuid бит, для g (group) – setgid бит [см. Таблица 1.5]
t – stick бит [см. Таблица 1.5]
w – право на запись [см. Таблица 1.4]
x – право на выполнение [см. Таблица 1.4]

Над правами, описание которых представлено выше возможно выполнение следующих операций:
+ - добавляет указанные права доступа для той или иной категории
- - удаляет указанные права доступа для той или иной категории
= - назначает указанные права доступа, при этом отменяя предыдущие для той или иной категории

При назначении прав доступа с помощью символьного варианта, категории разделяются символом запятая (,). Для примера, файл имеет права доступа (rw- r— rw--), назначим ему следующие права доступа (rwx --x –w-):

или можно по-другому

Способов довольно много, как говорится, всё зависит от вашей фантазии, мне больше нравится в цифровом варианте.


Так же помимо стандартных прав доступа – чтение, запись, выполнение существуют специальные права доступа, их можно назначить как в символьном, так и в цифровом варианте:

Важно!
Права, на каталог по своему действию отличаются от прав, установленных на файл:

1.Право записи установленное на каталог для группы, владельца или других позволяет удалить в нём любой файл в независимости от владельца и установленных на него прав доступа, поэтому с правом записи на каталог будьте весьма осторожны. Для решения данной проблемы можно использовать специальный флаг – Stick бит (1000), приведённый в таблице 1.5.

2.Право выполнения установленное на каталог позволяет применение для него команды ls(1) с ключом ‘–l', команды cd(1) так как происходит обращение к метаданным файлов.

3.Право чтения для каталога позволяет получить список файлов без подробной информации о них.

4.Права чтения и выполнения для каталога действуют независимо друг от друга, т.е наличие обоих прав доступа необязательно. Комбинацией данных прав доступа можно получить довольно интересные результаты:
При установленном праве выполнения на каталог, без права чтения позволяет создать так называемый “тёмный” каталог. Что это такое? В данном каталоге отсутствует возможность получить листинг находящихся в нём файлов, но имеется возможность обращаться к файлам, если их имена заранее известны. К примеру, создадим тёмный каталог и попытаемся получить листинг файлов в нём и прочитать один из файлов с заранее известным именем:

Установленные права доступа на тот или иной ресурс может изменить только владелец или суперпользователь с UID = 0.

Предопределение прав доступа

Существует весьма полезная команда umask(2), она задаёт маску на вновь создаваемые файлы в системе. Данную команду Вы можете встретить не только в ОС FreeBSD, но так же и в различном ПО (Samba….). В ПО она может применяться и для каталогов, но существует различие в способе высчитывания прав доступа для каталогов и файлов, которые определяет данная команда. Формат команды весьма прост, задаются три цифры, которые затем поочерёдно вычитаются из 7, если команда определяет права для каталогов и из 6, если команда определяет права для файлов. Для примера в ОС FreeBSD вы задаёте маску 240, это позволит задать права доступа на вновь создаваемые файлы 426, т.е в символьном представлении r---w-rw-:

Для работы с правами доступа и изменения владельцев, групп будут полезны следующие команды:

chmod(1) – изменения прав доступа к тому или иному ресурсу.
chown(8) – изменение группы и владельца ресурса.
chgrp(1) – изменение группы ресурса.
ls(1) – чтение каталога и получение различной подробной информации.
stat(1) – получение статистической информации о файле, весьма полезная команда.
umask(2) – задаёт маску на создаваемые файлы для пользователя.

Практика:
(Для более подробной информации о командах обязательно читайте маны)

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

Читайте также: