Когда chmod терпит неудачу?


8

При каких обстоятельствах не получится chmod?

Я посмотрел на справочную страницу, но она только определяет использование и не дает подробностей о том, в каких обстоятельствах он не будет работать.

Я предполагаю, chmodбудет работать, если:

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

Могут ли пользователи использовать chmodдля изменения прав доступа к файлу, к которому у них есть групповой доступ? Это связано с доступом на чтение / запись?


2
Это не удастся, если индекс не может быть изменен, например, файловая система только для чтения.
Иордания

Ответы:


3

Только владелец файла или пользователь root может изменять права доступа к файлу. Текущие разрешения для файла или его родительского каталога не имеют значения¹. Это указано в POSIX :

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

В большинстве устройств «соответствующие привилегии» означают запуск от имени пользователя root. Если эти условия не выполняются, chmodобычно происходит сбой EPERM, хотя разрешены другие действия, такие как прерывание программы из-за нарушения безопасности.

Кроме того, некоторые варианты Unix имеют специфичные для системы способы авторизации или запрета chmod. Например, в Linux есть функция ( CAP_FOWNER), которая позволяет процессам изменять права доступа к файлу и другие метаданные независимо от его владельца.

Существуют и другие причины, по которым chmodможет произойти сбой, даже если файл существует, доступен и имеет соответствующего владельца. Общие включают файловую систему только для чтения или файловую систему, которая не поддерживает разрешения, такие как FAT. Менее распространенные из них включают специфичные для системы ограничения, такие как неизменяемый атрибут в файловой системе ext2 Linux и его преемники.

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


2

Сведения, которые вы хотите, находятся на странице руководства для системного вызова chmod (). Вместо man chmodиспользования man 2 chmod. man chattrи man 2 setxattrбудет вас интересовать; атрибуты файла, которые устанавливает chattr / setxattr (), увеличивают поведение традиционных прав доступа Unix, установленных chmod.


Я попробую это, когда уйду с работы.
Wug

1

Согласно стандарту UNIX, «эффективный идентификатор пользователя процесса должен соответствовать владельцу файла, или процесс должен иметь соответствующие привилегии для того, чтобы сделать это».

Немного о соответствующих привилегиях требует пояснения. В традиционных системах chmod разрешен для всех файлов, когда эффективный UID (в Linux UID файловой системы, но см. Ниже) процесса равен 0 [то есть root].

В Linux есть система, называемая возможностями , и CAP_FOWNERбит контролирует возможность использования chmodвсех файлов. По умолчанию все возможности предоставляются, когда execve()вызов создает корневой процесс (либо путем выполнения двоичного файла setuid, либо когда реальный UID равен 0), либо когда эффективный UID установлен в 0 (и удаляется, когда для него установлено ненулевое значение). и набор возможностей, в том числе CAP_FOWNERвключается, когда UID файловой системы установлен в 0 (и отключен, когда для него установлено ненулевое значение). Прочитайте man-страницу для более подробной информации.

Вы упомянули залипший бит, но пропустили тот факт, что пользователи также не могут устанавливать бит setgid для файла, когда они не входят в группу, которая назначена этому файлу. Бит setuid или setgid также может игнорироваться в дополнительных обстоятельствах, определенных реализацией.


0

Могут ли пользователи использовать chmod для изменения прав доступа к файлу, к которому у них есть групповой доступ?

Почему бы тебе просто не попробовать и посмотреть?

$ touch foo
$ sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw----  1 root  staff  0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted

Я ткнул в это, но это связано с безопасностью, и я не хочу случайно пропустить крайний случай.
Wug

Если вы беспокоитесь о крайнем случае, вы можете (по крайней мере, чтобы минимизировать риски) сделать chmod, а затем проверить разрешения для него. Если вы чувствуете себя параноиком, сделайте это fsyncперед проверкой.
нанофарад
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.