为什么要使用 unlink 命令来“删除符号链接”?
![]()
目录
您好,我是系统解决方案部门的Naka。
最近,我有机会使用符号链接来更新我的SSL证书。
当我再次研究符号链接时,发现很多资料都说“使用 unlink 命令删除符号链接”。
但是,我对以下几点感到担忧:
“删除符号链接只是‘相对’安全,但他们没有解释如果操作失误可能会很危险。”
“命令和选项的使用方式因人而异。”
“有时人们会误以为这是一个删除符号链接的命令。”
因此,在本文中,
我想解释一下 unlink 命令是什么,以便您能够理解为什么它用于“删除符号链接”以及如何使用它。
执行环境
・操作系统:Ubuntu 20.04.5 LTS(WSL2 环境)
・Shell:bash
・将语言环境更改为日语
防范措施
本文涵盖了主要的 Linux 发行版,RHEL 和 Debian。
这是因为在 Solaris 等 UNIX 系统中,unlink 命令的规范有所不同。
unlink 命令用于删除文件。
由于它写的是“un "link"”,有些人可能会误以为它是删除符号“链接”的命令,但实际上并非如此。
“它也可以删除符号链接,但实际上它是一条删除文件的命令。”
在Ubuntu系统中输入man命令并查看,你会发现以下解释:
$man unklink UNLINK(1) 用户命令 UNLINK(1) 名称 unlink - 调用 unlink 函数并删除指定文件 格式 unlink FILE unlink OPTION 描述 调用 unlink 函数删除指定文件。 --help 显示此用法并退出 --version 显示版本信息并退出 *省略
正如描述所说,这是一个“删除指定文件”的命令。
由于这不是删除符号链接的命令,因此您也可以删除实际文件。
删除文件时的内部行为与 rm 命令相同。
描述 调用 unlink 函数删除指定的 FILE。
上文(man 手册页)解释的“unlink 函数”指的是名为“unlink”的系统调用,它会执行底层 Linux 内核函数。
内核接收到此系统调用后,会删除指定文件的硬链接,从而有效地删除数据。
这里我就不详细赘述了,因为这需要对 Linux 文件结构和硬链接/符号链接进行冗长而基础的解释,但
基本上,它在内部调用了一个函数来删除数据,而 rm 命令也使用了这个系统调用。
使用“rmdir”系统调用删除目录,使用“unlink”系统调用删除文件,
并向这些调用添加各种可选功能。
换句话说,在删除文件方面,rm 命令和 unlink 命令在 Linux 内核内部执行的是相同的操作。
作者认为,意识到(并具有危机意识)这是一个删除文件的命令,将有助于保障安全。
为了验证这一点,创建一个待删除的文件并检查删除操作。
为了验证目的,请在验证环境中准备一个名为“Testdate”的文件。
$ touch 测试日期 $ ls -l 总计 0 -rw-r--r-- 1 ubuntu ubuntu 0 九月 16 17:10 测试日期
在这里,您可以使用 unlink 命令指定要删除的文件,从而确认您可以删除该文件。
$ unlink Tstdate $ ls -l 总计 0
由于这是一个删除实际文件的命令,如果您尝试删除符号链接并指定原始链接源文件,则该文件自然会被删除。
此外,与 rm 命令不同,它没有像 -i 选项那样的确认提示等功能来防止意外操作,因此要小心。
它与 rm 命令有何不同?
unlink 命令不能删除目录,也不能递归删除目录中的文件。
因此,通常建议使用此命令删除符号链接。
这是因为它可以防止在使用 rm 命令时意外指定“源目录”或“符号链接目标的子目录”而导致的意外删除。
为了通过一个失败示例来解释这意味着什么,
我们创建了一个名为“TestDir”的目录,以及指向该目录的符号链接“TestDir-link”。
“TestDir”目录下放置了三个用于验证的文本数据文件。
$ ls -l 总计 4 drwxr-xr-x 2 ubuntu ubuntu 4096 Sep 16 18:01 TestDir lrwxrwxrwx 1 ubuntu ubuntu 7 Sep 16 17:53 TestDir-link -> TestDir $ 树 . ├── TestDir │ └── {TestDate1.txt}{TestDate2.txt}{TestDate3.txt} └── TestDir-link -> TestDir
介绍“您可能犯的危险的 rm 命令错误案例”
错误:指定了链接源目录
$ rm -rf TsetDir
如果指定了“链接源目录”,则很可能在链接源目录和符号链接名称相似时发生这种情况。
自然,整个目录将被删除。
绝望降临。
错误:我想删除符号链接“TsetDir-link”,但我指定的路径后面带有“/”。
$ rm -rf TsetDir-link/
这是人们最常犯的错误;如果在指定目录时意外添加了“/”,
最终指定的将是“符号链接目标目录下的目录”,而不是符号链接本身。
在这种情况下,将递归搜索目录,
{TestDate1.txt}{TestDate2.txt}{TestDate3.txt} 中的所有数据都将消失。
“咦?符号链接不会消失吧?”你心想,然后当你查看目录内容时,绝望涌上心头。
首先,rm 命令的 -f 选项是一个危险的选项,不应轻易使用,但
似乎有些情况下,你会在熟悉的环境中“不小心”无意识地使用它,因此务必小心。
取消链接命令将失败,因此发生事故的可能性较小。
在上述危险情况下,由于其参数限制,unlink 命令会失败。
我们来尝试运行一下。
$ unlink TsetDir unlink:无法取消链接“TsetDir”:没有该文件或目录
这是因为规范不允许删除目录,所以链接的源目录不会被直接删除。
$ unlink TsetDir-link/ unlink:无法取消链接“TsetDir-link/”:没有该文件或目录
基本上,除非直接指定文件名,否则无法删除文件,因此
无法递归处理目录,也不会删除目录中的文件。
如您所见,unlink 命令的设计目的就是为了避免失败,因此与使用 rm 命令相比,发生意外的风险大大降低。
摘要:为什么建议使用 unlink 命令删除符号链接
您也可以使用 rm 命令删除符号链接,但需要使用 -i 选项并小心操作。
然而,由于人类是会犯错的生物,而且“不可能消除这种错误”,
为了防止事故发生,“需要一种系统,从根本上防止人们犯错,或者即使错误确实发生了,也能防止错误变成错误。”
这种概念被称为
防错法据说在基于此进行操作时,应该使用功能有限的 unlink 命令,其影响可能小于 rm 命令,因为 rm 命令在发生错误时影响更大。
本文的解释到此结束。
如果我们深入探讨为什么建议取消链接,我们可以涉及到 Linux 中的数据结构以及防错的重要性。
我希望这篇文章能够帮助减少因删除符号链接而导致的事故数量,并且也能激发您对 Linux 的结构和安全性的兴趣。
感谢您阅读至此!
参考资料
unlink(1) - Arch 手册页
https://man.archlinux.org/man/unlink.1.en
27