为什么要使用unlink命令来“删除符号链接”
目录
你好。我是系统解决方案部门的成员。
最近,我有机会使用符号链接来更新我的 SSL 证书。
当时我再次查看符号链接时,发现了很多关于使用unlink命令删除符号链接的信息。
然而,我担心以下几点。
“删除符号链接只是‘相对’安全,但有时它们并没有解释说,如果你犯了一个错误,可能会很危险。”“
人们使用命令和选项的方式略有不同。”`
`有时删除符号链接有些人误解它是一个命令
因此,在本文中,
我想解释为什么以及如何使用 unlink 命令来“删除符号链接”,包括它是什么样的命令。
执行环境
・操作系统:Ubuntu 20.04.5 LTS(WSL2 环境)
・Shell:bash
・区域设置更改为日语
防范措施
本文适用于主要的 Linux 发行版:RHEL 和 Debian。
这是因为 Solaris 等 UNIX 系统中 unlink 命令的规范存在差异。
unlink命令是删除文件的命令
由于它写成un“链接”,所以有些人可能会误解它是删除符号“链接”的命令,但是
“它只能删除符号链接,但它本来是一个删除文件的命令。”
如果你在 Ubuntu 上点击 man 来检查它,你会看到以下解释。
$man unklink UNLINK(1) 用户命令 UNLINK(1) 名称 unlink - 调用 unlink 函数删除指定文件 格式 unlink FILE unlink 选项 描述 调用 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 指定实际文件来确认是否可以删除实际文件。
$ 取消链接 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 $ tree . ├── 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 命令将因其规范而失败。
让我们尝试一下。
$ unlink TsetDir unlink:无法删除(取消链接)'TsetDir':没有这样的文件或目录
这是因为该目录无法删除,所以不会直接删除链接源目录。
$ unlink TsetDir-link/ unlink: 无法删除 (unlink) 'TsetDir-link/': 没有这样的文件或目录
基本上不直接指定文件名是无法删除的,所以
不能递归处理目录,所以目录中的文件不会被删除。
这样,unlink命令被设计为失败,因此与使用rm相比,发生事故的风险大大降低。
摘要:为什么建议使用 unlink 命令来删除符号链接
如果您小心并包含 -i 选项,rm 命令还可以用于删除符号链接。
然而人类是会犯错误的生物,不可能杜绝错误,
所以为了防止事故的发生,我们需要一个制度,能够从源头上防止人们犯错误,防止错误变成错误。
这个概念万无一失,基于此进行操作时
,使用unlink,一个功能有限、影响比rm小的命令,发生错误时影响很大,就是他们说的。
那么,这就是本文的全部解释。
如果您深入研究“为什么建议取消链接”,您将了解“Linux 中的数据结构”和“万无一失的重要性”。
如果这篇文章能够帮助减少符号链接删除事故的发生,那就太好了,同时也希望大家对Linux的结构和安全性产生兴趣。
感谢您阅读本文!
参考资料
unlink(1) - Arch 手册页
https://man.archlinux.org/man/unlink.1.en