[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

为什么要使用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

如果您觉得这篇文章有帮助,请点赞!
24
加载中...
24 票,平均:1.00 / 124
19,561
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

里面

2022 年加入 Beyond 职业生涯 属于
系统解决方案部门
LPIC-3 我有 304 和 AWS SAA 我的
常规饮料只有三种选择:牛奶、可乐和红茶。