Linux 里最危险的命令:rm -rf = 递归 + 强制删除,-r 让它能删目录,-f 让它不废话不报错,合起来就是“静默递归核弹“

rmdir命令只能删除空目录,非空目录需用rm -rf强制删除。


rm -rf-r表示递归删除子目录,-f表示强制不提示,组合使用会直接删除指定路径下的所有内容,危险性极高。


误操作如rm -rf /会删除根目录导致系统崩溃。


家目录(如/home/user)是用户的私人文件夹,用~快速访问。


禁用root用户远程登录需修改/etc/ssh/sshd_config,设置PermitRootLogin no并重启SSH服务,同时建议配置sudo权限的普通用户作为管理账户,避免系统锁定风险。


操作前务必确认路径,防止误删关键数据。


rmdir —— 真的只能删空目录


1.1 结论

是的,rmdir 只能删除空目录,目录里但凡有一个文件或子目录(包括隐藏文件),就会报错。

1.2 验证

bash

# 创建空目录
mkdir empty_dir
rmdir empty_dir   # ✅ 成功,没任何提示

# 创建非空目录
mkdir not_empty
touch not_empty/a.txt
rmdir not_empty   # ❌ 报错:rmdir: failed to remove 'not_empty': Directory not empty

1.3 那非空目录怎么删?

bash

# 方法1:rm -rf(最常用)
rm -rf not_empty   # 强制删除,里面不管有多少东西全删光

# 方法2:先清空,再 rmdir(不推荐,太麻烦)
rm not_empty/* && rmdir not_empty

1.4 rmdir 的实际用处

说实话,工作中几乎不用 rmdir,因为大家图方便都是 rm -rf 一把梭。

唯一有用场景:写脚本时判断一个目录是不是空的

bash

# 如果是空目录就删掉
rmdir some_dir 2>/dev/null && echo "删除了空目录"

rm -rf中的 -rf是什么意思


-rf 是两个参数的合写,拆开看就很好记:


一、拆解

参数全称含义
-rrecursive递归(把目录里的子目录、文件全翻出来)
-fforce强制(不询问、不报错)

所以 rm -rf = 递归 + 强制删除


二、对比演示

2.1 不加参数删目录(会报错)

bash

rm test_dir/
# rm: cannot remove 'test_dir/': Is a directory
# rm 默认只能删文件,不能删目录

2.2 只加 -r(递归删,但会挨个问)

bash

rm -r test_dir/
# rm: descend into directory 'test_dir'? y
# rm: remove regular file 'test_dir/a.txt'? y
# rm: remove regular file 'test_dir/b.txt'? y
# rm: remove directory 'test_dir'? y
# 每删一个都要按 y,烦死

2.3 加 -rf(安静地全部删光)

bash

rm -rf test_dir/
# 没有任何提示,直接删完

三、-f 强制的作用

场景不加 -f加 -f
文件不存在报错:No such file or directory静默,不报错
只读文件询问:remove write-protected file?直接删,不问
删除目录需要 -r,且挨个问-rf 组合,安静删

四、记忆技巧

r = 递归(Recursive)钻进去
f = 强制(Force)不废话
合起来 = 钻进去全部删光,不问不报错

前端类比:rm -rf 相当于 localStorage.clear(),一键清空,没有确认弹窗。


五、⚠️ 危险警告

rm -rf 是 Linux 里最危险的命令,因为:

  • 不回收站

  • 不确认

  • 删了就没了

bash

# 著名惨案:误删根目录
rm -rf /          # 系统没了
rm -rf / home     # 手滑多打空格,删了根目录

安全习惯

bash

# 删除前先看一眼
ls -la 要删的目录

# 或者用交互模式
rm -ri 要删的目录   # i = interactive,会问你

# 绝对不要用 root 用户执行 rm -rf,除非你确定自己在干什么

总结一句话

-r 让它能删目录,-f 让它不废话不报错 → 合起来就是"静默递归核弹"


rf只删当前路径下的文件吧,还有加不加-有区别吗


一、rm -rf 删的是哪里的文件?


结论:rm -rf 后面跟什么路径,就删什么路径

写法删除范围
rm -rf file.txt删当前目录下的 file.txt
rm -rf /home/hadoop/test/删 /home/hadoop/test/ 整个目录
rm -rf *删当前目录下的所有文件和目录
rm -rf ./*同上,显式写法
rm -rf /删整个系统(灾难)

验证

bash

# 当前目录结构
/home/hadoop/
├── a.txt
└── subdir/
    └── b.txt

# 当前在 /home/hadoop
cd /home/hadoop

# 只删当前目录下的 a.txt
rm -rf a.txt   # a.txt 没了,subdir 还在

# 删 subdir 目录(不管在哪)
rm -rf /home/hadoop/subdir   # 用绝对路径,也能删

记忆rm -rf 只认路径,不认"当前目录"还是"其他目录"。你不写路径,它就默认删当前目录下的东西。


二、加不加 - 有区别吗?

结论:区别巨大!加 - 是"参数/选项",不加 - 就是普通的文件名/目录名

2.1 加 - 的含义

bash

rm -rf test/   # -r 和 -f 是参数,告诉 rm 怎么删
  • 以 - 开头的叫选项(option)参数(flag)

  • 作用是修改命令的行为

  • 位置可以放在命令后面、文件前面

2.2 不加 - 的含义

bash

rm rf test/    # 这会删三个东西:rf 和 test/
  • 没加 - 的 rf 会被当作要删除的文件名

  • 系统会去找名叫 rf 的文件并删掉

2.3 实战验证

bash

# 创建测试文件
touch rf
touch test.txt

# 错误写法:没加 -
rm rf test.txt
# 这会删除文件 "rf" 和 "test.txt"(把 rf 当文件名了)

# 正确写法:加 -
rm -rf test.txt
# -r 和 -f 是参数,test.txt 是要删的文件

2.4 特殊情况:要删的文件名本身以 - 开头

bash

# 创建了一个奇怪文件叫 -rf
touch -- -rf   # -- 告诉命令"后面的东西不是参数"

# 正常删除会报错
rm -rf         # 报错:rm: missing operand
rm -rf -rf     # 还是报错,第一个 -rf 被当参数了

# 正确删除方法
rm -- -rf      # -- 表示"选项结束",后面的是文件名
# 或者
rm ./-rf       # 用路径告诉系统这是文件

三、加 - 与不加 - 对比表

写法含义例子
-r参数(递归)rm -r dir/
-f参数(强制)rm -f file.txt
rf文件名(叫"rf"的文件)rm rf → 删文件 rf
-rf两个参数合写rm -rf dir/

常见的参数写法规则

bash

# 1. 分开写
rm -r -f dir/

# 2. 合并写(最常用)
rm -rf dir/

# 3. 放在文件后面也可以(但不推荐)
rm dir/ -rf   # 等价于 rm -rf dir/

# 4. -- 表示"后面不是参数"
rm -- -rf     # 删文件名叫 -rf

四、记忆技巧

- 开头的是给命令看的指令(参数)
没有 - 的是给命令删的文件名
-- 是"别分析了,后面就是文件名"

前端类比:

javascript

// rm -rf 相当于
rm.execute({ recursive: true, force: true }, 'target')

// 不加 - 的 rf 相当于
rm.execute('rf', 'target')  // 试图删一个叫 rf 的文件

五、总结一句话

问题答案
rm -rf 只删当前目录?❌ 删你指定的路径,不指定就默认当前目录
加不加 - 有区别吗?✅ 天壤之别:加 - 是参数,不加是文件名

安全提示:敲 rm -rf 之前,先 ls 看一眼要删什么,特别是用 * 通配符的时候!


# 著名惨案:误删根目录

rm -rf / # 系统没了

rm -rf / home # 手滑多打空格,删了根目录


为什么第二个也是删全部


你抓到了一个非常关键的细节!这确实是无数程序员手滑踩过的大坑。


第二个之所以也是删全部,根本原因在于:空格在命令行里是“分隔符”。


让我们来拆解一下这个灾难现场:

1. 你心里想的是什么?

你本来想删除 home 这个目录:

bash

rm -rf /home

2. 你手滑打成了什么?

你不小心在 / 后面多打了一个空格

bash

rm -rf / home

3. 系统是怎么理解这个命令的?

rm 命令不看“人类语义”,它只看空格分隔出来的参数

对于 rm -rf / home,系统是这样拆解的:

  • 参数1-rf (选项:强制递归)

  • 参数2/ (告诉系统:从根目录开始删)

  • 参数3home (告诉系统:删完根目录后,再删当前目录下叫 home 的文件/目录)

4. 为什么删光了?

因为 / 是万恶之源

当你给了 rm -rf 后面加上 /,它的意思是:“递归强制删除根目录下的所有内容”。一旦这个指令发出去,操作系统会立刻开始销毁自己,后面的 home 根本没有机会被执行,因为系统在执行到 home 之前就已经崩溃或者把所有文件删光了。

5. 前端类比(秒懂版)

这就像你写了一个 JavaScript 函数:

javascript

// 你本想删除数组里的 'home' 这一项
// rm -rf /home

// 结果你手滑写成了:
// rm -rf / home

function rm_rf(path) {
    if (path === '/') {
        // 卧槽,你传了 '/'
        // 于是它执行了:
        delete_all_files_on_hard_drive();  // 把整个硬盘删光!
        return; // 函数直接结束,下面的代码不跑了
    }
    delete(path); // 正常删除 home 的逻辑根本跑不到这里
}

总结:血泪教训

  • rm -rf / home = “把根目录 / 删了,顺便把 home 也删了”

  • 因为 / 是最高优先级的目标,删完 / 系统就没了,所以必死无疑。

程序员保命三连:

  1. 禁用 root 用户:日常用普通用户,权限不够就删不了 /

  2. 用相对路径:在 /home/hadoop 目录下,直接写 rm -rf test/,而不是 rm -rf /home/hadoop/test

  3. 养成好习惯:输入 rm -rf / 或者 rm -rf /* 之前,深呼吸三秒,确认自己没有手抖。


 rm -rf ~/ 其中的 ~/是什么意思


~/ 是当前用户家目录的快捷写法。


一、拆解说明

符号含义在你电脑上代表
~当前用户的家目录/home/mumu
/路径分隔符表示家目录下面
~/家目录本身(以及里面的所有内容)/home/mumu/

二、实际效果

bash

rm -rf ~/

这条命令的意思是:删除你当前用户家目录下的所有文件和文件夹


在 WSL Ubuntu 上执行,会删掉:

/home/mumu/
├── bigdata/         ← 你的学习项目
├── .bashrc          ← 个人配置
├── .ssh/            ← SSH 密钥
├── .cursor-server/  ← Cursor 配置
└── ... (所有东西)

三、~ 的各种用法

写法含义示例
~自己的家目录cd ~ → 回到 /home/mumu
~/家目录下的内容ls ~/ → 列出家目录所有文件
~/bigdata家目录下的 bigdata 文件夹cd ~/bigdata
~/.bashrc家目录下的 .bashrc 文件vim ~/.bashrc
~用户名其他用户的家目录ls ~hadoop → 看 hadoop 的家目录

四、为什么 rm -rf ~/ 非常危险?

危险等级说明
⚠️ 极度危险会删除你所有个人文件、配置、代码、密钥

对比其他危险命令:

命令后果
rm -rf ~/删除当前用户的所有个人数据
rm -rf /删除整个系统(需要 sudo)
rm -rf ~同上(~ 和 ~/ 效果一样)
rm -rf .删除当前目录及子目录

五、安全使用建议

删除前先预览

# 想看自己家目录下有什么
ls -la ~/

# 想看家目录下 bigdata 文件夹有多大
du -sh ~/bigdata

更安全的删除方式

# 1. 先进入家目录,看清楚再删
cd ~
ls -la
# 确认无误后,删除指定目录
rm -rf bigdata/   # 只删 bigdata,不删其他

# 2. 使用交互模式(会挨个问你)
rm -ri ~/some_dir/

设置别名防止手滑

# 在 ~/.bashrc 中添加
alias rm='rm -i'   # 让 rm 默认变成交互模式

# 生效
source ~/.bashrc

六、你之前的问题上下文

回顾你之前问的 rm -rf / home 和 rm -rf ~/

命令后果
rm -rf / home删根目录 + 删 home(极危)
rm -rf ~/删你所有个人数据(很危)
rm -rf /删整个系统(核弹级,需要 sudo)

总结一句话

~/ = 你的家目录(/home/mumu),rm -rf ~/ 会删掉你所有个人文件、代码、配置。


在 WSL 里跑这条命令,你的学习环境和配置就全没了。


如果rm -rf后面什么(me)也没有,或仅有空格,执行后是什么


这个问题问得很有安全意识!答案是:什么都不会发生,命令会报错。


一、rm -rf 后面什么都不跟

bash

rm -rf

结果

text

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

解释operand 就是操作对象。rm 命令要求必须告诉它"要删什么",没给就报错退出。


二、rm -rf 后面只有空格

bash

rm -rf            # 注意:-f 后面有空格

结果:同上,报错 missing operand

解释:空格只是分隔符,rm 读取参数时会自动跳过空白,所以结果等同于什么都没写。


三、特殊情况:rm -rf "" 或 rm -rf ''

bash

rm -rf ""         # 空字符串作为参数

结果

text

rm: cannot remove '': No such file or directory

解释:空字符串是一个合法的"文件名"(虽然不存在),rm 会尝试删除它,然后报找不到。


四、对比总结表

命令结果危险程度
rm -rf❌ 报错:missing operand安全(没删任何东西)
rm -rf (有空格)❌ 同上安全
rm -rf ""❌ 报错:文件不存在安全
rm -rf /💀 删光整个系统核弹级
rm -rf *⚠️ 删当前目录所有内容危险
rm -rf ./*⚠️ 同上危险

五、为什么不会误删?

rm -rf 的设计要求必须指定目标,这个限制本身就是一道安全防线。

bash

# 可以理解为 rm 在问:
"你要删什么?我没收到参数,不执行。"

前端类比

javascript

// rm -rf 相当于
function rm_rf(target) {
    if (target === undefined) {
        throw new Error('missing operand');  // 必须传参数
    }
    deleteAll(target);
}

rm_rf();        // 报错,不执行
rm_rf('/');     // 💀 炸了

六、真正危险的写法

写法解释
rm -rf /根目录,系统毁灭
rm -rf /*根目录下所有文件
rm -rf .当前目录及子目录全删(. 表示当前目录)
rm -rf ..父目录全删
rm -rf ~用户家目录全删
rm -rf $empty_var变量为空时变成 rm -rf,会报错(但如果是 rm -rf /$empty_var 就炸了)

变量陷阱示例

bash

#!/bin/bash
DIR=""   # 变量为空
rm -rf /$DIR   # 实际执行了 rm -rf /   💀💀💀

总结一句话

rm -rf 后面不跟路径 = 报错不执行,这是它的安全机制。真正的危险是跟了 /* 或者空变量。

养成习惯:删东西之前先 ls 看一眼,确认了再删。


用户家目录是什么意思


用户家目录 = 用户的"私人房间"

家目录是每个用户在 Linux 系统中自己的专属文件夹,用来存放个人文件、配置、程序等。


一、直观理解

概念类比
家目录你的卧室(只有你能随便进)
根目录 /整栋(所有人共用)
其他用户的家目录邻居的房间(你不能随便进)

二、具体位置

用户家目录路径说明
root(超级管理员)/root在根目录下
普通用户(如 hadoop)/home/hadoop在 /home 下
普通用户(如 oracle)/home/oracle同上
你刚创建的用户(如 zhangsan)/home/zhangsan同上

bash

# 家目录结构示例
/
├── home/
│   ├── hadoop/     ← hadoop 的家目录
│   ├── oracle/     ← oracle 的家目录
│   └── zhangsan/   ← zhangsan 的家目录
├── root/           ← root 的家目录(不在 /home 下)
├── etc/
├── var/
└── ...

三、如何快速进入/表示家目录

写法含义示例
cd ~波浪号代表家目录cd ~ → 回到自己家
cd直接 cd 不加路径cd → 也回自己家
cd ~/test进家目录下的 test 文件夹cd ~/test
$HOME环境变量,也是家目录cd $HOME
~hadoop代表 hadoop 用户的家目录ls ~hadoop

验证

bash

# 当前登录用户是 hadoop
echo $HOME
# 输出:/home/hadoop

cd ~
pwd
# 输出:/home/hadoop

四、家目录的特点

特点说明
私人专属普通用户默认只能读写自己的家目录
登录即进SSH 登录后,默认就在自己的家目录
波浪号简写~ 代表自己的家目录
权限隔离drwx------(700),默认只有自己能进去
存放个人配置.bashrc.ssh/.profile 等配置文件都在这里

bash

# 查看家目录权限
ls -ld /home/hadoop
# 输出:drwx------ 3 hadoop hadoop 4096 日期 /home/hadoop
#       ↑ 只有 hadoop 自己能读写执行

五、常用操作

bash

# 1. 回到家目录
cd ~
# 或
cd

# 2. 在家目录下创建文件夹
mkdir ~/myworkspace

# 3. 查看家目录下的所有文件(包括隐藏文件)
ls -la ~

# 4. 查看家目录占用空间
du -sh ~

# 5. 去别人的家目录(需要有权限)
cd /home/oracle   # 一般进不去,权限不够
sudo cd /root     # 需要 root 权限

六、前端类比

Linux前端类比
家目录 ~用户个人文件夹(C:\Users\你的名字\
/home/hadoopC:\Users\hadoop\
cd ~点击"此电脑 → 用户 → hadoop"
~/.bashrcC:\Users\hadoop\.bashrc(配置文件)

Windows 对比

  • Linux 家目录:/home/用户名

  • Windows 家目录:C:\Users\用户名


七、面试/考试常考

bash

# 问:以下命令分别会进哪个目录?
cd ~        # 当前用户的家目录
cd ~/data   # 当前用户家目录下的 data 文件夹
cd ~root    # root 用户的家目录(/root)
cd          # 当前用户的家目录(等价于 cd ~)
cd $HOME    # 也是家目录($HOME 环境变量)

总结一句话

家目录 = 用户在 Linux 系统中的私人文件夹,路径是 /home/用户名(root 除外),用 ~ 快速回到自己家。

你现在登录的是 hadoop 用户,所以你的家目录是 /home/hadoop,输入 cd ~ 就能回去!


怎么禁用root用户


“禁用 root 用户”在 Linux 系统里,通常不是指删除它(删不掉,删了系统会崩),而是禁止它从远程登录


核心方法如下,操作时请确保自己有一个能使用 sudo 的普通用户


🛡️ 核心操作:禁止 Root 远程登录

这是服务器安全的第一步,防止黑客用 Root 密码暴力破解。

  1. 编辑配置文件
    使用普通用户登录,执行以下命令打开 SSH 配置文件:

    bash

    sudo vi /etc/ssh/sshd_config
  2. 修改参数
    找到 PermitRootLogin 这行,如果没有就自己加上,将值改为 no

    ini

    PermitRootLogin no
  3. 重启服务生效

    bash

    sudo systemctl restart sshd

注意:如果 sshd_config 里写的是 PermitRootLogin prohibit-password,那是“允许密钥登录但禁止密码登录”,比直接 no 稍微方便一点,但最严格的是改成 no


🔐 进阶加固:限制 su 命令

即使禁止了远程登录,如果你的普通用户密码泄露,对方登录后输入 su - 并输入 Root 密码,还是能提权。


可以限制只有特定组的成员才能切换到 Root:

  1. 编辑 PAM 配置文件:

    bash

    sudo vi /etc/pam.d/su
  2. 找到 #auth required pam_wheel.so use_uid 这一行,去掉开头的 # 注释

    ini

    auth required pam_wheel.so use_uid
  3. 保存文件后,只有 wheel 组的成员才能使用 su - 切换到 Root。

    bash

    # 将当前用户加入 wheel 组
    sudo usermod -aG wheel $USER

    退出终端重新登录后,组权限才会生效。


⚠️ 操作前必读

  1. 保留一个“逃生舱”
    在关闭 Root 登录前,务必确保有一个普通用户可以正常使用 sudo 提权。如果普通用户没配好,一旦退出 Root 终端,你就再也进不去系统了。

  2. 慎用 passwd -l root
    这是锁定 Root 密码的命令。在没有 sudo 用户且单用户模式也没开的情况下执行,系统就直接“变砖”了。不建议初学者使用

  3. 理解“禁用”的边界
    这些操作主要限制的是 SSH 远程登录 和 su 切换。如果人坐在物理机前,或者能通过 IPMI 等带外管理进入,依然可以操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星汉灿烂星河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值