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_empty1.4rmdir的实际用处
说实话,工作中几乎不用rmdir,因为大家图方便都是rm -rf一把梭。
唯一有用场景:写脚本时判断一个目录是不是空的。
bash
# 如果是空目录就删掉 rmdir some_dir 2>/dev/null && echo "删除了空目录"rm -rf中的 -rf是什么意思
-rf是两个参数的合写,拆开看就很好记:
一、拆解
| 参数 | 全称 | 含义 |
|---|---|---|
-r | recursive | 递归(把目录里的子目录、文件全翻出来) |
-f | force | 强制(不询问、不报错) |
所以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:
/(告诉系统:从根目录开始删)参数3:
home(告诉系统:删完根目录后,再删当前目录下叫 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也删了”因为
/是最高优先级的目标,删完/系统就没了,所以必死无疑。
程序员保命三连:
禁用 root 用户:日常用普通用户,权限不够就删不了
/。用相对路径:在
/home/hadoop目录下,直接写rm -rf test/,而不是rm -rf /home/hadoop/test。养成好习惯:输入
rm -rf /或者rm -rf /*之前,深呼吸三秒,确认自己没有手抖。
如果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/hadoop | C:\Users\hadoop\ |
cd ~ | 点击"此电脑 → 用户 → hadoop" |
~/.bashrc | C:\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 密码暴力破解。
编辑配置文件
使用普通用户登录,执行以下命令打开 SSH 配置文件:bash
sudo vi /etc/ssh/sshd_config
修改参数
找到PermitRootLogin这行,如果没有就自己加上,将值改为no:ini
PermitRootLogin no
重启服务生效
bash
sudo systemctl restart sshd
注意:如果
sshd_config里写的是PermitRootLogin prohibit-password,那是“允许密钥登录但禁止密码登录”,比直接no稍微方便一点,但最严格的是改成no。
🔐 进阶加固:限制su命令
即使禁止了远程登录,如果你的普通用户密码泄露,对方登录后输入su -并输入 Root 密码,还是能提权。
可以限制只有特定组的成员才能切换到 Root:
编辑 PAM 配置文件:
bash
sudo vi /etc/pam.d/su
找到
#auth required pam_wheel.so use_uid这一行,去掉开头的#注释:ini
auth required pam_wheel.so use_uid
保存文件后,只有
wheel组的成员才能使用su -切换到 Root。bash
# 将当前用户加入 wheel 组 sudo usermod -aG wheel $USER
退出终端重新登录后,组权限才会生效。
⚠️ 操作前必读
保留一个“逃生舱”
在关闭 Root 登录前,务必确保有一个普通用户可以正常使用sudo提权。如果普通用户没配好,一旦退出 Root 终端,你就再也进不去系统了。慎用
passwd -l root
这是锁定 Root 密码的命令。在没有sudo用户且单用户模式也没开的情况下执行,系统就直接“变砖”了。不建议初学者使用。理解“禁用”的边界
这些操作主要限制的是SSH 远程登录和su切换。如果人坐在物理机前,或者能通过 IPMI 等带外管理进入,依然可以操作。
