最近遇到一个奇怪的问题,于是去英文论坛找了下,以下是我的处理:发问者:见证如下:请看以下命令:sh-3.2$cdtestcasesh-3.2$sudotouchtempsh-3.2$ls-altotal0drwxr-xr-x3glenstaff10219Dec12:38.drwxr-xr-x12glenstaff40812Dec12:38..-rw-r--r--1rootstaff019Dec12:38tempsh-3.2$echonope>tempsh:temp:Permissiondeniedsh-3.2$vimtemp#insidevimitheivery#press[ESC]:wq!#vimexitssh-3.2$ls-altotal8drwxr-xr-x3格伦员工10212月19日12:38.drwxr-xr-x12格伦员工40812月19日12:38..-rw-r--r--1格伦staff712月19日12:38tempvim以某种方式获取了这个root拥有的文件,并将其更改为用户拥有的文件!这似乎只有在用户拥有该目录的情况下才有效——但它仍然感觉不应该。任何人都可以解释这是如何完成的吗?vim如何把这个原本属于root的文件变成用户的文件呢?而且这似乎只会在用户拥有文件所在的目录时才会发生,但我仍然认为这是不可能的。有谁知道这里发生了什么?最佳答案:您,格伦,是该目录的所有者(请参阅列表中的.文件)。目录只是一个文件列表,您有权更改此列表(例如添加文件、删除文件、更改所有权以使其再次属于您,等等)。您可能无法直接更改文件的内容,但您可以读取和取消链接(删除)整个文件并随后添加新文件[1]。仅见证前后,这可能看起来像文件已被更改。Vim使用交换文件并在水下移动文件,因此这解释了为什么它似乎写入与您在shell中相同的文件,但它不是一回事[2]。格伦同志,你是这个目录的主人。要知道,所谓的目录只是一些文件的列表,而你是有权限改变这个列表的。(如添加文件、删除文件、改变所有权等)你可能无法直接改变这个文件的内容,但是你可以读取或取消链接(unlink/deleterm)整个文件,然后再添加新的.文献[1]。在这一系列事件之后,文件似乎已被更改。(同时所有权也发生了变化)vim使用swapfiles和movefiles来实现读写操作,这就解释了为什么你看似改变了文件,但实际上你用vim做的事情是不一样的重写原始文件的操作[2]。所以,Vim所做的,归结为:所以vim实际上在后台做了这样的事情:cattemp>.temp.swp#CopythefilecontenttoafilethatGlenbelongsechonope>>.temp.swp#更改更新文件的内容rmtemp&&mv.temp.swptemp#将文件写回原来的文件[1]这是Windows和Unices在文件权限处理上的一个重要区别。在Windows中,通常无法删除您没有写入权限的文件。这是类Unix系统和Windows系统在处理文件权限方面的一个重要区别:在windows[2]update中,你不能删除没有写权限的文件:正如评论中所指出的,Vim实际上并没有这样做来改变所有权,因为临时文件上的inode编号不会改变(比较ls-li之前和之后)。使用strace我们可以准确地看到vim做了什么。有趣的部分在这里:更新:如评论中所述,vim实际上并没有以这种方式更改所有权,因为“临时”文件中的索引节点号没有更改(比较前后与ls-li)。使用strace可以准确地看到vim做了什么。有意思的是:open("temp",O_WRONLY|O_CREAT|O_TRUNC,0664)=-1EACCES//打开文件失败,没有权限unlink("temp")=0open("temp",O_WRONLY|O_CREAT|O_TRUNC,0664)=4write(4,"moretextbla\n",14)=14close(4)=0chmod("temp",0664)=0这表明它只取消链接,但不关闭文件描述符温度。它只是覆盖了它的全部内容(在我的例子中更多的文本bla\n)。我想这可以解释为什么inode编号不会改变。这说明vim只是取消链接,并没有关闭指向temp的文件描述符,只是覆盖了它的全部内容(也就是说,删除temp后,系统获取的文件描述符还是和之前的temp文件一样,相当于被重用)。我猜这就是文件描述符没有改变的原因。
