Osx

將文件 mv 到 /dev/null 會破壞 dev/null

  • February 7, 2016

如果我這樣做:touch file; mv file /dev/null作為根,/dev/null消失。 ls -lad /dev/null導致沒有這樣的文件或目錄。這會破壞依賴於/dev/nullSSH 之類的應用程序,並且可以通過執行mknod /dev/null c 1 3; chmod 666 /dev/null. 為什麼將正常文件移動到這個特殊文件會導致 消失/dev/null

澄清一下,這是出於測試目的,我了解該mv命令的工作原理。我很好奇的是為什麼ls -la /dev/null在用正常文件替換它之前顯示預期的輸出,但之後它顯示/dev/null不存在,即使據稱文件是通過原始mv命令創建的並且文件命令顯示 ASCII 文本。我認為這必須是ls命令行為與devfs非特殊文件替換字元/特殊文件時的組合。這是在 Mac OS X 上,行為可能在其他作業系統上有所不同。

查看 mv 的原始碼,http ://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :

/*
* If rename fails because we're trying to cross devices, and
* it's a regular file, do the copy internally; otherwise, use
* cp and rm.
*/
if (lstat(from, &sb)) {
   warn("%s", from);
   return (1);
}
return (S_ISREG(sb.st_mode) ?
   fastcopy(from, to, &sb) : copy(from, to));

...

int
fastcopy(char *from, char *to, struct stat *sbp)
{
...
while ((to_fd =
   open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)) < 0) {
       if (errno == EEXIST && unlink(to) == 0)
           continue;
       warn("%s", to);
       (void)close(from_fd);
       return (1);
}

在第一次通過 while 循環時,open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)將因 EEXIST 而失敗。然後/dev/null將被取消連結,並重複循環。但是正如您在評論中指出的那樣,無法在 中創建正常文件/dev,因此在下一次通過循環時,open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)仍然會失敗。

我會向 Apple 送出錯誤報告。原始碼與mvFreeBSD 版本基本沒有變化,但因為 OSX 的 devfs 對正常文件具有非 POSIX 行為,Apple 應該修復它們的mv.

引用自:https://unix.stackexchange.com/questions/117960