【初识Linux】:追溯历史演进,上手基础指令
前言:从这一篇开始,我们正式进入Linux的学习,这一大板块可不比C++简单,小伙伴们一定要多想多动,坚持下去,Linux不管是在面试还是工作中都有非常重要的作用。本文可能前面的知识和后面的知识有关联,如果发现看不懂继续往后看就行!
目录
一、历史演进与开源哲学
1.从 UNIX 到 Linux
2.开源与发行版体系
3.操作系统定位
4.企业应⽤现状
二、环境配置
1.云服务器购买
2.Xshell安装
3.连接到云服务器
4.管理用户
三、基本指令
1. ls指令
对于文件的理解
2. pwd指令
3. cd指令
文件的路径
4. touch与mkdir
文件类型
stat指令
touch指令
mkdir指令
5. rm与rmdir
rmdir指令
rm指令
6. cp与mv
cp指令
mv指令
7. wc,cat与echo
wc指令
重定向操作
cat指令
echo指令
理解Liunx中一切皆文件!
8. more,less,head,tail
管道符 | 讲解
9. find,which,whereis,alias,grep
10. zip,unzip,tar
zip与unzip指令
Windows和Linux之间的互传
两台Linux之间的互传
tar指令
11. uname -r,bc,man,data,cal,shutdown
四、shell命令及运行原理
1. shell是什么
2. shell的作用
3. 与Windows对比
五、Linux权限(重点)
1. 权限的概念
(1)用户分类
(2)su与sudo指令
(3)权限的相关知识
(4)文件权限值的8进制表示法
2. 文件权限的相关指令
(1)chmod
(2)chown
(3)chgrp
3. 对文件权限的理解
(1)普通文件的权限
(2)目录的权限
4. 粘滞位
一、历史演进与开源哲学
1.从 UNIX 到 Linux
Linux 的诞生并非孤立事件,其根源可追溯至 20 世纪 60 年代的 Multics 项目与随后的 UNIX 系统。
- UNIX 的起源: 1969 年,贝尔实验室的 Ken Thompson 和 Dennis Ritchie 开发了 UNIX 系统,最初运行在小型机上,因其高效、多用户和多任务的特性而迅速在科研环境中普及 。
- 标准之争: 20 世纪 80 年代,UNIX 发展出两大主要分支:AT&T 的 System V 与加州大学伯克利分校的 BSD 版本。这一时期的分裂催生了对统一标准的强烈需求 。
- Linux 的诞生: 1991 年 10 月,赫尔辛基大学研究生 Linus Torvalds 受 Minix 系统启发,发布了 Linux 内核的雏形(0.02版)。该版本已能运行 Bash Shell 和 GCC 编译器 。
2.开源与发行版体系
Linux 的核心特征在于其遵循 GNU 通用公共许可协议 (GPL)。严格意义上,“Linux”仅指代操作系统内核,而完整的操作系统(Linux 发行版)则是内核与 GNU 工具集、GUI 组件的集合 。 基于内核的开源特性,衍生出了多种针对不同场景的发行版:
- Debian/Ubuntu: 以稳定性著称,广泛用于服务器与桌面环境,适合新手入门 。
- RHEL/CentOS: 面向企业级市场,提供商业支持或社区重构版本,是服务器领域的中间力量
- Kali Linux: 专为渗透测试与安全审计设计的发行版。
3.操作系统定位
操作系统 (OS) 的本质是作为硬件与用户之间的桥梁。它向下管理内存、进程、文件与驱动程序,向上为用户提供指令操作、开发与管理接口 。在 Linux 中,用户通常通过 Shell(命令行解释器)与内核进行交互,Shell 充当了“媒婆”的角色,将用户的指令翻译给内核处理 。

4.企业应⽤现状
- Linux在服务器领域的发展
- Linux在桌⾯领域的发展
- Linux在移动嵌⼊式领域的发展
- Linux在云计算/⼤数据领域的发展
我只是非常简单的介绍了一下它的历史,想要了解更多还需要大家自己搜索。
二、环境配置
1.云服务器购买
配置环境有三种方法:开两个系统,装虚拟机,买云服务器。前两种方法很麻烦,问题很多(我也不会),最推荐第三种,但就是得花点钱,价格在60~80每年。我个人买的是腾讯云的,只要是“轻量应用服务器”,“直接使用”,哪个便宜买哪个,阿里云,华为云都可以。
买好之后找到你的服务器(主页的右上角点击控制台),记好你的公网IP,然后重置你的密码(尽量复杂点,但你别忘了),一般初始用户名都是root。

2.Xshell安装
XShell是⼀个远程终端软件。我们下载它的免费版本用来连接服务器(下载网址点这里)。

3.连接到云服务器

如果你的Xshell不是最新版,需要输入指令“ssh root @IP”

4.管理用户
其实不管是Win还是Linux都是支持多用户同时登录和操作的,所以如果真的不想花钱的同学,可以找小伙伴们平摊一下,买一个就行。
Linux的操作都是“终端+指令”来进行的。下面是创建新用户(普通用户,它和root的区别后面会讲)的方法:
[root@VM-0-5-opencloudos ~]# adduser dytx
//创建用户dytx就是你的用户名
[root@VM-0-5-opencloudos ~]# passwd dytx
//设置密码
Changing password for user dytx.
New password:
//此处密码不回显
Retype new password:
//重新输入密码
passwd: all authentication tokens updated successfully.
[root@VM-0-5-opencloudos ~]# userdel -r dytx
//删除用户操作
可以用指令 ls /home 检查是否创建/删除成功(删除的时候一定要加-r)

三、基本指令
我们可以把 Linux 指令的基本结构拆解为三个部分:
指令 + [选项] + [参数]
- 指令 (Command) :告诉系统“要做什么”。
- 选项 (Options) :告诉系统“怎么做”。通常以一个或多个减号
-开头,用来微调指令的行为。 - 参数 (Arguments) :告诉系统“对谁做”。通常是文件路径、用户名或具体的字符串。
1. ls指令
对于文件的理解
在 Linux 的世界里,有一个核心哲学:“一切皆文件” (Everything is a file)。这意味着无论是文本文档、文件夹、还是硬件设备(如硬盘、网卡),系统都把它们当作文件来处理。
我们可以把 Linux 的文件系统想象成一棵巨大的倒挂的树,最顶端的根节点就是
/(根目录),这都会在后面详细理解。文件 = 内容 + 属性,即使是一个 0 字节的空文件,它依然会占用磁盘空间来存储它的“属性”(比如文件名、创建时间、所有者等)。所以你所说的文件夹(目录)也是一个文件。以后我们大多时间就是学文件,学习文件要么是对内容操作,要么是对属性操作,而指令就是执行这些操作的工具。
语法: ls [选项] [⽬录或⽂件]
功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。
常⽤选项:
| 参数 | 作用 |
-l | 详细列表模式:显示文件的权限、所有者、大小和修改时间。 |
-a | 显示所有文件:包括以 |
-d | 将目录像文件一样显示,而不是显示其下的文件。(目录本身就是文件) |
| -R | 递归列出所有子目录下的文件:即不仅显示当前目录,还要深入所有子目录进行显示。 |
[root@VM-0-5-opencloudos ~]# ls
lesson1
[root@VM-0-5-opencloudos ~]# ls -l
total 0
drwxr-xr-x 6 root root 71 Jan 22 22:08 lesson1
[root@VM-0-5-opencloudos ~]# cd lesson1
[root@VM-0-5-opencloudos lesson1]# ls
Linux_Base Networking path1 Security
[root@VM-0-5-opencloudos lesson1]# ls -la
total 0
drwxr-xr-x 6 root root 71 Jan 22 22:08 .
dr-xr-x--- 6 root root 221 Jan 22 22:01 ..
drwxr-xr-x 4 root root 32 Jan 22 22:01 Linux_Base
drwxr-xr-x 3 root root 20 Jan 22 22:01 Networking
drwxr-xr-x 3 root root 19 Jan 22 22:08 path1
drwxr-xr-x 3 root root 18 Jan 22 22:01 Security
[root@VM-0-5-opencloudos lesson1]# ls -d Networking
Networking
[root@VM-0-5-opencloudos lesson1]# ls -ld
drwxr-xr-x 6 root root 71 Jan 22 22:08 .
[root@VM-0-5-opencloudos lesson1]# ls -R path1
path1:
path2
path1/path2:
path3
path1/path2/path3:
path4
path1/path2/path3/path4:
注意点:
ls的参数只能是当前目录中的文件!
2. pwd指令
语法: pwd
功能:显示用户当前所在的目录
[root@VM-0-5-opencloudos path3]# pwd
/root/lesson1/path1/path2/path3
3. cd指令
文件的路径
在 Linux 的世界里,认识路径 (Path) 是你穿梭于这棵“多叉树”目录结构的唯一导航方式。Linux 的目录结构是一个树状结构,一切操作都始于根部,而他的叶子节点是文件或空目录,非叶子节点一定是非空目录
(1)根目录:一切的起点
/在 Linux 中,最顶层的目录叫 “根目录”,用一个斜杠
/表示。这和你之前看到的[root@... /]#中的那个/是一一对应的,它代表你当前正站在整棵树的最底端。(2)两种路径辨析
要找到树上的某一个果实(文件),有两种报地址的方式:
绝对路径 (Absolute Path)
定义:从根目录
/开始,一层一层往下找,直到目标文件。特点:具有唯一性,无论你当前在哪个位置,输入这个路径都能准确找到它。
例子:你之前创建的用户家目录
/home/yhz。相对路径 (Relative Path)
定义:相对于你当前所在位置开始寻找。
特点:更简便,但依赖于你当前“站”在哪里。
关键符号:
.代表当前目录;..代表上一级目录(父目录)。例子:如果你已经在
/home目录下了,那么进入yhz文件夹只需输入cd yhz,而不必写全称。(3)为什么“路径”属于文件属性?
文件 = 内容 + 属性。 路径其实就是文件的一种关键属性。它决定了该文件在系统磁盘上的物理存储位置。当你移动一个文件时,你本质上是在修改这个文件的“路径属性”。
(4)路径存在的意义
树状组织方式,都是为了保证快速定位查找到指定的文件,而定位文件就需要具有唯一性的方案来进行定位文件。其中任何一个节点,都只有一个父节点,所以,从根目录开始,定位指定文件,路径具有唯一性。绝对路径一般不会随着用户的路径变化而丧失唯一性,一般在特定服务的配置文件中经常被使用。相对路径因为它的便捷性,一般在命令行中使用较多。

语法: cd 目录名
功能:改变工作目录。将当前工作目录改变到指定的目录下
知识要点:
(1) tree命令可以以树状解构展示当前目录的所有文件

(2) . 代表当前目录;.. 代表上一级目录。任何一个目录都有它俩,但他俩是隐藏文件,需要-a
[root@VM-0-5-opencloudos lesson1]# cd ./path1/path2/path3
[root@VM-0-5-opencloudos path3]# ls
path4
[root@VM-0-5-opencloudos path3]# cd ..
[root@VM-0-5-opencloudos path2]# ls
path3
[root@VM-0-5-opencloudos path2]# cd ..
[root@VM-0-5-opencloudos path1]# cd ..
[root@VM-0-5-opencloudos lesson1]# ls
Linux_Base Networking path1 Security
(3) ~代表家目录;cd - 的功能是返回上一次所在的目录;* 代表任意长度的任意字符(包括零个字符),即通配符
[root@VM-0-5-opencloudos lesson1]# cd root
-bash: cd: root: No such file or directory
[root@VM-0-5-opencloudos lesson1]# cd ~
[root@VM-0-5-opencloudos ~]# ls
lesson1
[root@VM-0-5-opencloudos ~]# cd lesson1/path1/path2
[root@VM-0-5-opencloudos path2]# cd -
/root
[root@VM-0-5-opencloudos ~]# pwd
/root
[root@VM-0-5-opencloudos ~]# cd lesson1/path*
[root@VM-0-5-opencloudos path1]# pwd
/root/lesson1/path1
[root@VM-0-5-opencloudos path1]# cd -
/root
[root@VM-0-5-opencloudos ~]# cd l*
-bash: cd: too many arguments
[root@VM-0-5-opencloudos ~]# cd lesson1
[root@VM-0-5-opencloudos lesson1]# cd S*
[root@VM-0-5-opencloudos Security]#
4. touch与mkdir
文件类型
在 Linux 属性中,文件类型不是由后缀名决定的(但不代表写后缀没用),而是存储在 Inode 的 Mode(模式) 字段中。通过
ls -l查看,第一位字符就是这个字段的直观体现:
标识符 文件类型 (File Type) 深度理解 -普通文件 (Regular) 存储在磁盘 Data Block 里的二进制流或文本内容。 d目录文件 (Directory) 存储文件名映射关系的特殊文件。 l链接文件 (Link) 类似于指针,内容是另一个文件的路径字符串。 b/c设备文件 (Device) 并不占实际磁盘空间,而是作为访问内核驱动程序的“门牌号”。 s/p套接字/管道 用于进程间通信的临时内存对象。 ![]()
stat指令
它是能把文件属性显示的更全的一个指令
[root@VM-0-5-opencloudos lesson1]# stat test2.c
File: test2.c
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 253,1 Inode: 109052039 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-01-23 20:37:33.577296843 +0800
Modify: 2026-01-23 20:37:33.577296843 +0800
Change: 2026-01-23 20:37:33.577296843 +0800
Birth: 2026-01-23 20:37:33.577296843 +0800
-
Access Time (atime):最后一次读取文件的时间。
-
Modify Time (mtime):最后一次修改文件内容的时间。(mtime变了ctime一定变)
-
Change Time (ctime):最后一次修改文件属性(如权限、所有者等)的时间。
touch指令
语法: touch [选项]... 文件...
功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。
常用选项:
| 指令格式 | 功能 | 理解 |
|---|---|---|
touch file | 如果文件不存在则创建;如果存在,则同时刷新 atime和mtime。 | 属性的全量更新 |
touch -a file | Access Time:仅修改访问时间。常用于伪装“文件被读取过”。 | 精确控制 atime |
touch -m file | Modification Time:仅修改内容修改时间。这会改变 ls -l 显示的时间。 | 精确控制 mtime |
touch -c file | No Create:如果文件不存在,不要创建它。 | 安全操作逻辑 |
touch -r ref_file file | Reference:把 file 的时间戳同步得和 ref_file 一模一样。 | 属性的“克隆” |
touch -t [[CC]YY]MMDDhhmm[.ss] file | 手动指定一个过去或未来的时间(如 202501010000)。 | 时间旅行 (伪造属性) |
[root@VM-0-5-opencloudos lesson2]# ls
111
[root@VM-0-5-opencloudos lesson2]# touch ./test1.txt
[root@VM-0-5-opencloudos lesson2]# touch test2.txt
[root@VM-0-5-opencloudos lesson2]# ls
111 test1.txt test2.txt
[root@VM-0-5-opencloudos lesson2]# stat test1.txt
File: test1.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 253,1 Inode: 67110850 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-01-24 15:39:14.278737789 +0800
Modify: 2026-01-24 15:39:14.278737789 +0800
Change: 2026-01-24 15:39:14.278737789 +0800
Birth: 2026-01-24 15:39:14.278737789 +0800
[root@VM-0-5-opencloudos lesson2]# cat test1.txt
[root@VM-0-5-opencloudos lesson2]# stat test1.txt
File: test1.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 253,1 Inode: 67110850 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-01-24 15:40:57.016807890 +0800
Modify: 2026-01-24 15:39:14.278737789 +0800
Change: 2026-01-24 15:39:14.278737789 +0800
Birth: 2026-01-24 15:39:14.278737789 +0800
(访问)
[root@VM-0-5-opencloudos lesson2]# chmod 444 test1.txt
[root@VM-0-5-opencloudos lesson2]# stat test1.txt
File: test1.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 253,1 Inode: 67110850 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-01-24 15:40:57.016807890 +0800
Modify: 2026-01-24 15:39:14.278737789 +0800
Change: 2026-01-24 15:42:14.689860884 +0800
Birth: 2026-01-24 15:39:14.278737789 +0800
(只修改权限)
[root@VM-0-5-opencloudos lesson2]# echo "hello Linux" > test1.txt
[root@VM-0-5-opencloudos lesson2]# stat test1.txt
File: test1.txt
Size: 12 Blocks: 8 IO Block: 4096 regular file
Device: 253,1 Inode: 67110850 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-01-24 15:42:51.717886152 +0800
Modify: 2026-01-24 15:42:49.959884952 +0800
Change: 2026-01-24 15:42:49.959884952 +0800
Birth: 2026-01-24 15:39:14.278737789 +0800
(修改内容)
mkdir指令
语法: mkdir [选项] dirname...
功能:在当前目录下创建一个名为 “dirname”的目录
常用选项:
-p 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录
[root@VM-0-5-opencloudos ~]# mkdir lesson2
[root@VM-0-5-opencloudos ~]# ls
lesson1 lesson2 test1.txt test2.c
[root@VM-0-5-opencloudos ~]# mkdir -p lesson2/111/222/333/444
[root@VM-0-5-opencloudos ~]# tree lesson2
lesson2
└── 111
└── 222
└── 333
└── 444
4 directories, 0 files
[root@VM-0-5-opencloudos lesson2]# mkdir 111
mkdir: cannot create directory ‘111’: File exists
5. rm与rmdir
rmdir指令
语法: rmdir [选项] dirName
功能:专门用来删除空目录。
常用选项:-p,递归删除父目录。如果子目录被删除后父目录也变为空,则一并删除。(如果遇到不是空的,提示并停止删除)。
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
│ └── 2
│ └── 3
│ ├── 3.1.txt
│ └── 4
│ └── 5
├── test1.txt
└── test2.txt
5 directories, 3 files
[root@VM-0-5-opencloudos lesson2]# cd 1/2/3/4
[root@VM-0-5-opencloudos 4]# rmdir 5
[root@VM-0-5-opencloudos 4]# tree
.
[root@VM-0-5-opencloudos lesson2]# rmdir -p 1/2/3/4
rmdir: failed to remove directory '1/2/3': Directory not empty
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
│ └── 2
│ └── 3
│ └── 3.1.txt
├── test1.txt
└── test2.txt
3 directories, 3 files
[root@VM-0-5-opencloudos lesson2]# rm 1/2/3/3.1.txt
[root@VM-0-5-opencloudos lesson2]# rmdir -p 1/2/3
[root@VM-0-5-opencloudos lesson2]# tree
.
├── test1.txt
└── test2.txt
0 directories, 2 files
rm指令
语法: rm [选项] dirName/dir
功能:删除文件或目录。
常用选项:
| 选项 | 含义 | 深度应用场景 |
-f (force) | 强制删除 | 忽略不存在的文件,且不提示确认。它会绕过某些保护机制。 |
-i (interactive) | 交互模式 | 在删除前询问你。适合初学者防止误删重要属性。 |
-r (recursive) | 递归删除 | 用于删除目录。它会进入多叉树的每一层,先删文件,再删子目录。 |
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
│ └── 2
│ └── 3
│ ├── 3.1.txt
│ └── 4
│ ├── 4.1.txt
│ ├── 4.2.txt
│ └── 5
├── test1.txt
└── test2.txt
5 directories, 5 files
[root@VM-0-5-opencloudos lesson2]# echo "hello Linux" > ./1/2/3/4/4.1.txt
[root@VM-0-5-opencloudos lesson2]# rm ./1/2/3/4/4.1.txt
[root@VM-0-5-opencloudos lesson2]# rm ./1/2/3/4/5
rm: cannot remove './1/2/3/4/5': Is a directory
[root@VM-0-5-opencloudos lesson2]# rm -r ./1/2/3/4/5
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
│ └── 2
│ └── 3
│ ├── 3.1.txt
│ └── 4
│ └── 4.2.txt
├── test1.txt
└── test2.txt
4 directories, 4 files
[root@VM-0-5-opencloudos lesson2]# rm -r -i ./1/2/3/4/4.2.txt
rm: remove regular empty file './1/2/3/4/4.2.txt'? y
[root@VM-0-5-opencloudos lesson2]# cd ./1/2/3/4
[root@VM-0-5-opencloudos 4]# tree
.
0 directories, 0 files
[root@VM-0-5-opencloudos lesson2]# rm -ri ./1/2/3/4
rm: remove directory './1/2/3/4'? y
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
│ └── 2
│ └── 3
│ └── 3.1.txt
├── test1.txt
└── test2.txt
3 directories, 3 files
[root@VM-0-5-opencloudos lesson2]# rm ./1/2/3/3.1.txt
[root@VM-0-5-opencloudos lesson2]# rm -ri ./1/2/3
rm: remove directory './1/2/3'? y
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
│ └── 2
├── test1.txt
└── test2.txt
2 directories, 2 files
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
│ └── 2
│ └── 3
│ └── 4
│ └── 4.1.txt
├── 4.1.txt
├── test1.txt
└── test2.txt
4 directories, 4 files
[root@VM-0-5-opencloudos lesson2]# rm -ri ./1/2
rm: descend into directory './1/2'? y
rm: descend into directory './1/2/3'? y
rm: descend into directory './1/2/3/4'? y
rm: remove regular empty file './1/2/3/4/4.1.txt'? y
rm: remove directory './1/2/3/4'? y
rm: remove directory './1/2/3'? y
rm: remove directory './1/2'? y
[root@VM-0-5-opencloudos lesson2]# mkdir -p 1/2/3/4
[root@VM-0-5-opencloudos lesson2]# touch 1/2/3/4/4.1.txt
[root@VM-0-5-opencloudos lesson2]# rm -r ./1/2
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
├── 4.1.txt
├── test1.txt
└── test2.txt
1 directory, 3 files
[root@VM-0-5-opencloudos lesson2]# mkdir -p 1/2/3/4
[root@VM-0-5-opencloudos lesson2]# touch 1/2/3/4/4.1.txt
[root@VM-0-5-opencloudos lesson2]# rm -f ./1/2
rm: cannot remove './1/2': Is a directory
[root@VM-0-5-opencloudos lesson2]# rm -rf ./1/2
[root@VM-0-5-opencloudos lesson2]# tree
.
├── 1
├── 4.1.txt
├── test1.txt
└── test2.txt
1 directory, 3 files
6. cp与mv
cp指令
语法: cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录
如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中
常用选项:
- -f :强行复制文件或目录, 不论目的文件或目录是否已经存在
- -i :覆盖文件之前先询问用户
- -r: 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
- -p:连同文件的属性(权限、用户、时间)一起复制,而非使用默认权限。
#cp普通文件
[whb@bite-alicloud test]$ echo "你好">myfile.txt
[whb@bite-alicloud test]$ cat myfile.txt
你好
[whb@bite-alicloud test]$ ll
total 4
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ cp myfile.txt myfile-backup.txt
[whb@bite-alicloud test]$ ll
total 8
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ cat myfile-backup.txt
你好
#将多个文件拷贝到指定路径下
[whb@bite-alicloud test]$ ll
total 8
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ mkdir dir
[whb@bite-alicloud test]$ ll
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 15:48 dir
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ cp *.txt dir # *表示通配符,匹配所有.txt结尾的文件名
[whb@bite-alicloud test]$ ll
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 15:48 dir
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ tree dir
dir
├── myfile-backup.txt
└── myfile.txt
#cp如果目标文件存在,就覆盖
[whb@bite-alicloud test]$ echo "hello bite tech" > myfile.txt
[whb@bite-alicloud test]$ cat myfile.txt
hello bite tech
[whb@bite-alicloud test]$ cp myfile.txt myfile-backup.txt
[whb@bite-alicloud test]$ cat myfile-backup.txt
hello bite tech
#拷贝前询问
[whb@bite-alicloud test]$ cp -i myfile.txt myfile-backup.txt
cp: overwrite 'myfile-backup.txt'? y
#递归强制拷贝整个目录
[whb@bite-alicloud ~]$ tree test
test
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files
[whb@bite-alicloud ~]$ cp -rf test test-backup
[whb@bite-alicloud ~]$ tree test-backup
test-backup
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files
mv指令
语法: mv [选项] 源文件或目录 目标文件或目录
功能:根据mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。
- 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
- 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。
常用选项:
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
#更改名称
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 myfile.txt
[whb@bite-alicloud test]$ mv myfile.txt yourfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 yourfile.txt
#如果当前路径存在同名文件,改名即覆盖
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:58 myfile.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:57 yourfile.txt
[whb@bite-alicloud test]$ mv yourfile.txt myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:57 myfile.txt
#如果当前路径存在同名文件,改名前可以添加i选项,让系统提出警告供用户做选择
[whb@bite-alicloud test]$ touch yourfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:57 myfile.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:59 yourfile.txt
[whb@bite-alicloud test]$ mv -i yourfile.txt myfile.txt
mv: overwrite 'myfile.txt'? y
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:59 myfile.txt
#mv整个目录
[yhz@VM-0-5-opencloudos ~]$ mkdir temp
[yhz@VM-0-5-opencloudos ~]$ cd temp
[yhz@VM-0-5-opencloudos temp]$ touch file
[yhz@VM-0-5-opencloudos temp]$ cd ..
[yhz@VM-0-5-opencloudos ~]$ mkdir temp2
[yhz@VM-0-5-opencloudos ~]$ cd temp2
[yhz@VM-0-5-opencloudos temp2]$ touch file2
[yhz@VM-0-5-opencloudos temp2]$ cd ..
[yhz@VM-0-5-opencloudos ~]$ mv temp2 temp2
mv: cannot move 'temp2' to a subdirectory of itself, 'temp2/temp2'
[yhz@VM-0-5-opencloudos ~]$ mv temp temp1
[yhz@VM-0-5-opencloudos ~]$ tree
.
└── temp1
├── file2
└── temp
└── file
7. wc,cat与echo
wc指令
wc 是 Word Count(字数统计)的缩写。它是一个非常实用的工具,专门用来统计文件中的行数、单词数和字节数。当我们直接运行 wc 文件名 时,它会按顺序输出三个数字:行数 、单词数、字节数。当我们不需要全部信息,只想看其中一项,这时可以用以下参数:-l:只统计行数 (lines)。这是最常用的功能,比如数数日志有多少行。-w:只统计单词数 (words)。-c:只统计字节数 (bytes)。
[yhz@VM-0-5-opencloudos lesson4]$ wc my.txt
57 111 721 my.txt
[yhz@VM-0-5-opencloudos lesson4]$ wc -l my.txt
57 my.txt
重定向操作
在 Linux 中,重定向(Redirection)是指改变数据传输的方向。默认情况下,命令从键盘读取输入,并把结果输出到屏幕;而重定向可以让命令从文件读取内容,或将结果保存到文件中。我们可以把数据流想象成水管,重定向符号就是改变水流走向的“接头”。
(1)>:输出覆盖重定向如果文件已存在,会清空原内容再写入;如果不存在,则创建新文件。
例子:把当前目录的文件列表保存到
list.txt。输入:
ls > list.txt输出:屏幕没反应,但生成了
list.txt,里面存着文件名。
(2)>>:输出追加重定向在原有内容的末尾继续写,不会破坏旧数据。
例子:把今天的日期追加到日志末尾。
输入:
date >> log.txt输出:
log.txt原有内容不变,最后一行多了当前时间。
(3)<:输入重定向让命令不再从键盘读,而是从文件里读数据。
例子:用
wc统计test.txt有多少行。输入:
wc -l < test.txt输出:显示行数(这种方式不会打印文件名,只输出数字)。
方式 命令写法 底层逻辑 输出细微差别 传参数 wc -l test.txtwc命令主动打开了文件test.txt。10 test.txt(显示文件名)重定向 wc -l < test.txtShell 先打开文件,通过标准输入喂给 wc。10(不显示文件名)
cat指令
cat 的全称是 Concatenate(连接)。它的本职工作是把文件内容连接起来并输出。
-
基础读取:直接查看文件内容。
-
输入:
cat test.txt -
输出:在屏幕上显示
test.txt的全部内容。
-
-
合并文件:把两个文件的内容合在一起看。
-
输入:
cat a.txt b.txt -
输出:先显示
a.txt的内容,紧接着显示b.txt的内容。
-
- 创建/重定向:
-
输入:
cat a.txt < b.txt -
输出:如果
b.txt已经存在:它的原有内容会被彻底清空,然后换成a.txt的内容。如果b.txt不存在:系统会自动创建一个名为b.txt的新文件,并将a.txt的内容写入其中。 -
输入:
cat a.txt << b.txt -
输出:如果
b.txt已经存在:它原有的内容会被完整保留,a.txt的内容会直接拼接在原内容的最后一行之后。如果b.txt不存在:系统会新建一个b.txt,此时效果等同于>(即内容与a.txt相同)。
-
echo指令
echo 的功能非常纯粹:把你输入的内容原样“回响”出来。
-
屏幕显示:在屏幕上打印一段话。
-
输入:
echo "hello linux" -
输出:
hello linux
-
-
写入文件:这是它最常用的场景,配合重定向快速创建或修改文件内容。
-
输入:
echo "new content" > test.txt -
效果:
test.txt里的旧内容被删掉,变成了new content。
-
[yhz@VM-0-5-opencloudos lesson4]$ echo fff
fff
[yhz@VM-0-5-opencloudos lesson4]$ echo "" > fff
[yhz@VM-0-5-opencloudos lesson4]$ ls
apart fff my.txt temp.txt
[yhz@VM-0-5-opencloudos lesson4]$ echo "Hello" > fff
[yhz@VM-0-5-opencloudos lesson4]$ cat fff
Hello
[yhz@VM-0-5-opencloudos lesson4]$ echo "Linux" >> fff
[yhz@VM-0-5-opencloudos lesson4]$ cat fff
Hello
Linux
# echo 命令在输出你指定的字符串后,默认会自动在末尾加上一个换行符。
[yhz@VM-0-5-opencloudos lesson4]$ echo "del" > fff
[yhz@VM-0-5-opencloudos lesson4]$ cat fff
del
理解Liunx中一切皆文件!
“一切皆文件”是 Linux 对系统资源的高度抽象,通过文件接口屏蔽底层差异,提供了简洁、一致的操作方式。这种设计降低了系统复杂性,使得工具、脚本和应用程序能够以统一模式处理多样化资源,是 Linux 强大灵活性的重要基石。简单来说,在Linux操作系统中,所有的资源(包括普通文件(文本、二进制文件等)、目录、设备(如磁盘、键盘)、进程信息、网络套接字、管道等)都被抽象为了文件。在用户层面上,我们可以通过对对应的文件进行操作,进而完成对这些资源的操作。这样做最明显的好处是,开发者仅需要使用一套 API 和开发工具,即可调取 Linux 系统中绝大部分的资源。举个简单的例子,Linux 中几乎所有读(读文件,读系统状态,读PIPE)的操作都可以用read 函数来进行;几乎所有更改(更改文件,更改系统参数,写 PIPE)的操作都可以用 write 函数来进行。
当启动一个 Shell(比如 Bash)时,Shell 进程本身会默认打开这三个标准流,即标准输入流,标准输出流和标准错误流。而后续在这个 Shell 中启动的子进程,也会继承这三个已打开的流。这三个流其实也是文件,对应文件描述符为0,1和2。
- 标准输入(stdin, fd=0) → 默认绑定到键盘
- 标准输出(stdout, fd=1) → 默认绑定到显示器
- 标准错误(stderr, fd=2) → 默认绑定到显示器
比如,当你输入
echo "Hello"时,echo把字符串发给了 fd 1。因为当前 Shell 的 fd 1 默认指向显示器,所以你在屏幕上看到了字。当你输入echo "Hello" > a.txt时,你告诉 Shell,“把这次运行的 fd 1 临时接到a.txt这个文件上”。echo还是照常往 fd 1 说话,但因为“接线”变了,声音没传到屏幕,而是传进了文件。其实我们学的这些个指令也只不过是一个可执行的文件罢了。
8. more,less,head,tail
管道符
|讲解管道符
|是 Linux 中实现多命令协作的核心机制,其作用是将前一个命令的标准输出(Output)直接传递给后一个命令作为标准输入(Input)。这种“数据流”的设计允许用户将多个简单工具组合成复杂的处理链。例如,通过ls /usr/bin | grep "zip"可以从大量文件中过滤出特定项;通过cat log.txt | grep -i "error" | wc -l则可以实现对特定关键词的提取与计数。管道符遵循 Linux “每个工具只做好一件事”的哲学,通过灵活的组合极大地提升了命令行下的数据处理效率。
当你面对成千上万行的文件(如系统日志)时,cat 会让屏幕疯狂滚动。这时我们需要分页查看工具:
-
more:最基础的分页查看器。它允许你一页一页地向下阅读,按 空格键 翻页,但它不能向上翻页,且翻到文件末尾会自动退出。-n指定输出行数, q退出more。 -
less:功能更强大的分页工具。它支持向上和向下翻页(使用方向键),并且不会一次性加载整个文件,阅读超大文件时速度极快。(按下回车键后,跟着输入选项即可)选项/按键 功能描述 -i忽略搜索时的大小写 -N显示每行的行号 /字符串向下搜索“字符串”的功能 ?字符串向上搜索“字符串”的功能 n重复前一个搜索(与 /或?有关)N反向重复前一个搜索(与 /或?有关)q退出(quit) -
head:默认显示文件开头的 10 行 内容。你可以使用-n参数指定行数,例如head -n 5 file.txt只看前 5 行。 -
tail:默认显示文件末尾的 10 行 内容。它有一个非常有用的参数-f,可以实时监控文件末尾的新增内容,常用于观察正在运行的程序日志。-n指定输出行数。
如何显示文件的[180,200]行的内容?
[yhz@VM-0-5-opencloudos ~]head -200 temp.txt | tail -20
9. find,which,whereis,alias,grep
(1)find:它是最强大的文件搜索工具,可以根据文件名、大小、时间等各种属性来找文件。(这个很有用选项自己用的时候查)
-
例子:想在当前目录及其子目录下,查找所有名字叫
test.txt的文件。 -
输入:
find . -name "test.txt" -
输出:列出所有匹配的文件路径,如
./lesson4/test.txt。
(2)which:当你输入一个命令(如 ls 或 nano)时,系统其实是在后台运行一个文件。which 告诉你在哪个文件夹里。
-
例子:看看你刚刚装的
nano到底安装在系统哪个位置了。 -
输入:
which nano -
输出:
/usr/bin/nano(这是它的绝对路径)。
(3)whereis:它比 which 找得更全,不仅找运行程序,还找它的源代码和帮助文档。
-
例子:查找
bash相关的所有二进制文件和说明书。 -
输入:
whereis bash -
输出:
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz。
(4)alias:如果你觉得某个命令太长难记,可以用 alias 给它起个短名字(别名)。
-
例子:给“查看详细列表并按时间排序”这个长命令起个外号叫
lt。 -
输入:
alias lt='ls -ltr' -
效果:以后你直接输入
lt就等同于输入了ls -ltr。
(5)grep 是 Linux 系统中极其强大的文本搜索工具
最简单的用法是在文件中查找一个关键词。
-
指令:
grep "error" messages -
输出:屏幕会打印出
messages文件中所有包含error这个词的行。
| 选项 | 功能描述 | 举例 |
-i | 忽略大小写:不再区分 Error 或 error | grep -i "error" log |
-n | 显示行号:告诉你匹配的内容在文件的第几行 | grep -n "fail" log |
-v | 反向选择:显示所有不包含该关键词的行 | grep -v "info" log |
-c | 统计次数:不打印内容,只告诉你一共找到了多少行 | grep -c "warning" log |
-r | 递归搜索:在当前文件夹及其所有子文件夹中搜索 | grep -r "root" /etc/ |
[whb@bite-alicloud test]$ cat temp.txt
abcd
ABCD
hello
bite
1234
[whb@bite-alicloud test]$ grep -ni "abcd" temp.txt
1:abcd
2:ABCD
[whb@bite-alicloud test]$ grep -vn "abcd" temp.txt
2:ABCD
3:hello
4:bite
5:1234
[whb@bite-alicloud test]$ grep -vni "abcd" temp.txt
3:hello
4:bite
5:1234
10. zip,unzip,tar
zip与unzip指令

Windows和Linux之间的互传
(1)上传文件:rz
-
动作:在终端输入
rz并回车。 -
现象:你的电脑会自动弹出一个文件选择框。
-
结果:选好文件点确定,文件就会通过当前的终端窗口直接传到服务器的当前目录下。
(2)下载文件:sz
-
动作:输入
sz后面跟着你要下载的文件名,例如sz test.txt。 -
现象:你的电脑弹出一个文件夹选择框,问你存哪。
-
结果:选好位置后,文件就会从服务器传回你的本地硬盘。


两台Linux之间的互传
(1)场景 A:把本地文件传给远程服务器(推)
-
指令格式:
scp [本地文件路径] [用户名]@[远程IP]:[远程目录] (传输整个文件夹加-r) -
例子:把当前目录下的
test.txt传到 192.168.1.10 的/home/yhz/目录下。 -
输入:
scp test.txt root@192.168.x.xx:/home/yhz/ -
现象:回车后会提示输入远程服务器的密码,输入正确后开始传输。
(2)场景 B:从远程服务器拿文件到本地(拉)
-
指令格式:
scp [用户名]@[远程IP]:[远程文件路径] [本地目录](传输整个文件夹加-r) -
例子:把远程服务器上的
config.conf抓取到当前目录。 -
输入:
scp root@192.168.x.xx:/etc/config.conf .
tar指令
这也是一个可以把文件解压或压缩的命令.
(1)打包压缩:tar czf 。当你需要把一堆文件变成一个压缩包时使用。
-
命令格式:
tar czf [压缩包名.tar.gz] [要打包的文件/目录] -
选项拆解:
-
c(create):建立一个新的压缩档案。 -
z(gzip):通过 gzip 属性进行压缩,这样文件体积会更小。 -
f(file):指定文件名。注意:f必须写在选项的最后,后面紧跟文件名。 -
v(verbose):可选,显示打包的过程(就像进度条,让你看到正在打哪个文件)。
-
-
例子:将
lesson4目录打包。(不用加-r,可以直接压缩) -
输入:
tar czvf lesson4.tar.gz lesson4/
(2)解压释放:tar xzf 。当你拿到一个压缩包并想把里面的东西拿出来时使用。
-
命令格式:
tar xzf [压缩包名.tar.gz] -
选项拆解:
-
x(extract):解压缩/提取内容。 -
z和f:含义同上,分别代表 gzip 解压和指定目标文件。
-
-
例子:解压刚才的包。
-
输入:
tar xzvf lesson4.tar.gz
(3)指定路径:-C。默认情况下,tar 会把东西解压到当前目录。如果你想把它解压到特定的地方,就用 -C。
-
例子:把
test.tar.gz解压到/tmp文件夹下。 -
输入:
tar xzf test.tar.gz -C /tmp(前面那个选项不用-,但有时加-也可以通过) -
逻辑:
-C相当于告诉tar:“先切换(Change)到这个目录,然后再干活”。
11. uname -r,bc,man,data,cal,shutdown
(1)uname 用于显示系统信息,而 -r (release) 参数专门用来查看操作系统内核的发行版本。
[yhz@VM-0-5-opencloudos root]$ uname -r
6.6.117-45.oc9.x86_64
(2)bc (Binary Calculator) 是一个支持任意精度的计算语言。
-
用法: 直接输入
bc进入交互模式,然后输入1+2并回车即可得到结果。输入quit退出。 -
进阶: 如果你想计算小数,需要设置精度。例如输入
scale=2; 10/3,它会保留两位小数输出3.33。
[yhz@VM-0-5-opencloudos root]$ bc
1684*89
149876
11.9/3
3
scale=2; 10/3
3.33
quit
(3)man是 Linux 中最重要的学习工具。当你不知道一个指令怎么用时,找它就对了。
用法: man cp 会显示 cp 指令的所有用法、参数和详细解释。
操作: 进入手册后,按 q 退出,按空格下翻页。
常用选项:
- -k 根据关键字搜索联机帮助
- num 只在第num章节查找
- -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用a选项,当按下q退出,他会继续往后面搜索,直到所有章节都搜索完毕。

(4) date 显示或设置系统的日期和时间。
# 显示常规时间
[whb@bite-alicloud test]$ date
Wed Jan 11 18:22:50 CST 2023
[whb@bite-alicloud test]$ date +%Y/%m/%d
2023/01/11
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S
2023/01/11-18:23:20
# 显示时间戳
[whb@bite-alicloud test]$ date +%s
1673432636
# 时间戳转成可视时间
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @0
1970/01/01-08:00:00
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @100000
1970/01/02-11:46:40
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @1000000000
2001/09/09-09:46:40
(5)
[yhz@VM-0-5-opencloudos root]$ cal
January 2026
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
[yhz@VM-0-5-opencloudos root]$ cal 2001
2001
......(各个月的日历)
(6)shutdown安全关机
在 Linux 中关机需要谨慎,通常需要管理员权限。
-
立即关机:
sudo shutdown -h now。 -
定时关机:
sudo shutdown -h +10(10 分钟后关机)。 -
重启:
sudo shutdown -r now或直接用reboot。
四、shell命令及运行原理
1. shell是什么
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:将使用者的命令翻译给核心(kernel)处理。同时,将核心的处理结果翻译给使用者。
2. shell的作用
如果把 Linux 比作一家复杂的工厂,那么 Kernel(内核) 就是封闭的车间操作台,而 Shell 就是工厂的接待大厅和调度中心。
(1)它作为 命令行解释器,把我们熟悉的单词(如 ls, cd, rm)翻译成内核能执行的复杂操作。它把枯燥的磁盘扇区抽象成了你笔记中的“文件和多叉树结构”。
(2)内核拥有最高权限,直接控制内存和 CPU。如果让用户直接操作内核,任何一个低级错误(如删掉关键内存数据)都会导致系统瞬间崩溃。Shell可以进行权限检查和合法性校验,如果你输入了胡言乱语或极其危险的非法指令,Shell 会直接拦截并报错,不让这些错误干扰到内核的运行。
(3)即便子进程运行的程序(如一个写坏了的 C 程序)挂掉了,受损的也只是“临时工”子进程,主 Shell 依然能稳定运行,继续响应你的下一个指令。
3. 与Windows对比
| 特性 | Windows GUI | Linux Shell |
|---|---|---|
| 表现形式 | 图标、窗口、鼠标点击 | 字符串、指令、回车 |
| 底层映射 | 双击 D 盘 -> 调用文件系统接口 | cd / -> 调用 chdir 系统调用 |
| 容错处理 | 弹出“确定删除吗?”窗口 | rm -i 提示,或权限不足直接报错 |
| 效率核心 | 直观、易上手 | 极其适合批量化、自动化脚本处理 |
五、Linux权限(重点)
1. 权限的概念
(1)用户分类
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户(root):可以再linux系统下做任何事情,不受限制
- 普通用户(我们在前面adduser创建的新用户):在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
(2)su与sudo指令
命令:su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码。
[yhz@VM-0-5-opencloudos /]$ whoami
yhz
[yhz@VM-0-5-opencloudos /]$ su
Password:
[root@VM-0-5-opencloudos /]# whoami
root
[root@VM-0-5-opencloudos /]# su yhz
[yhz@VM-0-5-opencloudos /]$ whoami
yhz
命令:sudo
功能:短暂提权,sudo 通常会“记住”你 5 到 15 分钟,这段时间内再用 sudo 不需要重复输入密码。
[yhz@VM-0-5-opencloudos /]$ sudo ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var www
[yhz@VM-0-5-opencloudos /]$ sudo whoami
root
这个操作是需要设置的,以后会讲,所以其实这个就像白名单一样,不是所有人说用就用。
(3)权限的相关知识
权限的本质是 约束人的行为。在 Linux 中,一个动作能否成功,取决于三个要素的匹配:
-
人(Who):你是谁?
-
Owner (u):文件所有者(通常是创建者)。
-
Group (g):所属组(一群有共同权限的人)。
-
Others (o):除了上面两类之外的所有人。
-
-
事(How):你想干什么?
-
r (Read):读。对于文件是看内容,对于目录是看列表。
-
w (Write):写。对于文件是改内容,对于目录是增删文件。
-
x (Execute):执行。对于文件是运行程序,对于目录是“进入”。
-
-
物(What):你操作的对象是否存在对应的权限位。

x权限不是有了就能运行,首先要该文件能够可执行,它都无法执行,何谈权限?
(4)文件权限值的8进制表示法
除了用 r w x 表示,还可以用8进制数字表示,改为有就是1,-就是0,比如:rwxr-xr-x就是755,rw-r--r--就是644
umask
我们如果新建一个文件或者文件夹,它的初始文件是由umask决定的。普通文件的理想权限是
666(rw-rw-rw-),默认不给执行权限(x),为了安全。目录文件的理想权限是777(rwxrwxrwx),因为目录必须有x才能进入。但如果真的所有文件一生成就是666,那意味着任何用户都能改你的文件,这太不安全了。于是umask出现了,它负责扣除一部分权限。计算方法:最终权限 = 理想权限 & (~umask)
举个例子(假设你的
umask是0022):
对于目录:
理想
777($rwxrwxrwx$)
umask 022($----w--w-$)结果:
755($rwxr-xr-x$)。你会发现,组用户和其他人的w权限被扣掉了。对于文件:
理想
666($rw-rw-rw-$)
umask 022($----w--w-$)结果:
644($rw-r--r--$)。[yhz@VM-0-5-opencloudos lesson3]$ umask 0022 [yhz@VM-0-5-opencloudos lesson3]$ mkdir 1 [yhz@VM-0-5-opencloudos lesson3]$ ll -d 1 drwxr-xr-x 2 yhz yhz 6 Jan 27 21:54 1 [yhz@VM-0-5-opencloudos lesson3]$ umask 0002 #临时修改umask值 [yhz@VM-0-5-opencloudos lesson3]$ mkdir 2 [yhz@VM-0-5-opencloudos lesson3]$ ll -d 2 drwxrwxr-x 2 yhz yhz 6 Jan 27 21:54 2
2. 文件权限的相关指令
(1)chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项: R -> 递归修改目录文件的权限
chmod命令权限值的格式:
- 用户表示符+/-=权限字符
+: 向权限范围增加权限代号所表示的权限
-: 向权限范围取消权限代号所表示的权限
=: 向权限范围赋予权限代号所表示的权限
- 用户符号:
u:拥有者;g:拥有者同组用;o:其它用户;a:所有用户
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rw-r--r-- 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ chmod 555 666.c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-r-xr-xr-x 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ chmod a+w 666.c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rwxrwxrwx 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ chmod o-w 666.c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rwxrwxr-x 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ chmod u-wx 666.c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-r--rwxr-x 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ chmod 707 666.c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rwx---rwx 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ chmod g+wx 666.c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rwx-wxrwx 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
说明:只有文件的拥有者和root才可以改变文件的权限
(2)chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
常用选项:-R 递归修改文件或目录的拥有者
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rwx-wxrwx 1 yhz yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ sudo chown root 666.c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rwx-wxrwx 1 root yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 yhz yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ cd -
/home/yhz/lesson3
[yhz@VM-0-5-opencloudos lesson3]$ sudo chown -R root a
[yhz@VM-0-5-opencloudos lesson3]$ cd a/b/c
[yhz@VM-0-5-opencloudos c]$ ll
total 0
-rwx-wxrwx 1 root yhz 0 Jan 27 21:31 666.c
drwxr-xr-x 2 root yhz 6 Jan 27 21:30 d
[yhz@VM-0-5-opencloudos c]$ cd d
[yhz@VM-0-5-opencloudos d]$ ll
total 0
[yhz@VM-0-5-opencloudos d]$ ll -d
drwxr-xr-x 2 root yhz 6 Jan 27 21:30 .
说明:只有root可以用chown
(3)chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
说明:root可以用chgrp,拥有者只能将文件改到自己所属的组中
3. 对文件权限的理解
(1)普通文件的权限
[yhz@VM-0-5-opencloudos lesson3]$ ll test.txt
-rw-rw-rw- 1 yhz yhz 7 Jan 27 22:35 test.txt
[yhz@VM-0-5-opencloudos lesson3]$ cat test.txt
hello!
[yhz@VM-0-5-opencloudos lesson3]$ chmod 222 test.txt
[yhz@VM-0-5-opencloudos lesson3]$ ll test.txt
--w--w--w- 1 yhz yhz 7 Jan 27 22:35 test.txt
[yhz@VM-0-5-opencloudos lesson3]$ cat test.txt
cat: test.txt: Permission denied
[yhz@VM-0-5-opencloudos lesson3]$ chmod g+r test.txt
[yhz@VM-0-5-opencloudos lesson3]$ cat test.txt
cat: test.txt: Permission denied
[yhz@VM-0-5-opencloudos lesson3]$ chmod u+r test.txt
[yhz@VM-0-5-opencloudos lesson3]$ cat test.txt
hello!
[yhz@VM-0-5-opencloudos lesson3]$ ll test.txt
-rw-rw--w- 1 yhz yhz 7 Jan 27 22:35 test.txt
[yhz@VM-0-5-opencloudos lesson3]$ sudo whoami
root
[yhz@VM-0-5-opencloudos lesson3]$ sudo cat test.txt
hello!
权限匹配的“唯一性”原则(身份排他性)
当执行 chmod g+r test.txt 后,文件属性变为 --wrw--w-。虽然你属于 yhz 组,且组权限有 r(读),但你执行 cat 依然被拒绝了。
-
结论:在 Linux 中,权限校验是由近及远、命中即止的。
-
逻辑:系统先看你是不是 Owner。如果是,就只匹配 Owner 的权限,不再往下看 Group。
-
现象:由于你当时 Owner 的权限是
-w-(没有r),即使 Group 有r,系统也会因为你是 Owner 但没读权限而直接拦截,这就是为什么必须执行chmod u+r后你才能读。
root 是不受规则约束的“上帝”
最后两行代码展示了 root 的特殊性:
-
结论:root 用户可以无视文件权限位的限制。
-
逻辑:即便
test.txt在最后一步只有-rw-rw--w-(没给 others 读权限),sudo cat(即以 root 身份执行)依然能直接读出hello!。 -
本质:在 Linux 的“保镖”(Shell)和内核眼中,root 拥有最高通行证,所有 rwx 校验对 root 来说都是形同虚设。
(2)目录的权限
-
r(Read - 读权限):-
文件逻辑:读取文件内容。
-
目录逻辑:允许查看目录内的文件名列表。
-
表现:如果你只有
r权限,你可以执行ls看到有哪些文件,但由于没有进入权限,你无法看到文件的详细属性(如大小、权限),ls -l会显示一堆问号。
-
-
w(Write - 写权限):-
文件逻辑:修改文件内容。
-
目录逻辑:允许在该目录下创建、删除、重命名文件。
-
核心细节:即使你对某个文件没有写权限,但如果你对它所在的目录有
w权限,你依然可以强行删除这个文件。这就像你虽然打不开别人的抽屉,但你可以把整个抽屉从柜子里扔掉。
-
一个文件能否被删除,与文件自身的权限无关,而与它所在的目录权限有关。即使一个文件是
root拥有的,且权限是000(谁都不能读写),只要普通用户对该目录有rwx权限,照样可以一键rm掉它。
-
x(Execute - 可执行权限/进入权限):-
文件逻辑:将文件作为程序运行。
-
目录逻辑:允许进入该目录(即执行
cd)以及访问目录下的文件内容。 -
重要地位:
x是目录最核心的权限。如果没有x,哪怕你有r或w,你也无法真正读写目录里的具体文件。
-
| 权限组合 | cd (进入) | ls (看列表) | cat (读文件) | touch/rm (增删) |
--- | ❌ 拒绝 | ❌ 拒绝 | ❌ 拒绝 | ❌ 拒绝 |
r-- | ❌ 拒绝 | ✅ 可以看到名字 | ❌ 拒绝 | ❌ 拒绝 |
--x | ✅ 成功进入 | ❌ 拒绝 | ✅ 知道名字就能读 | ❌ 拒绝 |
r-x | ✅ 成功进入 | ✅ 可以看详细列表 | ✅ 成功读取 | ❌ 拒绝 |
rwx | ✅ 成功进入 | ✅ 全能 | ✅ 成功读取 | ✅ 掌控生死 |
[yhz@VM-0-5-opencloudos lesson4]$ tree
.
└── apart
└── file
1 directory, 1 file
[yhz@VM-0-5-opencloudos lesson4]$ ll apart/file
-rw-r--r-- 1 yhz yhz 0 Jan 28 11:26 apart/file
[yhz@VM-0-5-opencloudos lesson4]$ ll -d apart
drwxr-xr-x 2 yhz yhz 18 Jan 28 11:26 apart
[yhz@VM-0-5-opencloudos lesson4]$ chmod u-x apart
[yhz@VM-0-5-opencloudos lesson4]$ ll -d apart
drw-r-xr-x 2 yhz yhz 18 Jan 28 11:26 apart
[yhz@VM-0-5-opencloudos lesson4]$ cd apart
bash: cd: apart: Permission denied
[yhz@VM-0-5-opencloudos lesson4]$ ll apart
ls: cannot access 'apart/file': Permission denied
total 0
-????????? ? ? ? ? ? file
[yhz@VM-0-5-opencloudos lesson4]$ chmod u+x-r apart
[yhz@VM-0-5-opencloudos lesson4]$ cd apart
[yhz@VM-0-5-opencloudos apart]$ ls -dl
d-wxr-xr-x 2 yhz yhz 18 Jan 28 11:26 .
[yhz@VM-0-5-opencloudos apart]$ ll
ls: cannot open directory '.': Permission denied
[yhz@VM-0-5-opencloudos apart]$ cat file
[yhz@VM-0-5-opencloudos lesson4]$ ll
total 0
d-wxr-xr-x 2 yhz yhz 18 Jan 28 11:26 apart
[yhz@VM-0-5-opencloudos lesson4]$ cd apart
[yhz@VM-0-5-opencloudos apart]$ touch file
[yhz@VM-0-5-opencloudos apart]$ cd ..
[yhz@VM-0-5-opencloudos lesson4]$ chmod u+w apart
[yhz@VM-0-5-opencloudos lesson4]$ cd apart
[yhz@VM-0-5-opencloudos apart]$ touch file2
touch: cannot touch 'file2': Permission denied
[yhz@VM-0-5-opencloudos apart]$ rm file
rm: cannot remove 'file': Permission denied
[yhz@VM-0-5-opencloudos apart]$ chmod u+w ../apart
[yhz@VM-0-5-opencloudos apart]$ rm file
[yhz@VM-0-5-opencloudos apart]$ ll -d
d-wxr-xr-x 2 yhz yhz 6 Jan 28 17:26 .
4. 粘滞位
这就引出了一个问题,如果我的文件在你目录里,虽然你改不了,但你能删,这扯不扯?而且如果我们共同协助一个文件,那也不能放在任何一个人的目录下。
为什么不能放在私人目录?
根源:
/home下的用户家目录(如/home/yhz)默认权限通常非常严格(如700或750),只有拥有者自己能进入。路径阻断:根据我们之前的实验,如果 dytx想要访问
yhz家里的文件,他必须先通过/home/yhz这个“关口”。如果家目录没有给others开放x权限,dytx连大门都进不去,里面的文件权限再高也摸不到。解决方案:通常会在根目录
/下建立一个公共目录,或者在/tmp下操作,绕开家目录的限制
当你为了协作,给一个目录开放了 rwx 权限(全开)时,会产生一个致命问题:任何人都能删掉别人的文件。为了解决这个矛盾,Linux 引入了 粘滞位 (t)。
-
权限标志位:在目录权限的最后一位,你会看到
t(取代了原来的x),例如drwxrwxrwt。 -
核心特征:
-
大家依然可以在该目录下新建、修改文件。
-
但是,只有文件/目录的拥有者或 root 才能删除该文件。
-
[root@localhost ~]$ chmod +t /home/ # 加上粘滞位
[root@localhost ~]$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9⽉ 19 16:00 /home/
[root@localhost ~]$ su - litao
[dytx@localhost ~]$ rm /home/abc.c #litao不能删除别人的文件
rm:是否删除有写保护的普通空文件 "/home/abc.c"?y
rm: 无法删除"/home/abc.c": 不允许的操作
后记:是的,Linux的指令操作非常多,但是不要死记,熟能成巧才是方法。大家下去可以查一下Linux中的热键,也就是快捷键,它和Windows的基本上完全不一样,刚上手用的时候真的心累,如果有指令输不进去了记得按一下 ctrl+c 哦!
















