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

Если вам нужны высокоточные / быстрые вычисления / вычисления с плавающей запятой, вам может потребоваться использовать FFI и long double, поскольку собственный тип Haskell еще не реализован (см. https://ghc.haskell.org/ ПРОФ / GHC / билет / 3353 ).

7
задан 13 June 2009 в 13:29
поделиться

4 ответа

Из документации touch (coreutils):

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

6
ответ дан 6 December 2019 в 08:16
поделиться

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

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

Если вы хотите запретить кому-либо, кроме root, изменять файл, лучший способ - это чтобы использовать имя файла chattr + i в файле. Даже root не сможет выполнять с ним какие-либо действия, не запустив на нем chattr -i. Это относится к Linux, поэтому YMMV.

6
ответ дан 6 December 2019 в 08:16
поделиться

Вот соответствующий вывод: strace "touch test.txt"

open("test.txt", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = -1 EACCES (Permission denied)
futimesat(AT_FDCWD, "test.txt", NULL)   = 0

Он действительно получает ошибку "Permission denied error" в системном вызове open (2) относительно EACCES. См. Соответствующий раздел на странице руководства utimes (2) .

Тем не менее, ему удается обновить метку времени с помощью системного вызова futimesat (2) .

Как и другие, указано, похоже, что права доступа к каталогу имеют права на обновление меток времени доступа / moficiation.

Однако вы можете изменить атрибут файла на неизменяемый, используя:

chattr +i test.txt

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

5
ответ дан 6 December 2019 в 08:16
поделиться

Вы можете обновить время модификации, если вы являетесь владельцем файла, независимо от разрешения на запись. (Это не связано с какими-либо разрешениями для каталога.)

Из POSIX.1-2008:

Только процесс с эффективным идентификатором пользователя, равным идентификатору пользователя файла, или с правом записи в файл , или с соответствующими привилегиями может использовать futimens () или utimensat () с нулевым указателем в качестве аргумента раз или с обоими полями tv_nsec , установленными на специальное значение UTIME_NOW . Только процесс с эффективным идентификатором пользователя, равным идентификатору пользователя файла или с соответствующими привилегиями, может использовать futimens () или utimensat () с ненулевым аргументом раз, который делает не имеют для обоих полей tv_nsec значения UTIME_NOW и не имеют для обоих полей tv_nsec значения UTIME_OMIT . Если в обоих полях tv_nsec задано значение UTIME_OMIT , проверка прав собственности или прав для файла выполняться не будет, но другие условия ошибки все равно могут быть обнаружены (включая ошибки [EACCES], связанные с префикс пути).

5
ответ дан 6 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: