Linux 基础学习笔记:从入门到踩坑全记录(对笔记一的补充)
基础概念:命令解析器和内核
名词解释
刚开始学 Linux 的时候,我经常被各种名词搞混。这里记一下最核心的两个:
- 命令解析器:默认运行在终端里,负责解析你敲进去的每条命令。相当于你和系统之间的翻译官。
- 内核:操作系统的核心,我们平时说“系统”其实大多指的是内核。没有内核,啥也干不了。
终端提示符长啥样
root@itcast:~$
每个字符都有含义:用户名@主机名:当前工作路径$。注意 $ 是普通用户,# 表示 root。
常用快捷键(真香整理)
这些快捷键我一开始死活记不住,但用多了就离不开了:
| 快捷键 | 作用 |
|---|---|
| Tab | 自动补全文件名、目录、命令(强烈推荐!) |
| Ctrl+P / Ctrl+N | 上下翻历史命令 |
| Ctrl+A | 光标跳到行首 |
| Ctrl+E | 光标跳到行尾 |
| Ctrl+D | 相当于 Delete |
| Ctrl+U | 删掉光标到行首的内容 |
文件系统:Linux 的目录结构
根目录下什么东西?
初学 Linux 时,我被 /bin、/dev、/etc 这些目录搞得很懵。后来明白了,每个目录都有专门用途:
/bin:存放常用二进制可执行文件,比如ls、cat、echo。/dev:硬件设备对应的文件。Linux 里 一切皆文件,鼠标键盘都是文件。记得之前踩了个坑,想测试鼠标设备,运行了sudo cat /etc/input/mice,结果终端里乱码喷涌……吓得我赶紧按 Ctrl+C。/etc:系统配置文件的大本营。/home:普通用户的宿主目录,比如用户itcast的家在/home/itcast。/lib:系统库文件,比如标准 C 库在/lib/x86_64-linux-gnu。/root:超级管理员 root 的家。/tmp:临时文件存放处,谁都能写,但是权限有讲究(后面会讲粘滞位)。/usr:用户相关的资源,很多软件装在这里。
文件类型:Linux 不靠后缀名
这一点和 Windows 很不一样。Linux 里文件类型通过 ls -l 的第一个字符判断:
-普通文件d目录l软链接(相当于快捷方式)p管道文件s套接字文件c字符设备b块设备
前三种是真正的文件,后四种是伪文件,不占用磁盘空间。 这个知识点面试经常考。
文件访问属性:rwx 组合拳
ls -l 输出中,权限部分有 9 个字符,分为三组,每组 rwx(读、写、执行),缺失用 - 表示。
分组对应:所有者(文件创建者)、所属组(用户所在组)、其他人(路人)。
比如 drwxr-xr-- 表示:目录,所有者可读写执行,所属组可读可执行,其他人只读。
硬链接与软链接:终于搞懂了
硬链接
创建一个文件 file1,然后用 ln file1 file1.hard 创建硬链接。特点是同步更新——修改一个,另一个也跟着变。
原理是它们共享同一个 inode(文件数据索引节点)。查看 inode 可以用:
stat 文件名
ls -i 文件名
注意:不能给目录创建硬链接,只能对文件做。
软链接
用 ln -s 文件名 软链接名 创建,相当于 Windows 的快捷方式。
踩过一个坑:创建软链接最好用绝对路径,否则移动软链接文件后,它会失效。因为软链接只存路径字符串,相对路径一移动就找不到了。
ln -s /home/user/bbb b.soft # 推荐绝对路径
软链接可以给目录创建,硬链接不行。
文件与目录操作:日常高频命令
ls 命令:参数组合拳
我最常用的几个:
ls -l:显示详细信息ls -a:显示所有文件(包括隐藏文件.xxxx)ls -R:递归显示子目录ls -h:人性化显示文件大小(配合-l使用)
还有两个别名:
ll等价于ls -alFla等价于ls -a
ls -l 输出详解
-rw-r--r-- 1 itcast itcast 1024 Jun 6 19:56 hello.txt
这七部分分别是:
- 文件类型 + 权限(10个字符)
- 硬链接数
- 所有者
- 所属组
- 文件大小(普通文件是实际大小,目录是占用空间,4K 整数倍)
- 最后修改时间
- 文件名
创建文件与目录
touch 文件名:创建空文件。Linux 不认后缀名,所以qa.cc.a.a.f.a这样的文件名完全合法。mkdir 目录名:创建空目录。mkdir -p a/b/c/d可以创建多级目录。
删除:rm 要谨慎
rm 删除的文件不能恢复(虽然磁盘恢复工具很复杂,但别指望)。所以一定要小心。
rmdir 目录名:只能删除空目录。rm -r 目录名:递归删除,目录非空必须加-r。rm -f 文件名:强制删除,不提示。rm -i 文件名:交互式确认。
复制与移动
cp 命令:
cp 文件A 目录B:把文件A复制到目录B(目录B必须存在)。cp 文件A 文件B:把A覆盖到B(如果B存在)。cp -r 目录A 目录B:递归复制目录。cp -a 目录A 目录B:保留文件属性复制。
mv 命令:
mv 源文件 目标文件:改名字(目标文件不存在时)。mv 源文件 目标目录:移动文件到目录(目录存在)。- 操作目录不需要加
-r。
查看文件内容
cat 文件名:打印到屏幕。cat f1 > f2:覆盖写入。cat f1 >> f2:追加写入。tac 文件名:倒序输出(挺好玩的)。
大文件查看:
more 文件名:分屏显示,按空格翻页,Enter 翻行,q 退出。上下箭头无效。less 文件名:类似 more,但支持上下箭头滚动。head -5 文件名:看前五行。tail -5 文件名:看后五行。
查找命令路径
which 命令名:查看命令对应的可执行文件位置。比如which ls一般输出/bin/ls。
用户与权限管理:终于搞懂了“为什么我不能删这个文件”
什么是权限?为什么需要权限?
简单说,权限就是“能不能访问资源”的问题。Linux 是多用户操作系统,权限是为了隔离用户,避免乱搞。
权限的组成:人(用户/组) + 文件属性(rwx)。
用户分类
- 超级用户 root:99% 不受权限约束,特权阶级。
- 普通用户:受权限约束。
切换用户:
su 用户名:切换到其他用户(需要密码)。su - 用户名:以重新登录方式切换,环境变量更干净。Ctrl+D:回到上一个账号。
sudo:让普通用户临时提权
当普通用户想安装软件或修改系统文件时,可以用 sudo 命令。但用户必须在 /etc/sudoers 白名单里(只有 root 能改)。
添加/删除用户
sudo adduser 新用户名 # 交互式添加
sudo deluser 用户名 # 删除用户,宿主目录不会自动删
查看用户信息:/etc/passwd 文件末行新增了用户 UID、GID、宿主目录等;/etc/group 文件末行新增了组信息。
修改权限:chmod
文字设定法
chmod u+x 文件名 # 给所有者添加执行权限
chmod g-w,o+r 文件名 # 组去掉写,其他人加读
chmod a=rwx 文件名 # 所有人读写执行
操作对象:u(所有者)g(组)o(其他人)a(所有人,默认)。
操作符:+ 添加,- 去掉,= 赋予并取消其他权限。
⚠️ 踩坑提示:文件要执行必须具备两个条件:1)文件本身是可执行文件(如脚本、二进制);2)有 x 权限。缺一不可。
数字设定法
- r=4, w=2, x=1
- 每组权限范围 0~7
chmod 755 文件名 # 所有者 rwx,组 r-x,其他人 r-x
chmod 463 文件名 # 所有者 r--,组 rw-,其他人 -wx
修改所有者与所属组
sudo chown 用户名 文件名 # 改所有者
sudo chgrp 组名 文件名 # 改所属组
sudo chown 用户名:组名 文件名 # 同时改
面试高频问题
1. 进入一个目录需要什么权限?
需要可执行权限(x)。
r决定能否查看目录下文件列表。w决定能否增删改目录下文件。
2. 为什么新建文件的起始权限是 644/755?
Linux 有 权限掩码 umask。默认起始权限:
- 普通文件:666
- 目录文件:777
最终权限 = 起始权限 & (~umask)。
常见 umask 为 0022(八进制),去掉后三位 022(二进制 000 010 010),所以:
- 文件最终:666 & ~022 = 644
- 目录最终:777 & ~022 = 755
可以通过 umask 数字 临时修改。
3. 粘滞位(Sticky Bit)
问题:一个公共目录(如 /tmp),任何人都可以写,但我不想让别人删除我的文件怎么办?
粘滞位 就是干这个的。开启后,用户只能删除自己创建的文件,不能删除别人的。
- 数字表示:1000(特殊权限位),如
chmod 1777 目录名 - 字符表示:
ls -l中,其他用户执行权限位显示t(小写)或T(无执行权限时)。
示例:drwxrwxrwt 就是 /tmp 目录的典型权限。
查找与过滤:find、grep 等
find 命令:超实用
语法:find 搜索路径 参数 条件
常用参数:
-name:按文件名,支持通配符*和?-type:按类型(f文件,d目录,l链接等)-size:按大小(+3M -5M表示大于3M小于5M)-maxdepth:限制搜索深度,必须放在其他参数前面。-exec:对搜索结果执行命令,如find ./ -name "*.txt" -exec rm {} \;- 管道
| xargs:也可以将结果传给其他命令,配合-print0处理带空格的文件名。
示例:
find ~/ -name "*.jpg" -size +1M -size -5M | xargs ls -lh
grep:行文本过滤
grep '关键词' 文件名 可以筛选出包含关键词的行。常用选项:
-v:反向选择(不包含关键词的行)-n:显示行号-i:忽略大小写
进阶用法:管道组合
cat hello.txt | head -2100 | tail -10 | grep '8'
这条命令先取文件前 2100 行,再取后 10 行,最后筛选出包含 8 的行——可以用来快速定位日志。
其他小工具
file 文件名:查看文件实际类型(不靠后缀名)whereis 命令:查找命令的二进制、源码、手册位置alias 别名='命令':设置命令别名,注意是内存级别,重启失效。top:资源查看器,top -d 2 -n 5表示每2秒刷新一次,共刷新5次。
后记
这篇笔记是我学 Linux 基础时边学边记的,可能有些地方啰嗦,但都是自己踩坑后的真实感悟。比如软链接用绝对路径、粘滞位的应用场景、umask 的计算……当初没注意这些细节,调试了好半天。
Linux 的学习就是一个不断踩坑、填坑的过程。希望这篇能帮你少走一些弯路。有问题欢迎评论交流,一起进步!
下次我打算整理一下 gcc 编译和 Makefile 的内容,感兴趣的话可以关注~
十、粘滞位对目录内其他操作的详细影响
除了删除权限,粘滞位对文件的重命名和移动也有限制:
- 普通用户:无法重命名其他用户的文件,也无法将其移动到目录外;但可以对自己的文件执行任何操作。
- 文件自身权限:如果文件本身对他人有写权限(如 666),粘滞位依然阻止他人删除或重命名该文件——目录级粘滞位优先级高于文件权限。
- 目录所有者/root:不受粘滞位限制,可对目录内任何文件进行删除、重命名、移动。
验证命令(接上文测试):
# 用户B尝试重命名用户A的文件
mv public_dir/test1.txt public_dir/test2.txt # 报错:Operation not permitted
# 用户B尝试将用户A的文件移出目录
mv public_dir/test1.txt /tmp/ # 报错:Operation not permitted
# 目录所有者(root或目录创建者)执行上述操作成功
十一、粘滞位与 ACL 的交互
当目录同时设置了 ACL(访问控制列表)和粘滞位时:
- ACL 可以赋予特定用户额外权限(例如写入),但粘滞位的删除限制仍然生效。
- 即便某用户通过 ACL 获得了目录的写权限,也无法删除其他用户的文件——粘滞位是“最后一道防线”。
典型场景:共享项目目录,通过 ACL 允许特定用户组读写,开启粘滞位防止误删他人工作成果。
十二、生产环境建议
- 公共上传目录(如 web 应用的文件上传目录):必须设置粘滞位,防止用户覆盖或删除他人上传的文件。
- 共享数据目录(团队协作):推荐权限
1775(所有者组可写,其他只读)或1777(完全公开),配合粘滞位使用。 - 检查现有目录:定期执行
find / -type d -perm -1000 2>/dev/null,找出所有开启了粘滞位的目录,评估是否必要。 - 不要随意去除系统默认粘滞位:
/tmp和/var/tmp的粘滞位是安全基线,移除可能导致系统混乱。
十三、与其他特殊权限的对比
| 特殊权限 | 标识位 | 作用对象 | 效果 |
|---|---|---|---|
| SUID | 4xxx | 文件 | 执行时获得文件所有者权限 |
| SGID | 2xxx | 文件/目录 | 文件:执行时获得文件组权限;目录:新文件继承目录组 |
| 粘滞位 | 1xxx | 目录 | 限制用户删除不属于自己的文件 |
三者互不冲突,可组合设置,例如 chmod 1777 仅用了粘滞位,必要时可叠加 2777(粘滞位 + SGID)。
&spm=1001.2101.3001.5002&articleId=162142765&d=1&t=3&u=1b58b21273024b06bac32dc54a62456d)
5557

被折叠的 条评论
为什么被折叠?



