【问题标题】:Why is Vim able to defeat my file permissions? OS X为什么 Vim 能够破坏我的文件权限?操作系统
【发布时间】:2015-01-21 11:05:56
【问题描述】:

我很好奇为什么即使我以非管理员用户身份登录,Vim 似乎也能够覆盖我的文件权限。

dq-donahue:perm_prac fartknocker$ login root
Password:

dq-donahue:~ root# cd /Users/fartknocker/perm_prac/
dq-donahue:perm_prac root# touch derp
dq-donahue:perm_prac root# ls -l

-rw-r--r--  1 root         staff   0 Nov 23 13:39 derp

dq-donahue:perm_prac root# logout
dq-donahue:perm_prac fartknocker$ vim derp

...这里我用vim添加到文件中并使用wq!覆盖只读权限 放屁账号……

dq-donahue:perm_prac fartknocker$ ls -l

-rw-r--r--  1 fartknocker  staff  13 Nov 23 13:39 derp

什么给了?为什么 Vim 能够做到这一点? Fartknocker 是一个 os x “标准”帐户。另外,很抱歉这个有趣的帐户名。 :) 任何帮助表示赞赏。

【问题讨论】:

    标签: macos vim terminal file-permissions


    【解决方案1】:

    在我的测试中,Vim 取消了原始文件的链接(这需要包含目录的写权限,而不是文件本身)。然后它写入一个新文件。这可以通过使用ls -listat 检查文件的inode 来确定。

    $ sudo touch foo
    $ ls -li foo
    57457973 -rw-r--r--  1 root  staff  0 Nov 23 13:07 foo
    $ vi foo
    ... modify file and write with :wq! ...
    $ ls -li foo
    57457990 -rw-r--r--  1 ken  staff  15 Nov 23 13:07 foo
    

    inode 已更改。

    【讨论】:

      【解决方案2】:

      它之所以有效,是因为您拥有自己的主目录并有权对其进行所有权更改,因此 vim 通过移动文件并首先在后台编写一个新文件来执行有效的“chown”,以便您可以编写它。正如所指出的,这不是一个真正的chown。也可以看another answer to this here

      IME,*nix 上 99% 的问题是路径和权限。在这里,它的权限。您对父目录具有取消链接文件并创建另一个文件的权限。

      如果您对尝试更改文件的目录具有权限,则可以执行此操作。以 root 身份尝试:

      mkdir foo
      chmod 777 foo
      touch foo/bar.txt
      

      您将能够编辑和强制写入文件。

      但是(如在 /tmp 中),粘性位会阻止您取消链接文件,正如@Keith Thompson 在下面的线程中指出的那样。因此,要扩展上面的示例,您可以以 root 身份执行以下操作:

      touch foo/bar2.txt
      chmod a+wt foo   # this sets the sticky bit
      

      现在您将无法强制写入 bar2.txt 文件。

      【讨论】:

      • 谢谢!这让我发疯了。
      • Vim 不能chown 文件,只能写入文件。
      • @looch:这个答案不正确; vim 不能 chown 一个文件,除非它以 root 身份运行(即使它是也不会尝试)。另一个答案是正确的。 vim 不会覆盖文件的权限。
      • 它没有改变文件的所有权。它创建了一个 new 文件,该文件恰好具有相同的名称。旧文件被删除。
      • 好吧,不过效果是一样的。更新了我的答案,以更能说明实际过程。但是,移动一个文件,然后根据与您的用户相同的名称创建一个新文件与 chowning 它的效果相同,即使这不是它所做的命令。
      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2011-03-25
      • 2011-08-19
      • 2014-08-28
      • 2012-11-21
      • 1970-01-01
      相关资源
      最近更新 更多