Почему я могу «дотронуться» до файла, защищенного от записи? - PullRequest
7 голосов
/ 13 июня 2009

Почему возможно touch файл с защитой от записи?

Не должны ли следующие ошибки выдать ошибку?

$ touch test.txt
$ chmod a-w test.txt
$ ls -l test.txt
-r--r--r-- 1 name group 0 Jun 13 09:14 test.txt
$ touch test.txt && echo OK
OK
$ ls -l test.txt
-r--r--r-- 1 name group 0 Jun 13 09:15 test.txt

Меняет ли touch права доступа, трогает файл и обратно меняет разрешения? Зачем это делать?

Учитывая такое поведение, если я действительно хочу защитить файл, чтобы я (мой пользователь) никогда (непреднамеренно) никогда не изменял, не удалял или не изменял его временную метку - как я могу это сделать?

(Извините, не строго связано с программированием, но немного и, вероятно, представляет интерес для многих программистов.)

Ответы [ 5 ]

6 голосов
/ 13 июня 2009

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

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

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

6 голосов
/ 13 июня 2009

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

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

5 голосов
/ 13 июня 2009

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

Из POSIX.1-2008:

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

5 голосов
/ 13 июня 2009

Вот соответствующий вывод: 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

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

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

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

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

chattr +i test.txt

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

0 голосов
/ 27 сентября 2014

С точки зрения непрофессионала, использование сенсорной команды обновит или создаст файл без редактирования / изменения его содержимого. Поскольку команда не (и не может) что-либо записывать или удалять из файла, ее можно использовать для файлов, защищенных от записи. См. Вики по команде touch для получения дополнительной информации: http://en.wikipedia.org/wiki/Touch_(Unix)

...