不是文件,不是文件夹,而是从另一个分区到 /bin 的硬链接(?) - 害怕删除

不是文件,不是文件夹,而是从另一个分区到 /bin 的硬链接(?) - 害怕删除

我的文件系统上有一个“不是文件夹”也不是“文件”。这是一个运行 Ubuntu 18.04.4 LTS 的 AWS EC2 实例。

我有一个每晚运行的脚本,它使用 Robo 拾取文件 (/ebsvol/dead-drop/sync) 并将其移动到 (/ebsvol/dead-drop/sync),而 Robo 又使用 Symfony 的 Filesystem rename() 方法(https://symfony.com/doc/current/components/filesystem.html#rename)。

  const CANARY_PATH = '/ebsvol/dead-drop/sync';
  const CANARY_WORKING_PATH = '/ebsvol/dead-drop/~sync';
...
  $this->taskFilesystemStack()
    ->rename(self::CANARY_PATH, self::CANARY_WORKING_PATH)
    ->run();

脚本或代码出了点问题,不过这并不是我来这里的目的。结果和清理才是我来这里的目的。:)

结果是创建了 ~sync “文件”,但它实际上是……到 /bin 的硬链接?这就是事情变得可疑的地方。我的ls -ial看起来像这样:

3276803 -rw-rw-r--  1 configbot configbot  125 Jul  4 00:30 '~sync'

所以它只是一个文本文件,所以让我们尝试一下 cat...

$ cat ~sync
cat: /bin: Is a directory 

嗯,好的。

$ cd ~sync

...将我的提示更改为 /bin,然后执行 ls,它肯定是 bin。顺便说一句,ls -ial在我的根卷上显示 /bin 是 iNode 12。

以前我遇到过一次这种情况,结果rm -rf ~sync搞坏了整个服务器,不得不重建。所以我尽量避免这种情况。

我该如何在不破坏 /bin 的情况下摆脱这个奇怪的 ~sync 文件/文件夹/符号链接/硬链接?

一些附加信息:

  • /ebsvol是一个单独的 EBS 卷/(即单独的硬盘/分区!)
  • 我认为如果以某种奇怪的方式建立硬链接,rm ~sync可能会起作用。但它不会显示相同的 iNode 编号吗?
  • 在尝试任何操作之前,我将对两个卷进行快照。:)

答案1

如果您打算使用 bash 之类的 shell 访问文件,则以波浪符号开头命名文件是一个非常糟糕的主意。原因是它将波浪符号解释为您想要访问用户的主目录。

因此,bash(和其他 shell)扩展~到当前用户的主目录,并扩展~sync到名为 sync 的用户的主目录。

事实证明,您的 Ubuntu 系统有一个名为 的系统用户,sync其主目录为/bin。因此,当您尝试~sync从 shell 访问时,它会将其扩展为用户的主目录,然后您开始收到奇怪的消息。当您运行时,rm -rf ~sync效果是rm -rf /bin,这几乎会破坏系统。

如果要访问文件本身,请引用它,或在其前面加上一些前缀,例如其路径:

$ cat ./~sync

您还应该重新编写代码,使其不创建以波浪符号开头的文件名。这将为您和将来的您省去很多麻烦。

相关内容