防止 rm -rf / 删根跑路——使用 safe-rm 替代 rm

本文分享了一次使用rm-rf/命令导致数据丢失的惨痛经历,并介绍了一个名为safe-rm的工具,旨在防止误删重要文件。通过详细步骤指导读者如何安装和配置safe-rm,包括下载、解压、复制文件、建立软链接及编辑配置文件等。然而,作者在使用过程中遇到了bug,尽管如此,safe-rm仍提供了额外的安全层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看了一篇文章,讲的是 rm -rf / 酿成的一系列惨案……

惨!rm -rf /* 又新增一起「血案」

有个程序猿很忧桑:一个命令rm -rf/ ,他把整个公司删没了

然后还配了世界名画,呃(⊙o⊙)…

删库跑路……失败

 

鉴于自己是个小白,再联系到之前在虚拟机上也曾犯过这个噩梦般的失误,所以上网找了下如何避免使用 rm -f 命令失误,然后看到了这个神器:safe-rm

safe-rm

safe-rm 替代 rm 命令:safe-rm 工具可以添加保护名单,被添加到保护名单的文件和文件夹不能被删除,以此保命~_~。

以下是具体的操作步骤:

❶ cd 到下载目录(本次实验为 CentOS7 系统下的 /data 目录),到官网下载 safe-rm 安装包(到 2019.6.29 最新版本为 0.12.8,其实 2014 年就停止更新了。话说还有就是 GitHub 上也有个名字很相似的项目 saferm ——对吧~真的很像:https://github.com/lagerspetz/linux-stuff/blob/master/scripts/saferm.sh ,不要把二者搞混了):wget -c https://launchpadlibrarian.net/188958703/safe-rm-0.12.tar.gz (-c 的作用是可以断点续传)。

wget -c https://launchpadlibrarian.net/188958703/safe-rm-0.12.tar.gz

❷ 解压安装包:

tar -xvf safe-rm-0.12

解压安装包

❸ 将解压目录 safe-rm-0.12 下的 safe-rm 文件拷贝到 /usr/local/bin 下:

cp /data/safe-rm-0.12/safe-rm /usr/local/bin

拷贝

    查看拷贝结果

查看拷贝结果

❹ 建立 /usr/local/bin/safe-rm 的软链接 /usr/local/bin/rm:

ln -s /usr/local/bin/safe-rm /usr/local/bin/rm

❺ CentOS7 自带的 rm 命令在 /usr/bin/rm,所以在 /etc/profile 中更改 $PATH,让 safe-rm 所在的文件夹(在此即 /usr/local/bin)排在第一位:

更改 PATH 变量

❻ 新建 safe-rm 的配置文件 /etc/safe-rm.conf,添加想要保护的文件夹和文件到该配置文件中:

添加过滤列表

    每条过保护名单以回车分隔

过滤列表以回车分隔

    另外,safe-rm 自身已经定义了一些不可删除的名单:

 14 my %default_protected_dirs = (
 15     '/bin'               => 1,
 16     '/boot'              => 1,
 17     '/dev'               => 1,
 18     '/etc'               => 1,
 19     '/home'              => 1,
 20     '/initrd'            => 1,
 21     '/lib'               => 1,
 22     '/lib32'             => 1,
 23     '/lib64'             => 1,
 24     '/proc'              => 1,
 25     '/root'              => 1,
 26     '/sbin'              => 1,
 27     '/sys'               => 1,
 28     '/usr'               => 1,
 29     '/usr/bin'           => 1,
 30     '/usr/include'       => 1,
 31     '/usr/lib'           => 1,
 32     '/usr/local'         => 1,
 33     '/usr/local/bin'     => 1,
 34     '/usr/local/include' => 1,
 35     '/usr/local/sbin'    => 1,
 36     '/usr/local/share'   => 1,
 37     '/usr/sbin'          => 1,
 38     '/usr/share'         => 1,
 39     '/usr/src'           => 1,
 40     '/var'               => 1,
 41 );

    我们也可以直接编辑 /usr/local/bin/safe-rm 文件添加保护名单,如下:

 43 my %protected_dirs = (
 44     '/usr/local/bin/safe-rm' =>1
 45 );

直接编辑 safe-rm

❼ 重启电脑,或者使用 source /etc/profile 让 /etc/profile 配置文件生效。

使 profile 文件生效

❽ 尝试删除文件 /data/dollar01.sh,发现不能删除:

尝试删除文件

❾ 实验成功!

红红火火恍恍惚惚

等等!后面两行什么鬼!?

/bin/rm: missing operand 
Try '/bin/rm --help' for more information. 

我感觉步骤没有什么大差错啊,这个报错困扰了我整整一个晚上,然后在 safe-rm 文件结尾找到了如下截图。

官方 bug

合着官方知道有 bug 但是还没修复?然后我尝试着把 /usr/lib 从保护名单中删除,然而还是没卵用。

扎心不老铁

算了,不会编程,我投降。各位大佬有知道怎么解决的留个言吧。

鉴于这个碍眼的 bug,强迫症的我可能不会用这个软件了,还是用 mv 命令或者给文件夹加权限吧!╮(╯▽╰)╭

实验到此结束,希望此次试验能给各位看官带来一点价值。好了,全文完!

转载于:https://my.oschina.net/u/4097128/blog/3067950

<think>嗯,用户想了解Linux shell中rm -rf命令里通配符*的作用。首先,我需要回忆一下通配符的基本概念,特别是*在shell中的用途。通配符*通常用来匹配任意数量的字符,包括零个字符。比如,*.txt会匹配所有以.txt结尾的文件。 然后,考虑到用户的问题是关于rm -rf命令中的*,需要详细说明在这个命令中的具体作用。比如,rm -rf *会除当前目录下的所有文件和子目录,因为*会展开为当前目录下的所有条目。这里要强调-rf选项的作用,-r是递归除目录,-f是强制不提示确认,所以组合起来非常危险。 接下来,要结合用户提供的引用内容。比如引用[3]提到rm -rf用于递归除目录,引用[4]说明通配符除文件和目录的用法,以及需要加上-r参数来除目录。这时候要指出,当使用*时,如果包含目录,-r参数就变得必要,否则无法除目录。而用户的问题中的命令是rm -rf,所以已经包含了递归和强制的选项,这时候*就会匹配所有文件和目录,并递归除它们。 另外,用户提供的引用[2]和[4]提到了使用通配符时的风险,比如误重要文件,特别是像rm -rf /*这样的命令,可能会导致系统崩溃。需要提醒用户注意这一点,避免误操作。 还要考虑用户可能的实际应用场景,比如他们可能想批量除文件,但可能不清楚通配符的具体行为,导致意外除。因此,在回答中需要给出示例,并强调谨慎使用,以及如何测试通配符的效果,比如先用ls查看匹配结果再执行除。 总结一下,回答的结构应该包括通配符*的定义、在rm -rf中的具体作用、示例说明、注意事项以及相关引用。同时,生成的问题要围绕通配符的其他用途、安全除方法、替代命令等,帮助用户扩展知识。</think>### 关于`rm -rf *`中通配符`*`的作用 在Linux Shell中,通配符`*`用于匹配当前目录下**所有文件和目录**(包括隐藏文件,但默认不包含以`.`开头的隐藏文件,需显式指定`.*`)。当与`rm -rf`结合使用时,`*`的作用是递归除当前目录下的所有内容,具体说明如下: --- #### 1. **通配符`*`的匹配规则** - `*`表示**任意长度的任意字符**。例如: - `*.txt`匹配所有以`.txt`结尾的文件; - `file_*`匹配所有以`file_`开头的文件或目录; - `rm -rf *`会除当前目录下所有非隐藏文件及目录(包括子目录内容)。 --- #### 2. **`rm -rf *`的命令行为** - **`-r`(递归)**:递归除目录及其子目录内容[^3][^4]; - **`-f`(强制)**:忽略提示和错误(如文件不存在或权限不足); - **`*`(通配符)**:展开为当前目录下的所有文件和目录名,传递给`rm`命令执行除。 **示例**: ```bash # 当前目录包含文件a.txt、b.log和子目录dir1 rm -rf * # 结果:除a.txt、b.log以及dir1(包括dir1内的所有内容) ``` --- #### 3. **注意事项** - **高风险操作**:`rm -rf *`可能误重要文件,甚至因路径错误导致系统损坏(如误执行`rm -rf /*`)[^2]; - **隐藏文件保护**:默认不匹配以`.`开头的隐藏文件(如`.bashrc`),但若使用`rm -rf .*`会除隐藏文件; - **通配符的扩展行为**:Shell在命令执行前会先展开`*`,若目录为空则命令可能因参数缺失而报错。 --- #### 4. **安全建议** - **使用`safe-rm`工具**:通过配置保护关键目录(如`/etc/*`),避免误[^2]; - **先验证匹配内容**:通过`ls *`或`echo *`查看通配符匹配结果,再执行除; - **避免目录操作**:禁止在目录(`/`)下执行`rm -rf *`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值