为什么Linux文件权限不能阻止gzip覆盖原始文件?

kiz8lqtg  于 2023-02-18  发布在  Linux
关注(0)|答案(1)|浏览(154)

我刚刚注意到gzip似乎可以用压缩的文件覆盖一个文件,尽管文件权限被设置为只读。我的印象是chmod 400可以防止文件被修改,但似乎不是这样。覆盖一个文件不算“写”吗?或者我误解了权限是如何工作的?
例如,如果我创建一个全为零的文件,删除写入权限,然后对其进行gzip压缩,则该文件将被一个较小的gzip压缩文件所替换。我不明白操作系统为什么允许这样做。SUSE Linux Enterprise Server 15 SP2和Linux Mint 20.2均适用:
'

ng@bonobo:~/sandbox$ dd if=/dev/zero of=zeros bs=1 count=100
100+0 records in
100+0 records out
100 bytes copied, 0.000693556 s, 144 kB/s
ng@bonobo:~/sandbox$ chmod 400 zeros 
ng@bonobo:~/sandbox$ ls -l
total 4
-r-------- 1 ng ng 100 Feb 10 23:58 zeros
ng@bonobo:~/sandbox$ gzip zeros 
ng@bonobo:~/sandbox$ ls -l
total 4
-r-------- 1 ng ng 30 Feb 10 23:58 zeros.gz

如果我尝试rm该文件,我至少会得到一个警告,它是写保护的,但我可以在键入y后继续。类似地,我可以在vim中编辑一个只读文件,并使用!保存它,以覆盖关于它是只读的警告。
这是否意味着像rmvim这样的程序正在进行系统调用来更改文件权限(我的帐户有权这样做),然后更改文件,然后将权限重新设置为只读?也许gzip也会这样做,但没有事先警告我?
这对我来说并不是一个大问题,但它让我担心我不了解权限,也许我认为对粗心操作有点安全的文件可能不那么安全。

j5fpnvbx

j5fpnvbx1#

您需要了解gzip做什么以及它是如何做的。
它所做的是压缩文件 in place。它所做的是读取原始文件,然后将压缩版本写为一个后缀为“.gzip”的新文件。如果成功,它会删除原始文件。
文件系统操作包括:

    • 打开 * 和 * 读取 * 旧文件-这是文件和父目录上的权限所允许的
    • 创建 * 和 * 写入 * 新文件-这是父目录上的权限所允许的
    • 删除 * 旧文件-这是对父目录的操作,如果您对该目录具有读写权限,则允许执行此操作。

好吧...为什么 * gzip在压缩文件之前 * 不显式地检查文件是否可写呢?我不 * 知道 *,但我可能也会像这样实现gzip,考虑到:

  • 能够在适当的位置执行文件树而不需要跳过环来处理只读文件是很方便的,并且
  • GZIP压缩是可逆的,并且X1 M4 N1 X的作用也大部分(几乎)是可逆的。

相关问题