为什么要使用 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。
上文(手册页中)描述的“unlink 函数”指的是“unlink”系统调用,它执行 Linux 内核的核心功能。
内核接收到此系统调用后,会删除指向指定文件的硬链接,从而彻底擦除数据。
这里我就不赘述细节了,因为这需要对 Linux 文件结构和硬链接/符号链接进行冗长而深入的解释。
简而言之,它会调用一个内部删除数据的函数,而这个系统调用也使用了 `rm` 命令。
`rmdir` 系统调用(用于删除目录)和 `unlink` 系统调用(用于删除文件)的增强版本,它包含了
`rm` 命令是
换句话说,在删除文件方面,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` 命令出错可能会造成重大影响。
本文的解释到此结束。
如果我们深入探讨“为什么推荐使用 unlink”,还可以涉及到“Linux 中的数据结构”和“防错的重要性”。
我希望这篇文章能够帮助减少因删除符号链接而导致的事故数量,并且也能激发您对 Linux 的结构和安全性的兴趣。
感谢您阅读至此!
参考资料
unlink(1) - Arch 手册页
https://man.archlinux.org/man/unlink.1.en
27
