Могу ли я предотвратить изменение любого файла программой Perl? - PullRequest
1 голос
/ 19 июня 2020

Я пишу сценарии в Perl 5.18 и bash, под BSD unix, на MacBook Pro.

Команда bash set -o noclobber глобально защитит меня от случайной замены любого файл с использованием cat, даже если у меня есть разрешение на запись. Но, как мы видим ниже, это не мешает мне изменять этот файл.

> find z
find: z: No such file or directory
> set -o noclobber
> echo DOG > z
> ls -lT z
-rw-r--r--  1 BNW  staff  4 Jun 19 10:36:05 2020 z
> echo DOG > z
-bash: z: cannot overwrite existing file
> ls -lT z
-rw-r--r--  1 BNW  staff  4 Jun 19 10:36:05 2020 z
> echo DOG >> z
> ls -lT z
-rw-r--r--  1 BNW  staff  8 Jun 19 10:36:28 2020 z
> cat z
DOG
DOG
> perl -pi -e 'use strict; use warnings; s/D/W/g; ' z
> ls -lT z
-rw-r--r--  1 BNW  staff  8 Jun 19 10:59:16 2020 z
> cat z
WOG
WOG

Есть ли глобальная настройка, которую можно поместить в конкретный скрипт, bash или perl, что-то вроде set -o notouch, что аналогичным образом предотвратит случайное изменение каким-либо файлом сценарием? Я не хочу менять права доступа к файлу; Мне нужен «предохранительный выключатель» в самом верху моего скрипта, чтобы предотвратить какие-либо изменения в скрипте. Я хочу надеть наручники на свой сценарий, чтобы все, что он мог делать, - это выглядеть, как Алекс в Заводном апельсине . Я хочу, чтобы у моего сценария было разрешение на чтение, но не было другого разрешения.

Сценарий просматривает содержимое тысяч файлов. Хотя у меня есть разрешение на запись, файлы не должны редактироваться или изменяться "touch" каким-либо образом, кроме неизбежного обновления их времени доступа (atime). Их разрешения не должны быть изменены. Их время модификации (mtime) и ctime должны оставаться постоянными, и, конечно, их содержимое не должно изменяться - не добавлением, например, не с помощью sed или perl.

Можно было бы внутри сценария изменить разрешения для каждого файла, а затем изменить разрешения обратно после того, как кто-то его просмотрел. Но это изменит время изменения статуса (ctime), как мы видим здесь:

> /bin/rm z
> touch -t198001010000.13 z; # create file with mendacious mtime
> stat z
16777220 8696665084 -rw-r--r-- 1 BNW staff 0 0 "Jan  1 00:00:13 1980" "Jan  1 00:00:13 1980" "Jun 20 16:50:24 2020" "Jan  1 00:00:13 1980" 4096 0 0 z
> grep DOG z; # change atime to right now
> stat z
16777220 8696665084 -rw-r--r-- 1 BNW staff 0 0 "Jun 20 16:50:47 2020" "Jan  1 00:00:13 1980" "Jun 20 16:50:24 2020" "Jan  1 00:00:13 1980" 4096 0 0 z
> # note the ctime (3rd date in stat) equals the time the file was created. Now change permissions.
> chmod a-w z; chmod a-x z; # this will change the ctime
> stat z
16777220 8696665084 -r--r--r-- 1 BNW staff 0 0 "Jun 20 16:50:47 2020" "Jan  1 00:00:13 1980" "Jun 20 16:52:02 2020" "Jan  1 00:00:13 1980" 4096 0 0 z
> # That behavior is unacceptable. It destroys valuable information about the file.

Без изменения разрешений на файлы, есть ли «переключатель» или параметр, который предотвратит выполнение определенного сценария делать с файлом запрещенные действия?

1 Ответ

1 голос
/ 21 июня 2020

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

$ set -o noclobber
$ more test.txt
one
two
three
$ perl -e 'print "replaced"' > test.txt
-bash: test.txt: cannot overwrite existing file

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

Различные системы имеют права доступа к файлам или списки управления доступом (ACL). Если вас беспокоит, что программа делает что-то, что вам не нравится, запустите ее в другой среде. Вот почему многие инструменты имеют специальные учетные записи пользователей.

Но подумайте, действительно ли вы хотите использовать метаданные файловой системы в качестве базы данных. Если это действительно так важно, стоит отслеживать интересную информацию в том, что вы можете полностью контролировать. Попытка обойти обычные операции в файловой системе - это рецепт боли и страданий. Вы упоминаете Заводной апельсин , но схема в этом мове ie довела его пациента до самоубийства.

...