Linux 入门详解:从环境搭建、常见指令到权限理解
本文是 Linux 入门学习的完整笔记。内容覆盖了从 Linux 背景介绍、环境搭建、常见指令,到权限管理、yum 软件安装的全过程。适合零基础的同学入门 Linux,也适合作为 C/C++ 后台开发学习路线中 Linux 基础知识的快速复习。
一、Linux 学习引言
为什么要学 Linux?
如果你做过一点开发相关的事情,一定经常听到 Linux 这个名字。你可能会问:我平时用的 Windows 挺好的,为什么还要学 Linux?
一句话回答:因为服务器上跑的大多是 Linux。
不管是你访问的网站、你用的 App 后台、还是云端的数据库,绝大多数都运行在 Linux 系统上。作为 C/C++ 开发者,我们的代码最终也是部署到 Linux 服务器上的——你不可能在 Windows 上写完了代码,连 Linux 长什么样都不知道。
Linux vs Windows
| 对比维度 | Windows | Linux |
|---|---|---|
| 图形界面 | 必带,依赖图形界面操作 | 不是必须的,服务器版通常无图形界面 |
| 收费 | 收费(正版) | 免费(开源) |
| 稳定性和安全性 | 一般(病毒多) | 高(服务器常年不重启是常态) |
| 开发环境 | IDE 集成开发 | 命令行 + 编辑器 |
| 软件安装 | 下载 .exe 双击安装 | 包管理器(yum/apt)命令行安装 |
| 权限管理 | 较弱(默认管理员权限) | 严格(普通用户权限受限) |
| 主要用途 | 个人桌面 | 服务器、嵌入式、云计算 |
Linux 在后台开发中的位置
学 C/C++ 后台开发,基本路线大致是这样的:
Linux 基础 → Linux 系统编程(进程/线程/网络) → 网络编程 → 数据库 → 项目实战
Linux 基础是这条路上的第一道门槛。如果你连 ls、cd、文件权限都不懂,后面学多进程、多线程、网络编程会非常吃力。所以打好基础非常关键。
本篇博客主要内容
- Linux 的背景和历史——了解一下"开源文化"
- 环境搭建——买云服务器、装 XShell、远程登录
- 常用命令——ls、cd、mkdir、rm、cp、mv 等(约 20 个命令)
- 文件查看——cat、more、less、head、tail
- 重定向和管道——>、>>、| 的用法
- Shell 工作原理——命令是怎么被执行的
- 权限管理——Linux 权限体系的来龙去脉
- yum 软件安装——安装、卸载、查找软件
- 常见错误和面试问题
二、Linux 背景介绍
2.1 UNIX 的历史
在讲 Linux 之前,必须先提 UNIX。
上世纪 60~70 年代,AT&T 贝尔实验室的 Ken Thompson 和 Dennis Ritchie 开发了 UNIX 操作系统。UNIX 的设计思想影响深远——它强调"一切皆文件"、"简单工具组合完成复杂任务"等理念,直到今天仍然是 Linux 的核心理念。
但 UNIX 是商业软件,源代码不开放,使用需要付费授权。
2.2 Linux 的诞生
1991 年,芬兰大学生 Linus Torvalds 在学习操作系统课程时,觉得当时的 MINIX(一个教学用类 UNIX 系统)不够好用。于是他决定自己写一个操作系统内核。
他在 comp.os.minix 新闻组发布了这样一条消息:
“Hello everybody out there using minix—I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu)…”
谁也没想到,这个"hobby"后来成了全世界最重要、最流行的操作系统内核。
2.3 Linux 和 UNIX 的关系
UNIX(商业闭源)
↑ 设计思想继承
Linux(开源免费)
↑ 受到 GNU 项目的支持和影响
Linux 不是 UNIX 的拷贝,而是类 UNIX 系统——它的设计思想、命令行接口、编程接口都和 UNIX 高度兼容,但代码是完全独立重写的。
2.4 Linux 内核 vs Linux 操作系统
这里要区分两个概念:
- Linux 内核(kernel):真正管理硬件、调度进程、管理内存的那部分核心代码。Linus 写的就是这部分。
- Linux 操作系统:内核 + 各种系统软件、工具、库。通常我们说的"安装 Linux"其实是安装一个发行版,它包含内核和大量其他软件。
2.5 GNU、GPL 和开源
GNU 是 Richard Stallman 发起的项目,目标是创建一个完全自由的 UNIX 兼容系统。GNU 贡献了大量的系统工具(gcc 编译器、bash shell、coreutils 等)。Linux 内核 + GNU 工具 = 一个完整的操作系统。
GPL(通用公共许可证)是 GNU 提出的开源协议,核心思想是:代码可以自由使用、修改、分发,但修改后的代码也必须开源。
2.6 Linux 常见发行版
| 发行版 | 特点 | 适用场景 |
|---|---|---|
| Ubuntu | 用户友好,软件新 | 个人开发、桌面 |
| CentOS | 稳定,企业级 | 服务器(RHEL 的免费版) |
| Red Hat Enterprise Linux (RHEL) | 商业支持,稳定 | 企业生产环境 |
| Debian | 稳定,纯社区 | 服务器 |
| Fedora | 新技术最先用上 | 个人桌面 |
| Arch Linux | 滚动更新,高度可定制 | 进阶用户 |
课堂使用的是 CentOS(或基于 RHEL 的发行版),后续的 yum 命令也是针对 CentOS/RHEL 系列的。
三、Linux 环境搭建

课堂笔记:Linux 的历史发展脉络和三种环境搭建方式对比
学习 Linux 需要有实验环境。常见的方式有三种:
3.1 方式一:物理机安装
直接在电脑上装 Linux —— 双系统或者完全替代 Windows。
- ✅ 性能最好
- ❌ 日常使用不方便(很多软件只有 Windows 版)
- ❌ 安装和配置复杂
3.2 方式二:虚拟机安装
在 Windows 上安装虚拟机软件(VMware / VirtualBox),再在里面安装 Linux。
- ✅ 可以同时用 Windows 和 Linux
- ✅ 不会影响宿主机系统
- ❌ 比较吃内存和硬盘
- ❌ 性能有损耗
3.3 方式三:云服务器安装(课堂推荐)
购买一台云服务器(阿里云 / 腾讯云 / 华为云),选择 CentOS 或 Ubuntu 镜像,通过 XShell 远程登录。
- ✅ 环境稳定,配置统一
- ✅ 可以远程访问,随时随地练习
- ✅ 后续学网络编程、项目部署可以直接用这台服务器
- ❌ 需要花钱(通常学生套餐很便宜——10~15 元/月)
课堂推荐使用云服务器,原因很实际:以后你要部署项目、做 Web 服务,迟早也要买服务器。现在买了,学习时练习用,学完了项目也部署在上面。
3.4 购买云服务器时需要关注什么
- 操作系统镜像:CentOS 7+ 或 Ubuntu 20.04+(建议 CentOS,课堂用的就是它)
- 公网 IP:购买后系统会分配一个公网 IP,这是你远程登录的地址
- root 用户 / root 密码:云服务器默认会创建一个 root 用户(最高权限用户),你要记住它的密码
四、使用 XShell 远程登录 Linux
4.1 为什么不用图形界面?
在实际开发中,服务器通常没有图形界面——没有显示器、没有鼠标、没有桌面环境。所有的操作都在命令行中完成。
为什么?因为:
- 图形界面占用大量系统资源(CPU、内存、显卡)——服务器要把资源用来跑业务
- 远程管理更高效——你只需要一个网络连接就能操作服务器
- 自动化部署需要命令行——脚本批量操作
4.2 什么是 XShell
XShell 是一个远程终端工具,它通过 SSH 协议连接到你的 Linux 服务器,把服务器的命令行界面"搬"到你的 Windows 屏幕上。
类似工具还有:Putty、FinalShell、SecureCRT 等。XShell 免费版就够用了。
4.3 SSH 登录
打开 XShell,新建会话:
主机: 你的云服务器公网 IP(例如 123.456.789.0)
端口: 22(SSH 默认端口)
然后会弹出登录窗口,输入用户名和密码:
# 相当于在命令行执行:
ssh root@123.456.789.0
root:Linux 超级管理员账户@:分隔用户和地址123.456.789.0:你的云服务器公网 IP
登录成功的标志是看到这样的提示符:
[root@localhost ~]#
各部分的含义:
root:当前登录的用户名localhost:主机名(可以改名)~:当前目录是 root 的家目录/root#:超级管理员提示符
4.4 登录失败可能的原因
| 现象 | 可能原因 | 解决方式 |
|---|---|---|
| 连接超时 | 公网 IP 不对 / 服务器没开机 | 检查 IP 和服务器状态 |
| 连接被拒绝 | SSH 服务没启动 / 端口不是 22 | 检查 SSH 服务状态 |
| 认证失败 | 密码不对 | 重置 root 密码 |
| 服务器不在安全组放行 22 端口 | 云服务器安全组规则限制 | 登录云控制台配置安全组 |
课堂小提示:在 XShell 中,复制是用
Ctrl+Insert,粘贴是用Shift+Insert。Ctrl+C和Ctrl+V在 XShell 中是发送中断信号和……什么也没有。刚开始不习惯是正常的,多用几次就好了。
五、Linux 基本认识
5.1 Linux 下一切皆文件
Linux 的设计哲学之一是 “Everything is a file”。
这句话的意思是:在 Linux 中,普通文件、目录、设备(键盘、鼠标、硬盘)、网络连接、管道……都被抽象成了"文件"这个概念。你打开一个设备、读一个 Socket、写一个管道,系统调用(open/read/write/close)是统一的。
这个设计让 Linux 的操作非常简洁和一致。
5.2 目录结构是一棵树
Linux 的目录结构是一棵倒挂的树,根是 /(根目录)。所有文件都在 / 下面。
一些重要的目录:
| 目录 | 用途 |
|---|---|
/ |
根目录——整个文件系统的起点 |
/root |
root 用户的家目录 |
/home |
普通用户的家目录(如 /home/zhangsan) |
/bin |
存放常用命令(如 ls、cp) |
/usr |
存放系统软件和用户安装的软件 |
/etc |
配置文件目录 |
/var |
变动数据(日志等) |
/tmp |
临时文件(所有用户都可写) |
/dev |
设备文件 |
/lib |
系统库文件 |
/proc |
进程信息(伪文件系统) |
5.3 绝对路径和相对路径
| 概念 | 说明 | 示例 |
|---|---|---|
| 绝对路径 | 从根目录 / 开始的完整路径 |
/home/user/test.txt |
| 相对路径 | 相对于当前目录的路径 | ../test.txt |
| 当前目录 | 用 . 表示 |
./a.txt 等价于当前目录下的 a.txt |
| 上级目录 | 用 .. 表示 |
../ 表示上一级目录 |
| 家目录 | 用 ~ 表示 |
cd ~ 回到当前用户的家目录 |
# 示例
pwd # 显示当前目录
cd /home # 绝对路径切换到 /home
cd .. # 回到上级目录
cd ~ # 回到家目录
cd - # 回到上一个工作目录
六、常见 Linux 指令详解

课堂笔记:Linux 基础指令第一部分的整理
下面逐个讲解课堂上常用的 Linux 命令。每个命令我都会写出:命令作用 → 常见语法 → 常用选项 → 示例 → 易错点。
6.1 ls —— 列出目录内容
语法:ls [选项] [路径]
常用选项:
| 选项 | 含义 |
|---|---|
-l |
长格式显示(文件类型、权限、大小、修改时间等) |
-a |
显示所有文件,包括以 . 开头的隐藏文件 |
-h |
以人类可读的方式显示大小(K、M、G) |
-R |
递归显示子目录内容 |
-t |
按修改时间排序 |
ls # 列出当前目录的文件和目录名(简洁版)
ls -l # 详细列表(常简写为 ll,很多系统上 ll 就是 ls -l 的别名)
ls -a # 显示所有文件,包括 . 和 ..
ls -lh # 显示大小(单位 K/M/G)
ls -la # 列出所有文件的详细信息
ls -l 的输出示例:
-rw-r--r-- 1 root root 1234 Mar 15 10:30 test.txt
drwxr-xr-x 2 root root 4096 Mar 15 10:31 mydir/
各字段含义:
- 第 1 字符:文件类型(
-普通文件,d目录,l软链接) - 第 2~10 字符:权限(rwx)
- 第 2 列:硬链接数
- 第 3 列:拥有者(owner)
- 第 4 列:所属组(group)
- 第 5 列:大小(字节)
- 第 6~8 列:最后修改时间
- 第 9 列:文件名
💡 提示:
ll在很多系统上是ls -l的别名,但不是所有 Linux 都默认有。如果ll不好使,用ls -l。
6.2 pwd —— 显示当前目录
pwd # 显示当前所在的绝对路径
示例:
[root@localhost ~]# pwd
/root
每次 cd 到新目录后,不确定自己在哪时,就用 pwd 确认一下。
6.3 cd —— 切换目录
语法:cd [路径]
cd /home # 切换到 /home 目录
cd .. # 切换到上级目录
cd ~ # 切换到当前用户的家目录
cd - # 切换到上一个工作目录
cd / # 切换到根目录
cd ./test # 切换到当前目录下的 test 子目录
❗ 易错点:
cd命令必须跟目录路径。如果你写cd /home/user/test.txt(指向一个文件),会报错。
6.4 touch —— 创建文件或更新时间戳
touch file.txt # 如果文件不存在,创建一个空文件
touch file.txt # 如果文件已存在,更新文件的时间戳(不改变内容)
touch a.txt b.txt c.txt # 同时创建多个文件
💡 注意:刚学 Linux 时,
touch是你创建空文件最常用的命令。不用打开编辑器,直接touch 文件名就行。
6.5 mkdir —— 创建目录
语法:mkdir [选项] 目录名
mkdir mydir # 创建单个目录
mkdir dir1 dir2 dir3 # 同时创建多个目录
mkdir -p a/b/c # 递归创建多级目录(-p)
-p 选项非常实用——如果要创建的目录的父目录不存在,-p 会自动创建所有必要的父目录。如果没有 -p,mkdir a/b/c 会报错(父目录 a 不存在)。
6.6 rmdir —— 删除空目录
rmdir emptydir # 删除一个空目录
rmdir -p a/b/c # 递归删除空目录(c 删除后继续删 b 和 a)
❗ 易错点:
rmdir只能删除空目录。如果目录非空(里面还有文件或子目录),会报错。实际工作中,删除非空目录更常用rm -rf 目录名。
6.7 rm —— 删除文件或目录
语法:rm [选项] 目标
rm file.txt # 删除文件(会有确认提示)
rm -f file.txt # 强制删除(无确认提示)
rm -r mydir # 递归删除目录(删除 mydir 及其所有内容)
rm -rf mydir # 最常用的删除方式——递归 + 强制
rm -rf / # ⚠️⚠️⚠️ 极度危险!!!删库跑路命令!!!
🚨 特别警告:
rm -rf /是删除根目录下的所有内容。一旦执行,整个系统就废了。千万不要在任何服务器上尝试。 日常使用、练习时也要非常小心rm -rf的组合,确认目标路径后再回车。
6.8 man —— 查看帮助
man ls # 查看 ls 命令的详细手册
man printf # 查看 C 的 printf 函数说明
man 3 printf # 查看第 3 章(库函数)中的 printf
man 是 Linux 下最强大的学习工具——任何命令不会用,man 命令名 就能看到它的完整文档。
在 man 页面中:
- 按
q退出 - 按
↑/↓或j/k上下翻页 - 按
/关键字搜索 - 按
n跳到下一个匹配项
💡 学习建议:
man手册虽然是英文的,但这是你提升 Linux 能力最快的方式。刚开始看不习惯,坚持下去会越来越好。
6.9 cp —— 复制文件或目录
语法:cp [选项] 源 目标
cp file1.txt file2.txt # 将 file1 复制为 file2
cp file1.txt /home/user/ # 将 file1 复制到 /home/user/ 下
cp -r dir1 dir2 # 递归复制目录(复制 dir1 为 dir2)
cp -f file1 file2 # 强制覆盖(不提示确认)
# 课堂典型用法
touch test.txt
cp test.txt test_backup.txt # 备份文件
mkdir backup
cp test.txt backup/ # 复制到目录中
❗ 易错点:复制目录时必须加
-r选项。只写cp dir1 dir2会报错——“omitting directory”。
6.10 mv —— 移动或重命名
语法:mv [选项] 源 目标
mv file.txt /home/user/ # 移动文件到指定目录
mv oldname.txt newname.txt # 重命名(在同一目录下移动)
mv file.txt file2.txt /dir/ # 移动多个文件到 /dir/
mv 既可以移动文件,也可以重命名文件——核心逻辑就是一个"搬"字。不跨文件系统时,mv 只是修改目录项,比 cp 快得多。
6.11 cat —— 查看文件内容(小文件)
cat file.txt # 一次性显示文件全部内容
cat -n file.txt # 显示行号
cat file1.txt file2.txt # 拼接显示多个文件
❗ 易错点:
cat适合小文件。如果文件很大(几千行),cat会把所有内容刷屏到终端,你根本看不清。
6.12 more —— 分页查看(只能向下翻)
more bigfile.txt # 分页显示,按空格翻下一页
more -5 bigfile.txt # 每屏显示 5 行
more 的局限:只能向下翻页(按空格/回车),不能向上翻。这在实际使用中很不方便——如果你看漏了上一页的内容,没法往回翻。
6.13 less —— 更强力的分页查看
less bigfile.txt # 分页显示,支持上下翻页
less 比 more 灵活得多:
↑/↓或j/k:上下滚动一行PgUp/PgDn或空格/b:上下翻页/关键字:搜索,按n跳到下一个q:退出
💡 业界有句话:“Less is more.” 在功能上 less 确实比 more 更强。
6.14 head —— 查看文件开头
语法:head [选项] 文件
head file.txt # 默认显示前 10 行
head -n 5 file.txt # 显示前 5 行
head -c 100 file.txt # 显示前 100 个字节
6.15 tail —— 查看文件结尾
语法:tail [选项] 文件
tail file.txt # 默认显示后 10 行
tail -n 5 file.txt # 显示后 5 行
tail -f file.txt # 动态跟踪文件新增内容(最常用!)
tail -f 是最常用的调试命令之一。比如你的服务器正在跑一个 Web 程序,日志文件不断写入新内容,用 tail -f log.txt 可以实时看到最新的日志输出。
按 Ctrl+C 退出 tail -f。
6.16 date —— 日期和时间
date # 显示当前时间
date +%Y-%m-%d # 格式化显示:2024-03-15
date +"%Y-%m-%d %H:%M:%S" # 自定义格式:2024-03-15 10:30:00
date -s "2024-03-15 10:30:00" # 设置系统时间(需要 root 权限)
6.17 cal —— 日历
cal # 显示当月日历
cal 2024 # 显示 2024 年全年日历
cal 3 2000 # 显示 2000 年 3 月的日历
6.18 find —— 查找文件
语法:find [路径] [选项]
find /home -name "test.txt" # 在 /home 下按文件名查找
find / -name "*.log" # 查找所有 .log 文件
find / -size +100M # 查找大于 100MB 的文件
find / -name "*.cpp" -type f # 只查找普通文件(不查目录)
6.19 grep —— 文件内容搜索
语法:grep [选项] "模式" 文件
grep "hello" file.txt # 在 file.txt 中搜索 "hello"
grep -r "main" /home/project/ # 递归搜索目录下的所有文件
grep -n "error" log.txt # 显示匹配行及其行号
grep -i "hello" file.txt # 忽略大小写
grep -v "hello" file.txt # 反向匹配(显示不含 hello 的行)
grep "^error" log.txt # 搜索以 error 开头的行
grep "fail$" log.txt # 搜索以 fail 结尾的行
6.20 zip / unzip —— 压缩和解压
zip archive.zip file1.txt file2.txt # 压缩两个文件
zip -r archive.zip mydir/ # 递归压缩目录
unzip archive.zip # 解压到当前目录
unzip archive.zip -d /home/user/ # 解压到指定目录
6.21 tar —— 打包和压缩
语法:tar [选项] 打包名 文件
tar -cvf archive.tar file1 file2 # 打包(不压缩)
tar -czvf archive.tar.gz file1 file2 # 打包并 gzip 压缩(最常用)
tar -xzvf archive.tar.gz # 解压 tar.gz 文件
tar -xjvf archive.tar.bz2 # 解压 tar.bz2 文件
各选项含义:
c:创建打包文件x:解压z:通过 gzip 压缩/解压(.tar.gz)j:通过 bzip2 压缩/解压(.tar.bz2)v:显示处理过程f:指定打包文件名(必须放在选项最后)
6.22 uname —— 查看系统信息
uname # 显示内核名(Linux)
uname -a # 显示所有系统信息(内核版本、主机名、架构等)
uname -r # 只显示内核版本号
6.23 whoami —— 当前用户名
whoami # 显示当前登录的用户名
如果当前是 root,输出 root;如果是普通用户 zhangsan,输出 zhangsan。
6.24 clear —— 清屏
clear # 清空终端屏幕
快捷键也是 Ctrl+L——效果和 clear 一样。
七、文件查看相关命令

课堂笔记:文件查看命令和更多基础指令的整理
上面已经介绍了 cat、more、less、head、tail 的单独用法。这里集中做一些对比和进阶使用。
7.1 cat vs more vs less 对比
| 命令 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
cat |
小文件(几十行以内) | 最直接,能和管道完美配合 | 大文件直接刷屏 |
more |
较大文件 | 分页 | 不能向上翻页 |
less |
大文件 / 需要搜索 | 上下翻页 + 搜索 | 命令行交互方式需要适应 |
7.2 head 和 tail 配合取中间某行
这是一个非常经典的用法——结合管道 |:
# 取出文件的第 50 行
head -n 50 file.txt | tail -n 1
# 取出第 101~110 行
head -n 110 file.txt | tail -n 10
工作原理:
head -n 110取出前 110 行- 通过管道
|把结果传给tail -n 10 tail -n 10从接收到的 110 行中取出最后 10 行 → 就是第 101~110 行
7.3 tail -f 查看动态日志
tail -f /var/log/messages # 实时跟踪系统日志
这是排查服务器问题时最常用的命令之一。程序在运行时不断写入日志,你用 tail -f 实时看到每一条新日志。
八、重定向和管道

课堂笔记:重定向、管道、echo 等命令的课堂整理
8.1 三个标准流
Linux 启动一个程序时,默认会打开三个文件(流):
| 流 | 名称 | 文件描述符 | 默认去向 |
|---|---|---|---|
stdin |
标准输入 | 0 | 键盘 |
stdout |
标准输出 | 1 | 屏幕 |
stderr |
标准错误 | 2 | 屏幕 |
重定向就是把这些流的"默认去向"改到文件中。
8.2 > 输出重定向
echo "hello Linux" > log.txt # 将 "hello Linux" 写入 log.txt(覆盖写)
ls -l > output.txt # 将 ls 的结果写入文件
> 会覆盖目标文件的原内容。每次执行都重新写入。
8.3 >> 追加重定向
echo "hello again" >> log.txt # 在 log.txt 末尾追加一行(不覆盖原有内容)
date >> log.txt # 把当前时间追加到文件
>> 是追加,不会覆盖原有内容。适合累积日志。
8.4 < 输入重定向
cat < input.txt # 从 input.txt 中读取内容,传给 cat
wc -l < file.txt # 统计 file.txt 的行数(输入重定向)
8.5 | 管道
管道符号 | 把前一个命令的输出作为后一个命令的输入。
# 相当于"接力"——前一个命令的结果交给后一个命令继续处理
ls -l /usr/bin | grep "zip" # 列出 /usr/bin 下所有含 "zip" 的文件
ps aux | grep "nginx" # 查找 nginx 进程
cat file.txt | head -n 100 | tail -n 10 # 三命令组合
为什么要用管道?
Linux 哲学:每个命令只做一件事,但你可以用管道把它们组合起来完成复杂任务。
ls只负责列出文件grep只负责搜索文本head、tail只负责截取行
单独看,每个命令都很简单。但通过管道组合起来,威力就大了:
# 查找项目中最大的 5 个 .log 文件
find /var/log -name "*.log" -type f | xargs ls -lhS | head -5
💡 理解管道是 Linux 进阶的第一步。管道让你从"背命令"变成"组合命令"。
九、shell 命令以及运行原理
9.1 用户不能直接操作内核
Linux 严格意义上说只是内核(kernel)——它负责管理硬件、调度进程、分配内存。但用户不能直接操作内核(那太危险了——万一你直接写某块内存,系统就崩了)。
操作系统整体是分层结构:
+------------------------------------+
| 用户(User) |
+------------------------------------+
| Shell(命令行解释器) |
+------------------------------------+
| 内核(Kernel)—— 进程/内存/驱动管理 |
+------------------------------------+
| 硬件(CPU/内存/磁盘/网卡) |
+------------------------------------+
9.2 Shell 是什么
Shell(壳)是命令行解释器,它的核心工作就是:
- 读取你在终端输入的命令
- 解析命令(拆解命令名、选项、参数)
- 调用内核提供的系统接口去执行命令
- 把执行结果返回给你
你可以把 Shell 理解成用户和内核之间的翻译官——你说的汉语(命令行)它翻译成机器能懂的指令。
9.3 bash
常见的 Shell 有:
bash(Bourne Again Shell)—— Linux 默认,最常用sh(Bourne Shell)—— 最初的 Shellzsh(Z Shell)—— 功能更丰富,macOS 默认csh、ksh等
你当前用的就是 bash。可以通过 echo $SHELL 验证。
9.4 类比理解
类比 Windows:你双击一个图标打开程序(GUI,图形用户界面),Linux 通过 Shell 命令行完成同样的事(CLI,命令行界面)。本质是一样的——都是用户和操作系统交互。只不过 Windows 用鼠标点,Linux 用键盘敲。
9.5 命令执行的大致流程
当你输入 ls -l /home 并回车:
- Shell 读取到字符串
"ls -l /home" - Shell 解析出:命令 =
ls,选项 =-l,参数 =/home - Shell 到
$PATH环境变量指定的路径(如/bin、/usr/bin)中查找ls程序 - 找到
/bin/ls后,Shell 通过系统调用 fork + exec 创建子进程执行ls ls执行并输出结果- Shell 打印提示符,等待下一条命令
十、Linux 权限基础

课堂笔记:Linux 用户分类和文件权限的初步理解
10.1 root 用户 vs 普通用户
Linux 是一个多用户操作系统,不同的用户有不同的权限。
| 用户类型 | 提示符 | 权限范围 | 危险性 |
|---|---|---|---|
| root(超级管理员) | # |
无限制——可以做任何事 | 高 |
| 普通用户 | $ |
受限——只能操作自己的文件和系统允许的部分 | 低 |
登录时看到的是 # 还是 $,就能判断当前是不是 root。
10.2 su 切换用户
su root # 切换到 root 用户(需输入密码)
su - zhangsan # 切换到普通用户 zhangsan
su # 不写用户名默认切换到 root
10.3 sudo 临时提权
sudo yum install gcc # 普通用户临时以 root 身份执行命令
sudo 允许被授权的普通用户临时以 root 身份执行特定命令。普通用户能否使用 sudo,由 /etc/sudoers 文件决定。
为什么不用 su 直接切 root?在实际开发中,你的大部分时间应该用普通用户,只有需要管理员权限时才用 sudo 或 su。这样可以减少误操作的风险。
10.4 文件访问者分类
Linux 把访问文件的用户分为三类:
| 缩写 | 英文 | 含义 |
|---|---|---|
u |
user | 文件拥有者(文件的创建者) |
g |
group | 文件所属组(同组内其他用户) |
o |
others | 其他人(既不是拥有者也不在组内) |
为什么要有分组?想象一个场景:你写了一个项目文件,不希望别人碰,但同组的同事可以读。你就可以设 u=rw(自己可读写),g=r(同事可读),o=(其他人无权限)。
十一、文件类型和权限
11.1 ls -l 的输出怎么看
输入 ls -l,你会看到这样的输出:
-rw-r--r-- 1 root root 1234 Mar 15 10:30 test.txt
drwxr-xr-x 2 root root 4096 Mar 15 10:31 mydir/
拆开来看:
第一个字符:文件类型
- :普通文件
d :目录
l :软链接(类似 Windows 快捷方式)
第 2~10 字符:权限
rw- | r-- | r--
u g o
拥有者 组员 其他人
第 2 列:硬链接数
第 3 列:拥有者(user)
第 4 列:所属组(group)
第 5 列:文件大小(字节)
第 6~8 列:最后修改时间
第 9 列:文件名
11.2 文件类型列表
| 字符 | 文件类型 | 示例 |
|---|---|---|
- |
普通文件 | 文本、二进制、代码 |
d |
目录 | 文件夹 |
l |
软链接(符号链接) | 类似 Windows 快捷方式 |
b |
块设备文件 | 硬盘、U 盘 |
c |
字符设备文件 | 键盘、鼠标 |
p |
管道文件 | 用于进程间通信 |
s |
socket 文件 | 网络通信 |
11.3 r、w、x 的含义
对普通文件来说:
| 权限 | 含义 | 具体表现 |
|---|---|---|
r |
读 | 可以查看文件内容(cat、less、vim 查看) |
w |
写 | 可以修改文件内容 |
x |
执行 | 可以运行这个文件(如果是可执行程序) |
对目录来说:
| 权限 | 含义 | 具体表现 |
|---|---|---|
r |
读 | 可以列出目录内容(ls 目录名) |
w |
写 | 可以在目录中创建、删除、重命名文件 |
x |
执行 | 可以进入目录(cd 目录名) |
🚨 重点强调:目录的
x权限非常关键。
- 你对一个目录只有
r权限:你可以ls看到目录里有哪些文件,但不能cd进去。- 你对一个目录只有
x权限:你可以cd进去,但不能ls看到文件名(需要有r)。- 你想对目录里的文件做任何操作:必须同时有
r+x(ls 和 cd 都要能)。
十二、权限的表示方法
12.1 字符表示法
就是我们上面看到的 rwxr-xr-- 这种形式,每 3 个字符一组:
u=rwx # 拥有者:读+写+执行
g=r-x # 组员:读+执行
o=r-- # 其他人:只读
12.2 八进制表示法
每个权限用一个数字表示,3 个权限位加起来就是组权限:
r = 4
w = 2
x = 1
常用组合:
| 八进制 | 字符表示 | 含义 |
|---|---|---|
7 |
rwx |
读 + 写 + 执行 |
6 |
rw- |
读 + 写 |
5 |
r-x |
读 + 执行 |
4 |
r-- |
只读 |
0 |
--- |
无权限 |
12.3 常见权限模式
| 权限 | 含义 | 适用场景 |
|---|---|---|
755 |
rwxr-xr-x | 可执行文件或目录(典型:用户可写,其他人只可读和执行) |
644 |
rw-r–r– | 普通文本文件 |
700 |
rwx------ | 只有拥有者可读写执行 |
600 |
rw------- | 只有拥有者可读写 |
777 |
rwxrwxrwx | 所有人可读写执行(非常危险,尽量别用) |
12.4 chmod —— 修改权限
用户+操作符+权限 方式:
chmod u+x file.txt # 给拥有者添加执行权限
chmod g-w file.txt # 移除组员的写权限
chmod o=r file.txt # 其他人的权限设为只读
chmod u+x,g-r file.txt # 多个操作同时进行
chmod a+x file.txt # 给所有人(all)添加执行权限
八进制方式:
chmod 755 file.txt # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod 700 file.txt # rwx------
chmod 777 file.txt # rwxrwxrwx —— 小心!
12.5 chown —— 修改拥有者
chown zhangsan file.txt # 将文件拥有者改为 zhangsan
chown zhangsan:devteam file.txt # 同时修改拥有者和所属组
只有 root 用户可以执行 chown。
12.6 chgrp —— 修改所属组
chgrp devteam file.txt # 将文件所属组改为 devteam
十三、目录权限深入理解
13.1 为什么有 r 权限不一定能 cd 进去?
# 实验
mkdir testdir
chmod 444 testdir # dr--r--r-- 只有 r 权限,没有 x
ls testdir # ✅ 可以看到文件名(有 r)
cd testdir # ❌ permission denied!(没有 x)
原因:目录的 x 权限表示"允许进入目录"。只有 r 而没有 x,你只能"看一眼"目录里有什么,但进不去。
13.2 删除文件看的是目录权限
这是一个非常反直觉但很重要的知识点:
能否删除一个文件,取决于你对文件所在的目录是否有写权限,而不是文件本身的权限。
# 实验
touch test.txt
chmod 000 test.txt # 文件权限全关
ls -l test.txt # ---------- 1 root root 0 ...
rm test.txt # ✅ 可以删除!
为什么能删除?因为 rm 删除文件时,修改的是目录内容(从目录中移除这个文件名和 inode 的对应关系),而不是修改文件本身。所以你只要有目录的 w + x 权限就能删除文件,和文件本身的权限无关。
13.3 粘滞位(sticky bit)
粘滞位是一个目录的特殊权限,加上粘滞位后,只有文件的拥有者和 root 才能删除目录里的文件,其他人即使是目录有写权限也不能删除别人的文件。
chmod +t /tmp # 给 /tmp 目录添加粘滞位
ls -ld /tmp # drwxrwxrwt ...(最后一个 t 就是粘滞位标志)
为什么需要粘滞位?
拿 /tmp 来说——这是一个所有用户都可以写入的临时目录(权限是 777)。如果没有粘滞位,用户 A 创建了一个临时文件 A.tmp,用户 B 随手就把 A.tmp 删了——这显然不合理。
加上粘滞位后,只有文件拥有者和 root 才能删除 /tmp 里的文件。
chmod +t mydir # 添加粘滞位
chmod -t mydir # 移除粘滞位
十四、umask
14.1 什么是 umask
新建一个文件,它的默认权限不是 666(rw-rw-rw-),新建一个目录,默认权限也不是 777(rwxrwxrwx)——实际权限会比这些小一些。
为什么?因为 Linux 在创建文件时会用 umask 来屏蔽掉一部分权限。umask 就是"创建时要排除的权限"。
14.2 查看和设置 umask
umask # 查看当前 umask(通常是 0022)
umask 0027 # 设置 umask
14.3 默认权限计算公式
文件默认权限 = 666 & ~umask
目录默认权限 = 777 & ~umask
& ~umask 的意思是:从完整权限中去掉 umask 中设置的位。
示例:umask = 0022
文件:666 & ~022 = 666 & 755 = 644(rw-r--r--)
目录:777 & ~022 = 777 & 755 = 755(rwxr-xr-x)
为什么 umask 通常是 0022?
0位(特殊权限位):不影响022:文件创建时,组员和其他人的写权限默认被去掉
这样新建的文件默认是 644——拥有者可读写,组员和他人只能读。这符合安全原则:默认不给别人写权限。
# 修改 umask 后新建文件的权限会不同
umask 0027
touch newfile.txt
ls -l newfile.txt # 权限变成 640(rw-r-----)
十五、yum 软件安装

课堂笔记:yum 包管理器的使用和软件源配置
15.1 yum 是什么?
yum = Yellowdog Updater Modified
简单说,yum 就是 Linux 上的"应用商店"——你在手机上从应用商店安装 App,你在 Linux 上用 yum 安装软件包。
# 两者的对比
手机 AppStore → 搜索 → 点击安装 → 自动处理依赖
Linux yum → yum search → yum install → 自动处理依赖
15.2 Linux 软件的依赖关系
Linux 下的软件不是"一个安装包包含所有"的。一个程序通常依赖很多共享库(.so 文件):
你要安装 nginx:
nginx 依赖 openssl
openssl 依赖 zlib
...
手动解决这些依赖关系是噩梦——你可能要装几十个库才能跑起来一个程序。yum 的职责之一就是自动解决依赖关系:你只需要说"我要装 nginx",yum 会自动把 openssl、zlib 等依赖全部装好。
15.3 常用 yum 命令
# 安装软件(需要 root 权限)
yum install -y gcc # -y 表示自动确认,不用手动输入 "y"
yum install -y gcc-c++ # C++ 编译器
yum install -y lrzsz # rz/sz 文件上传下载工具
# 卸载软件
yum remove gcc # 卸载 gcc
# 列出已安装/可用的软件
yum list # 列出所有可用软件包(太多了)
yum list | grep gcc # 筛选 gcc 相关
yum list installed # 列出已安装的
# 搜索软件
yum search "compiler" # 搜索包含 "compiler" 关键词的软件包
15.4 yum 源
yum 不是自己知道有哪些软件的——它从**软件仓库(repository)**中获取信息。软件仓库的配置文件在 /etc/yum.repos.d/ 目录下。
ls /etc/yum.repos.d/
# CentOS-Base.repo — base 源(基本软件)
# epel.repo — epel 源(扩展软件)
- base 源:CentOS 官方维护的基础软件源,包含大部分常用软件
- epel 源:Extra Packages for Enterprise Linux,额外软件源,包含更多第三方软件
有时候 yum install 报错找不到软件包,可能就是因为需要的包在 epel 源中——需要先安装 epel-release:
yum install -y epel-release # 安装 EPEL 源
15.5 rz/sz —— 和 Windows 传文件
安装 lrzsz 后,你就有了两个非常实用的命令:
yum install -y lrzsz
rz # 从 Windows 上传文件到 Linux(弹出文件选择窗口)
sz filename # 从 Linux 下载文件到 Windows
在 XShell 中,rz 会弹出一个 Windows 文件选择窗口,选好文件后自动上传到服务器的当前目录。
十六、常见易错点总结
| # | 易错点 | 说明 |
|---|---|---|
| 1 | 路径区分大小写 | File.txt 和 file.txt 是两个不同的文件 |
| 2 | rm -rf 很危险 | 特别是 rm -rf / 和 rm -rf .*,删除前一定确认路径 |
| 3 | root 权限很大,不要乱用 | 日常用普通用户,需要权限时用 sudo |
| 4 | cd … 是上级,cd / 是根目录 | 别搞混了 — .. 是上级,/ 是根 |
| 5 | cd ~ 和 cd - 不同 | ~ 回到家目录,- 回到上一个工作目录 |
| 6 | cat 不适合大文件 | 几百行以上的文件用 less 或 head |
| 7 | more 只能向下翻 | less 可以上下翻还支持搜索 |
| 8 | > 是覆盖, >> 才是追加 |
> 会清空文件重新写,>> 在末尾添加 |
| 9 | 目录的 x 权限很重要 | 没有 x 权限就不能 cd 进去 |
| 10 | 删除文件看的是目录权限 | 不是文件本身的权限决定的 |
| 11 | chmod 777 不要乱给 | 等于让所有人可以做任何事,非常危险 |
| 12 | yum install 失败可能是网络或源问题 | 检查是否能联网,检查 /etc/yum.repos.d/ 配置 |
| 13 | cp 复制目录必须加 -r |
不加 -r 会报错:omitting directory |
| 14 | mv 不同文件系统时不是 O(1) |
跨文件系统 mv 实际上是 cp + rm |
| 15 | Linux 命令行下 Ctrl+C 不是复制 | Ctrl+C 是终止当前程序,Ctrl+Insert 才是复制 |
十七、面试 / 学习常见问题
1. Linux 和 Windows 有什么区别?
从使用场景看:Windows 适合个人桌面、办公、游戏;Linux 适合服务器、嵌入式开发、云计算。从设计理念看:Linux 强调命令行、权限管理、多用户;Windows 强调图形界面、易用性、单用户友好。
2. Linux 为什么常用于服务器?
稳定(跑几年不重启是常态)、安全(权限体系完善、病毒少)、免费开源(没有授权费用)、资源占用低(没有图形界面时内存占用很小)。
3. 什么是 shell?
Shell 是命令行解释器——它读取用户的命令,解析后调用操作系统内核的接口去执行,最后把结果返回给用户。常见的 shell 有 bash、zsh 等。
4. shell 和 kernel 的关系是什么?
Kernel 是内核——管理硬件、进程、内存。Shell 是壳——负责用户和内核之间的交互。用户不能直接操作 kernel,必须通过 shell。
5. Linux 下"一切皆文件"是什么意思?
普通文件、目录、设备、网络连接、管道等在 Linux 中都被抽象为文件,用统一的接口(open/read/write/close)操作。这种设计让 Linux 的操作和编程接口简洁一致。
6. 绝对路径和相对路径有什么区别?
绝对路径从根目录 / 开始写(如 /home/user/file.txt),唯一确定;相对路径从当前目录开始写(如 ../file.txt),依赖当前在哪里。绝对路径在任何情况下都不会歧义,相对路径更简短。
7. cat、more、less 有什么区别?
三者都是查看文件内容的命令。cat 一次性输出全部内容,适合小文件;more 分页显示,但只能向下翻;less 分页显示,支持上下翻页和搜索,功能最强。
8. head 和 tail 如何配合使用?
head -n N file | tail -n 1 取第 N 行;head -n M file | tail -n K 取第 M-K+1 到 M 行。head 取前 M 行,tail 从结果中取后 K 行。
9. > 和 >> 有什么区别?
> 输出重定向并覆盖原文件内容;>> 输出重定向并追加到文件末尾。
10. 管道 | 的作用是什么?
管道把前一个命令的标准输出作为后一个命令的标准输入,实现命令的"接力"组合。每个简单的命令通过管道可以完成复杂的任务。
11. root 用户和普通用户有什么区别?
root 是超级管理员,权限无限制;普通用户权限受限,只能操作自己的文件和被授权的部分。建议日常操作使用普通用户,需要管理员权限时用 sudo 或 su。
12. Linux 文件权限中的 r/w/x 分别是什么意思?
对文件:r 可读内容,w 可修改内容,x 可执行。对目录:r 可列出内容,w 可创建/删除文件,x 可进入目录。
13. 对目录来说 x 权限是什么意思?
x 权限表示"能否进入这个目录"。即使你有目录的 r 权限(可以 ls 看到文件名),但没有 x 权限也不能 cd 进去。x 是"通行证"。
14. chmod 755 是什么意思?
755(rwxr-xr-x):拥有者可以读、写、执行(7),组员可以读和执行(5),其他人可以读和执行(5)。这是常见的目录和可执行文件的权限设置。
15. umask 是什么?
umask 是"创建文件时屏蔽掉的权限",它决定了新文件和新目录的默认权限。文件默认权限 = 666 & ~umask,目录默认权限 = 777 & ~umask。最常见的 umask 是 0022。
16. 什么是粘滞位?
粘滞位(sticky bit)是一个目录的特殊权限。加上粘滞位后,只有文件拥有者和 root 能删除或重命名目录中的文件,其他人即使有目录的写权限也不能删除别人的文件。典型例子:/tmp 目录。
17. yum 是什么?
yum 是 Linux(RHEL/CentOS 系列)的包管理器,用于安装、更新、卸载软件。它能自动解决依赖关系,从软件仓库下载并安装软件包。
18. yum install 的底层大致做了什么?
- 读取
/etc/yum.repos.d/中的仓库配置 - 从远程软件仓库下载软件包元数据
- 解析要安装的软件的依赖关系
- 下载所有需要的软件包
- 安装并配置软件
十八、最后总结
本篇博客的学习主线
整个 Linux 入门过程可以总结为一条主线:
认识 Linux → 搭建环境 → 基本操作 → 常见命令 → 理解 Shell → 权限管理 → 软件安装
每一步都是下一步的基础:
- 认识 Linux:了解它的历史、哲学、和 Windows 的区别——这是"为什么学"的问题
- 搭建环境:买云服务器、装 XShell、远程登录——这是"怎么开始"的问题
- 基本操作:pwd、cd、ls——先搞清楚"我在哪,有哪些文件"
- 常见命令:20+ 个常用命令——熟练掌握后能独立完成日常操作
- 理解 Shell:命令怎么执行的、标准输入/输出是怎么回事——从"会用"到"理解"
- 权限管理:用户、文件权限、chmod、umask、粘滞位——这是 Linux 安全的基础
- 软件安装:yum——学会自己装软件
这些是后续学习的基石
本篇的内容是 Linux 系统编程的"前前前传"。
- 学会了
ls -l看权限 → 后面学文件系统时能理解 inode 和权限位 - 学会了用户和权限 → 后面学进程时能理解实际用户 ID 和有效用户 ID
- 学会了重定向和管道 → 后面学进程通信时能理解无名管道
- 学会了 yum → 后面部署项目时能自己装环境和依赖
学习建议
- 多用,多练:光看博客是学不会 Linux 的。打开你的云服务器,每条命令都敲一遍。
- 不怕犯错:刚开始会经常打错命令、路径不对、权限不够——正常。犯错就是学习。
- 从 man 手册学习:
man 命令名是最好的文档,而且每个 Linux 系统都有。 - 从错误信息学习:报错信息通常已经告诉了你原因——仔细读。
- 先学会走路再跑:先把 ls、cd、pwd 用熟练,再学管道、重定向,再去折腾权限配置。
Linux 是 C/C++ 后台开发者的"基本功"——就像游泳运动员需要会换气、篮球运动员需要会运球一样。基础打好了,后面的学习才会顺畅。希望这篇笔记能帮你迈过 Linux 入门的第一个台阶。
pwd——知道你在哪;ls——知道周围有什么;cd——知道怎么过去。这三个命令搞明白了,Linux 的大门就推开了。
笔记整理自课堂学习、课程课件和 Linux 实践。如有错误或疏漏,欢迎指正。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)