我可以阻止Perl程序修改任何文件吗?

我可以阻止Perl程序修改任何文件吗?,perl,permissions,Perl,Permissions,我用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 staf

我用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
,它同样可以防止该脚本无意中修改任何文件?我不想更改文件的权限;我希望在脚本的最顶端有一个“安全开关”,以防止脚本进行任何更改。我想给我的剧本戴上手铐,让它看起来像亚历克斯穿着发条橙色的衣服。我希望我的脚本具有读取权限,但没有其他权限

该脚本搜索数千个文件的内容。尽管我有写入权限,但除了不可避免地更新访问时间(
atime
)外,不得以任何方式对文件进行“
touch
”编辑或更改。不得更改其权限。它们的修改时间(
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.

在不更改文件权限的情况下,是否有一个“开关”或设置会阻止特定脚本对文件执行任何禁止的操作?

noclobber
不会执行您认为它会执行的操作。下面是使用perl进行保护的示例。它可以防止shell重定向覆盖文件,并且不关心哪个程序生成了输出:

$ set -o noclobber
$ more test.txt
one
two
three
$ perl -e 'print "replaced"' > test.txt
-bash: test.txt: cannot overwrite existing file
想象一下,如果存在这样一个开关。你想依靠它来完成一切工作吗?您设置了它,但有什么东西使它不稳定,例如错误、失败或部署不完整。这是一个有点管道胶带开始。那么,一旦设置好,如何修改文件?你关掉它,却忘了重置它

各种系统都有文件权限或访问控制列表(ACL)。如果您担心某个程序正在做您不喜欢的事情,请在不同的环境中运行它。这就是为什么许多工具都有专用的用户帐户


<>但是,考虑如果你真的想使用文件系统元数据作为你的数据库。如果它真的那么重要,那么追踪一些你可以完全控制的有趣信息是值得的。试图绕过文件系统上的正常操作会带来痛苦和痛苦。你提到了发条橙,但那部电影中的计划让病人自杀。

另请看《无撞击》(NoClobber)不是关于猫的,而是关于猫的。