Я пишу сценарии в 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.
Без изменения разрешений на файлы, есть ли «переключатель» или параметр, который предотвратит выполнение определенного сценария делать с файлом запрещенные действия?