分类 笔记 下的文章

MySQL

一. 数据库基本概率(理论)

1. 概念

1.1 数据Date

 描述事物的符号记录 -- 数字,字符文本,图像,音频,视频类等 [二进制格式数据]

1.2 数据库DataBase - 简称DB

 保存数据的“仓库” [大量数据集中存储]
 两大特性: "集成性" 和"共享性"
 ​
 集成性 -- 数据与数据的联系一起保存
 共享性 -- 在网络应用中共享数据,[为了不同的应用需求,使用不同的开发语言,在同一个时间访问同一个数据]

1.3 数据库管理系统DMBS

 英语全名 - [DataBase Management System]
 主流的DBMS软件:      
 [方言] MySql,Oracle,MS SqlServer [2000,20xxx],Sybase,informix,DB2...
 主要功能:
 (1)数据库的建立和维护功能
 (2)数据定义功能
 (3)数据操纵功能 - SQL语言 [数据查询统计和数据更新两个方面]
 (4)数据库的运行管理功能
 (5)通信功能

1.4 数据库用户User

 数据库管理 - DBA
 应用程序员 - Programmer开发人员
 终端用户  - User

1.5 数据库系统DBS

 DBS英文全文 - [DataBase System]
 数据库系统(DatabaseSystem,DBS)是一个人机系统,一般由硬件、操作系统、数据库、DBMS、应用软件和数据库用户(包括数据库管理员)组成

2. 数据库发展史

 发展的三个阶段:
 (1) 层次型和网状型 -- 代表产品是1969年IBM公司研制的层次模型数据库管理系统IMS
 (2) 关系型数据型库 -- 使用二维表格的形式来存放数据 【主流】
 (3) 关系 + 对象型   -- [必须支持面向对象,具有开放性,能够在多个平台上使用]
 ​
 管理技术的3个阶段
 (1) 人工管理
 (2) 文件管理
 (3) 数据库系统

3. 数据库分类

3.1 关系型数据库

 "关系型数据库"
 实体 : 记录(行) 表示了一个实体(的属性)
 而E-R图:实体与实体之间的联系(关系)
 即 表与表的关系

3.2 非关系型数据库

 非关系型数据库'NoSQL'          [Not Only SQL 不仅仅是SQL] -高并发场景
 不使用表来保存数据,使用key-value [键值对数据库]
 "sid":1
 "sname":"张三"
 "stu01"  - {"1":1,"sname":"张三","ssex":"男"}
 NoSQL的代表产品:
 (1)Redis
  |-1.几乎覆盖了Memcached的绝大部分功能
    2.数据都在内存中,支持持久化,主要用做备份恢复
    3.除了支持简单的key-value模式,还支持多种数据结构的存储,比如:list,set,hash,zset等.
    4.一般是作为缓存数据库辅助持久化的数据库
 ​
 (2)MongoDB
    |-1.高性能,开源,模式自由的开发型数据库
      2.数据都在内存中,如果内存不足,把不常用的数据保存到硬盘
      3.虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
      4.支持二进制数据及大型对象
      5.可以根据数据的特点替代RDBMS,成为独立的数据库.或者配合RDBMS,存储特定的数据

二. 数据库的一些简单操作

1. 登录mysql数据库

# mysql -uroot -p

2. 查看数据库列表信息show

show databases;

3. 创建数据库create

create database 数据库名字 default character set utf8;

4. 查看正在使用的数据库select

select database();

5. 使用或者切换数据库use

use 数据库名字;

6. 查看当前数据库中的表信息show

show tables;
-- 结果 Empty set (0.00 sec)
--空集合,表示当前数据库中没有表

7. 创建表create

create table student  -- 表名
(
sid int,
sname char(10), -- char类型如果不指定长度,只默认为char(1)
sage int -- 最后一列,不加‘,’
)default charset=utf8;

8. 查看表的结构desc

语法: desc 表名
-- 示例: desc student

9. 查看表中的所有行和列select

语法:	select * from 表名
-- select * from student

10. 向表中添加数据 insert [列与值要数目和类型做匹配一致]

insert into 表名(列1,列2,列3....) values(值1,值2,值3....)
-- insert into student(sid,sname,sage) values(1,'张三',20);

三.Navicat可视化工具的使用

1. Navicat简介

Navicat是一套可创建多个连接的数据库管理工具,可以方便地管理MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB和 MongoDB等不同类型的数据库

Navicat不是由MySQL官方提供的,是由'第三方软件公司'发布

基于MySQL的 GUI(图形用户界面)管理工具,不只是Navicat一种,还有很多种: Sqlyog,DataGrip...

2. Navicat实操

2.1 Navicat建立连接

(1)填写"连接名" 不能与已有连接名冲突
(2)主机IP,如果是localhost,则表示连接本地主机 --"127.0.0.1代表本机"
(3)用户名,密码,端口号
(4)测试连接

2.2 创建数据库

在"连接名"上右键-->"新建数据库"-->填写数据库名-->选字符集,确定完成

2.3 创建表

在打开的数据库目录中,选中"表"右键-->"新建表"

2.4 打开表--输入数据 [insert操作]

2.5 查询编辑器

当前打开的数据库目录中找到"查询" -->右键"新建查询" -->保存命名当前查询的脚本文件名

四.SQL分类

4.1 SQL定义

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
-- 与关系模型数据库交互的语言
SQL从功能上可以分为3部分:'数据定义'、'数据操纵'和'数据控制'。

4.2 可分为六大类(*DDL,*DML,*DQL,*DCL,TCL,CCL)

*(1)DDL -- 英文全名(Data Definition Language)  --   '数据定义语言'
"Create 创建,Drop 删除,Alter 修改,Truncate 截断"

*(2)DML -- 英文全名(Data Manipulation Language) -- '数据操作语言'
"Insert 插入,Delete 删除,Update 修改"

*(3)DQL -- 英文全名(Data Query Language) -- '数据查询语言'
"select [选择]"

*(4)DCL -- 英文全名(Data Control Language) -- '数据控制语言'
"grant [授权],revoke [撤销]"

--------------------------------------------------------------------------
(5)TCL -- 英文全名(Transaction Control Language) -- '事务控制语言'
"commit 提交,rollback 回滚(回退)"

(6)CCL -- 英文全名(Cursor Control Language) -- '游标(指针)控制语言'
"declare ,open ,fetch ,close"

五.MySQL数据类型(字符,整数,浮点数,二进制数据)

数据类型"字符串","整数","浮点数","二进制数据"

5.1 整数型

1)整数型:
tinyint 微小整数数 - 1字节 - 8位二进制 -128~127
smallint 小整数 - 2字节
mediumint 整数 - 3字节

int - 整数型 - 4字节 [Byte 8个二进制数位bit = 1字节Byte]
1024B = 1KB (千)
1024KB = 1MB (兆)
1024MB = 1GB (吉)
1024GB = 1TB

1024TB = 1PB
1024PB = 1EB
bigint 大整型 8字节

5.2 小数型

(2)小数型:
float 单精度浮点数 4字节 [近似值表示法,小数位不固定]
double 双精度浮点数 8字节
decimal(10,2)
-- 示例 12345678.99 [10表示总位数为10位,其中2位小数]
-- 对于小数点后面精度值要求高数值,比如金额,推荐使用decimal

5.3 日期型

(3)日期型:
date - '年-月-日' '2025-5-12'
time - '时:分:秒' '13:55:20'
datetime -日期时间类型 例: '2025-05-20 14:30:20'
补充: 系统函数now()/sysdate() --当前系统的日期与时间值
timestamp -- 时间戳类型

5.4 字符(串)型

(4)字符(串)型:
'xxxx'或"xxxx"
char(10) -- 固定长度的字符串型 'abc ' -最大255个字符
-- 存储效率高,以空间换效率,比如生身份证

varchar(10) -- 可变长度的字符串型 'abc' 最大65536个字符
-- 存储效率低, 以效率换空间,比如家庭住址,email

longtext 长文本类型 -- 最大4GB字符数

六.DDL详解

DDL数据定义语言:create 建表,alter 修改表,drop 删除表,truncate 截断表

6.1DDL建库建表(create)

(1)-- 创建数据库
语法:
create database 数据库名称 default character set utf8;
-- 创建库示例
create database woniu79 default character set utf8;

(2)-- 创建表
语法:
create table 表名(列名 数据类型 [,列名 类型, ...])default charset=utf8;
-- 创建表示例
create table student
(
sid int comment "学号",
sname char(10) comment "姓名",
ssex char(1) comment "性别",
sbirth date comment "生日"
)default charset=utf8;

comment 注释 注:加了comment就要在后面写注释

6.2 DDL修改表结构alter

(1)向表中添加新的字段

语法:
alter table 表名 add 新的字段名 数据类型;

-- 示例
alter table user_info add birth date;

(2)修改表中列名

语法
alter table 表名 change 旧列名 新列名 数据类型;

-- 示例
alter table user_info change birth birthday date;

(3)删除表中的列

语法
alter table 表名 drop 列名;

-- 示例
alter table user_info drop birthday;

拓展

(1)修改表中列类型方法1 change

alter table user_info change realname realname varchar(20);

(2)修改表中列类型方法2 modify

alter table user_info modify realname varchar(50)

(3)修改表名 rename

alter table user_info2 rename to userinfo

6.3 DDL删除表drop

语法
drop table [if exisits] 表名;

-- 如果删除表时,带上if exists判断,则表示如果存在才会执行删除表

-- 示例
drop table user_inifo;

drop table fi exists user_inifo; -- 先判断是否存在,存在则删除,然后再进行创建
create table user_info
(
...
)

6.4 DDL中的trunate

  • 语法

truncate table 表名
-- 删除表中所有的数据

7.DML详解

DML数据操纵语言 :Insert 新增 ,Update 更新 ,Delete 删除

7.1 新增数据insert

  • 语法

分为两种insert操作:
(1)-- 新增单行数据
语法:
insert into 表名(列名1,列名2,列名3....) values(值1,值2,值3);
-- 必须满足要求
a.列与值数目要匹配
b.列与值的类型要兼容
c.不能违反表中列相关的约束(限制)

(2)-- 新增多行数据
语法:
insert into 表名(列名1,列名2,列名3,.....)
values(值1,值2,值3,....),
(值1,值2,值3,....),
(值1,值2,值3,....),....;

  • 示例

-- 插入单行数据
insert into user_info(id,username,realname,sex,height,balance,regtime)
values(1,'admin','张三','男',178.88,2000.99,'2025-04-30 12:33:30');

-- 插入多行数据
insert into user_info(id,username,realname,sex,height,balance,regtime)
values(2,'jenny','李四','女',168.88,3000.99,now()),
(3,'Jack','王五','男',172.88,2000.99,'2024-12-30'), (5,222,'小明','男',172.88,2000.99,'2024-12-30');

7.2 更新数据update

  • 语法

update 表名 set 列名=新值 [,列=新值 ...] [where 条件]

  • 示例

-- 更新所有的数据,年龄全部统一为20
update user_info set age=20

-- 更新id为1的用户年龄为22
update user_info set age=22 where id=1

-- 所有男生的年龄提高2岁
update user_info set age=age+2 where sex='男'

-- 修改更新表中的多个列
update user_info set realname='张小红',sex='女',height=165.44,balance=balance+1000
where id=4

注:where 不添加,意味着修改全部

7.3 删除数据delete

  • 语法

delete from 表名 [where 条件]

注:where 不添加,将会把整个表中数据删除

  • 示例

-- 删除年龄为22的用户信息
delete from user_info where age=22;

-- 删除表中所有的数据
delete from user_info;

7.4 DML中delete 与 DDL中truncate 区别

  • 共同点:都可以将表中的所有数据删除
  • 不同点
    • delete属于DML ,Truncate 属于DDL
    • delete可以带where子句,只删除部行分数据 truncate只能无条件的清空整张表数据
    • delete执行效率要低于truncate语句
    • delete删除数据后,再插入数据自增会继续增长 truncate表删除数据后,自增列复位(重新开始) [初始化表,截断表]

打比方说明,delete类似卸载,truncate类似恢复出产设置

8.MySQL中七大约束

8.1 自增列 auto_increment

在mysql数据库中有一种特殊的列约束,自增列
特点:
1. 自增列只能是整数型
2. 列的值由mysql服务器在插入数据时自动生成,不需要提供
3. 自增列必须是主键

-- 示例
create table user_info
(
id int primary key auto_increment, -- id 用户编号,主键[列的值不能重复,不能为空],自增
...
)

补充:

当插入数据时,第一个与第二个增长为1和2,但是当第三个数据你不自增然后自己添加编号时,比如说5,那么当插入第四个数据时你自增长的编号是6

8.2 主键 primary key

特点:
(1) 非空
(2) 值唯一 [不能重复]
(3) 一张表只能设置1个主键, 允许多个列一起作主键
(4) 通常创建的每张表都会设置主键
(5) 主键的选择--最小性(数值列),最少更改的列

-- 示例
create table user_info
(
id 类型 primary key
)

8.3 唯一值 unique

特点:
(1) 允许一个空
(2) 值唯一
(3) 一张表可以设置多个唯一键

-- 示例
create table user_info
(
id int primary key auto_increment,
username char(20) not null unique --唯一
)

8.4 非空 not null

特点:
(1) 值不能为空
(2) 可以设置多个列为非空
(3) mysql创建表时不加not null默认允许为空值

-- 示例
create table user_info
(
id int primary key auto_increment,
ssex char(1) not null -- 非空
)

8.5 默认值 default

特点:
(1) 插入数据时,不提供值便采默认值,提供值则不使用默认值

-- 示例
create table user_info
(
id int primary key auto_increment,
address varchar(50) default '湖北武汉' -- 添加默认地址为湖北武汉
)

8.6 检查约束 check新 enum老

特点:
(1) 检查 插入的数据是否符合检查约束条件(表达式)

create table user_info
(
id int primary key auto_increment,
ssex char(1) not null check(ssex='男' or ssex='女'), -- 非空,检查 新版
ssex enum('男','女') -- 检查 老版
)

注:check约束 -MySQL5.7直接不支持 CHECK 约束 老版MySQL使用enum

8.7 外键约束 foreign key

  • 特点

特点:
(1) 用于建立表与表之间的关联关系
(2) 外键列不能出现引用的主键列中不存在的值

  • 语法

-- alter table 添加外键
alter table 子表 add constraint fk_子表名_主表名
foregin key(外键列名) references 主表名(主键列名);

  • 示例

alter table orders add constraint fk_orders_users
foregin key(user_id) references user_info(id);

8.8 *表关系

*表关系分为三种

  • 一对一
    • 1:1 一边表中的一行数据与另一边表只有一行数据对应
    • 另一边表中的一行数据与这边的表的数据也只有一行对应
    • 举例:学生表(身份证ID-唯一) - (身份证ID-PK)身份证表
    • 举例:班级表(class) - 教室表(room)

  • 一对多
    • 1:M 一边表中的一行数据与另一边表中的多行数据对应
    • 另一边表中的一行数据与这边的表的数据也只有一行对应
    • 举例:班级表 -- 学生表

  • 多对多
    • M:N 一边表中的一行数据与另一边表中的多行数据对应
    • 另一边表中的一行数据与这边的表的数据有多行对应
    • 注意:多对多两张表没有直接联系,而是通过中间表进行关联
    • 举例:读者 - 借阅- 图书
    • 举例:学生表 -选修关系表 - 课程

9.DQL基础查询

9.1 运算符查询(算数、关系、逻辑)

  • 算术运算符

算术运算符 +,-,*,/,%

  • 关系运算符

6种: > , >= , <, <= , =,  '<> [不等于]'

  • 逻辑运算符

-- 作用: 用于连接多个条件,组合为复合条件
3种: '与and','或 or','非 not'
# 条件1 and 条件2 都为真,结果才为真
# 条件1 or 条件2 只需要1个条件为真,结果就为真
# 结果:真(1) 假(0)

9.2 查询行和列

  • 查询所有行和列的数据

-- 示例
select * from student;

  • 查询部份列

-- 示例
select sno,sname from student -- 查询学号和姓名两个列

  • 查询的列名命名别名

select sno as '学 号',sname '姓+名',sage 年龄			-- 查询的列名命名别名
from student

9.3条件查询

  • 语法

select 字段列表
from 表名
[where 条件]

-- 关系运算符(>,>=,<,<=,=,<>)和逻辑运算符(and,or,not)
1、= 等于
2、!= 不等于
3、>= 大于或等于
4、> 大于
5、< 小于
6、<= 小于或等于
7、<> 不等于
8 类似: age >= 18 and age <= 60
9、and 拼接多个条件,多个条件要同时成立
10、or 拼接多个条件,多个条件任意满足一个就可以

  • 示例

-- 查询学生表中年龄在23岁以上的学生的学号,姓名,年龄和性别
select sno 学号,sname 姓名,sage,ssex 性别
from student
where sage>=23

-- 查询学生表中年龄在23岁以上的女生信息
select sno 学号,sname 姓名,sage,ssex 性别
from student
-- where not (sage>=23 and ssex='女')
-- 等价于
where sage<23 or ssex<>'女'

-- 查询学生表中年龄在23岁以上或性别是女生
select sno 学号,sname 姓名,sage,ssex 性别
from student
where sage>=23 or ssex='女'

9.4 模糊查询

(1)like与not like

-- 通配符     %   用于匹配任意长度的任意字符      _   用于匹配1个长度的任意字符

like 作为模糊查询的运算符,用于条件匹配批量的数据值

-- like 模糊匹配 not

-- 通配符
-- % 用于匹配任意长度的任意字符
-- _ 用于匹配1个长度的任意字符

-- 查询姓名中含有'小'字的学生记录
select * from student where sname like '%小%'

-- 查询姓名中不含有'小'字的学生记录
select * from student where sname not like '%小%'

-- 查询姓名中是以'小'字开头的学生记录
select * from student where sname like '小%'

select * from student where sname like '小' -- 等价于 sname='小'

-- 查询姓名中姓王,且2个字的学生信息
select * from student where sname like '王_'

-- 3字人名
select * from student where sname like '王__'

(2)between...and 与 not between... and

-- 判断某列的值是否处于某个区间范围 [数值型和日期型列]

-- 查询学生表中年龄在21~24之间学生
select * from student where sage between 21 and 24
-- 等价写法
select * from student where sage >= 21 and sage<=24

-- not between... and
select * from student where sage not between 21 and 24

-- 查询日期范围
select * from student where sbirth between '2001-1-1' and '2002-7-31'

(3)in谓词 与 not in

  • 语法

语法: where  列 in (值1,值2,....)

  • 示例

-- 查询classid班级号为J001,Y001,Y002任意的学生
select * from student where classid='J001' or classid='Y002' or classid='Y001'
-- 等价写法
select * from student where classid in ('J001','Y002','Y001')

select * from student where classid not in ('J001','Y002','Y001')

9.5 排序查询

  • 语法

select 字段列表
from 表名
[where 条件]
[order by 要排序的列1,列2 asc|desc]

asc - 表示升序,可省略,默认为升序            desc - 表示降序,不可省略

  • 示例

select * from student
order by sage asc -- asc省略时,也是升序

select * from student
order by sage desc

select * from student
order by sbirth+

-- 按中文汉字拼音顺序排序 [了解]
select * from student
order by convert(sname using GBK)

--------------------- 多列排序 [也称为分组排序]
select * from student
order by classid,sage desc -- 先按班级号升序,再到每个班中内部按年龄降序

select * from score
order by grade desc


select * from score
order by sno,grade desc -- 先按学号升序,每个学号所选修课程记录的内部按成绩降序

select * from score
order by cno,grade desc

9.6 空值查询

#空值查询 is null,is not null 仅限于 where子句

  • 示例

-- 查询email为空的学生
select * from student
where semail is null

-- 查询email不为空的学生
select * from student
where semail is not null

-- 但是,如果是update的set子句,则使用=设置为空值
update student set semail=null where sno=7

9.7 去重查询distinct

#关键字: distinct

-- distinct 关键字用于查询时,屏蔽重复的数据行
select distinct sno from score

select distinct ssex from student

注:

(1)不要针对具有id的数据进行去重,没有意义

(2)distinct 并不会删除重复数据

10.DQL进阶查询

10.1系统查询

(1)字符串函数

a.concat(s1,s2)进行字符串拼接

-- CONCAT(s1,s2)	进行字符串拼接
-- 字符串拼接
select concat ('hello','world'); -- 示例

select concat(sno,'-',sname) as 学号及姓名,ssex ,sage -- 示例
from student

b.lower 将字符串所有字符变为小写

select lower('HELLO')		  		     -- 示例

c.upper 将字符串所有字符变为大写

select upper('hEllo')      -- 示例

d.left 将主字符串从左边提取指定位数的子字符串

select left('abcdefg',3) 		  		     -- 示例

e.right 将主字符串从右边提取指定位数的子字符串

select right('abcdefg',3) 		  		     -- 示例

f.trim 去掉字符串行尾和行头的空格

select trim('    abcdefg    ') 

补充:

trim+right 嵌套使用 select right(trim(' abcdefg '),3)

g.字符串替换 replace('源字符串','查找子串','替换的字符串')

-- 字符串替换  replace('源字符串','查找子串','替换的字符串')
select replace('abcabcabc','bc','BC')

-- 从源串中删除指定子串
select replace('abcabcabc','bc','')

h.substring/substr 返回指定的字符串

  • 从源字符串的起始位置开始截取指定长度的子字符串
  • substring('源字符串',起始位置,截取的长度)

select substring('abcdefg',3,2)   -- 起始位置从c开始
select substr('abcdefg',3,2) -- 起始位置从c开始

-- substring()如果只写起始位置,不写长度,则表示到该字符串结束
select substring(sname,2) as 名字 from student

(2)数学函数

a. abs() 返回绝对值

select abs(-3)    -- 3

b. ceil()返回不小于某个值的最小整数值 【向上取整】

select ceil(3.000000001)  -- 4

c. floor()返回不大于某个值的最大整数值 【向下取整]

select floor(-3.9999999)    -- 结果为: -4

d. round()四舍五入取整

-- 四舍五入取整
select round(3.4)

-- 四舍五入保留小数位
select round(3.567,2)

e.MOD() 返回模,余数

select 10%3

select mod(10,3)

f. truncate() 返回数字截断小数的结果 [截位取整]

  • truncate(x,y): 返回数字 x 截断y 位小数的结果, TRUNCATE 知识截断,并不是四舍五入。

select truncate(3.1291231231,0)      -- 结果为3;

g. rand()随机小数

-- 生成0~1 随机小数    伪随机数 当前系统时间毫秒值 作为种子值 代入公式计算所得
select rand()

-- 0~9随机整数 [乘以10,向下取整]
select floor(rand()*10)

-- 10~20 之间随机整数
select 10+floor(rand()*11)

(3) 日期时间函数

a.week()返回给定的日期是一年中的第几周

select week(now())

b.year()返回给定日期的年份

select year(now())

c.month()返回给定日期的月份

select month(now())

d.curdate() 返回当前日期

select curdate()

e.curtime() 返回当前时间

select curtime()

f.data_add() 返回日期时间加上一个时间间隔

语法:
date_add(date,interval expr unit)
-- date: 要操作的日期或日期时间表达式。
-- INTERVAL: 关键字,表示接下来是一个时间间隔。
-- expr: 表示时间间隔的数量,可以是整数或小数。
-- unit: 时间间隔的单位,如 SECOND, MINUTE, HOUR, DAY, WEEK, MONTH,QUARTER, YEAR 等。

示例:
-- 7天之后的日期
select date_add(now(),interval 7 day)
-- 7天之前的日期
select date_add(now(),interval -7 month)

g.datediff() 返回起始时间和结束时间之间的天数

select datediff(now(),'2025-5-10')

h.last_day(date) 返回日期所在的最后一天

select last_day(now())

与date_add()联合使用示例
-- 上个月的最后一天
select last_day(now())

i.datofyear() 返回的是一年中的第几天

select dayofyear(now())

j.查询学生表中今天生日的学生信息

-- 查询学生表中今天生日的学生信息
select * from student
where month(sbirth)=month(now()) and day(sbirth)=day(now())

(4)其他函数

a.if(value,t,f)

如果 value 是真,返回 t;否则返回 f
select if(3>5,'真','假')

b.ifnull(value1,value2)

如果 value1 不为 NULL,返回 value1,否则返回 value2。
select ifnull('xxx','aaa') -- 参数1,参数2

c.version()返回当前数据库的版本

select version();

d.database()返回当前数据库名

select database();

e.user() 当前的用户名

select user()

f.password()

select password('123')

10.2 聚合函数 sum-avg-max-min-count

  • 函数的种类

  • 单行函数:常用系统函数 字符串,数学,日期时间相关
  • 聚合函数 - 共有5个
    • sum()求和
    • avg()平均值
    • max()最大值
    • min()最小值
    • count()计数

关于聚合函数的注意事项: (1) sum,avg只能用于数值型的列 (2) max,min,count不限类型 (3) 只有count可以使用*作为参数 ,表示将表中的一行作为一个计数单位 (4) 所有的聚合函数都忽略空值 ,如果不想空值被忽略,可以使用ifnull()空值处理函数

10.3 分组查询

(1)group by 分组

  • 语法:

select 字段列表....
from 表名
where 条件
group by 子句 -- 指定分组的列

分组的含义: 将指定分组的列中相同的值逻辑上划分为一个组

  • 示例

-- 参加了选修的学生学号
select sno
from score
group by sno

-- 分组+聚合 一起使用
-- 统计每个学生所选修课程的总分,平均分,及选修的科目数
-- select子句同时出现 非聚合函数列与聚合函数列
-- 必须 将所有的非聚合列放在group by 子句中
select sno 学号,sum(grade) 总分,avg(grade) 平均分 ,count(*) 科目数
from score
group by sno

-- 按课程号分组统计总分
select cno,sum(grade)
from score
group by cno

-- 按性别统计人数
select ssex 性别,count(*) 人数
from student
group by ssex

注:

group up 后面最好加上所有的非聚合列名

(2)having 子句

  • 当需要分组后再进行聚合函数的条件判断时,则使用having子句

where -> group by  --> having

示例:
-- 需求: 查询统计参加了补考的学生学号,课程号
select sno,cno
from score
-- where count(*)>1 -- where 表中原始数据的筛选 不能是聚合函数列的条件
group by sno,cno
having count(*)>1 -- having 分组后的数据筛选 聚合函数的条件判断

有group by子句时,不一定有having 但是,有having时,一定要先group by **

10.4限制行查询

  • 语法:

select 列...
from 表
limit [m,] n -- [放在SQL中所有子句的最后]

对查询结果限制
m - 表示起始行的索引号 [行的索引 从0开始]
n - 限制的记录数 [从1开始计]

  • 示例:

-- 查询前3行
select * from score limit 3
-- 等价写法
select * from score limit 0,3

-- Limit实现分页查询SQL:
-- 提供两个参数: 当前页码pno ,每页的记录数 pageSize
select * from score limit 起始索引号startIndex,pageSize

-- 起始索引号startIndex = (pno-1)*pageSize
-- 例如,查看每页3条的第3页的数据
select * from score limit 6,3

--------------------------------- 查询成绩前3名的选修记录
-- order by +limit 配合

select *
from score
order by grade desc
limit 3

-- Limit实现分页查询SQL: -- 提供两个参数: 当前页码pno ,每页的记录数 pageSize select * from score limit pageSize*(pno-1),pageSize

10.5查询语句的完整子句语法

select 列,sum,avg.count(),max(),min()...
from 表 --- >> 从数据库查找整个表数据,读入到内存中
[where 条件] -- 源数据条件筛选
[group by] -- 分组 --- select
[having] -- 聚合函数的条件筛选
[order by ]
[limit [m,] n]

image-20250522162924966

11.DQL-高阶查询

11.1 多表查询原理

笛卡尔积:
|- 笛卡尔积是数学和数据库领域的基本概念,指两个集合中所有可能有序对的组合

{a,b,c} x {1,2} = {{a,1},{a,2},{b,1},{b,2},{c,1},{c,2}}

11.2 内/等值连接查询

(1)内/等值连接 — 92标准

1.等值连接  92标准
select score.sno,sname,ssex,sage,cno,grade
from student,score
where student.sno=score.sno

2.另一种写法,为表名起别名
select sc.sno,sname,cno,grade
from student as s ,score as sc
where s.sno=sc.sno

3.三表连接
select score.sno 学号,sname 姓名,score.cno 课程号,cname 课程名,grade 成绩
from student,score,course
where student.sno = score.sno and score.cno=course.cno

(2)内/等值连接 — 99标准

等值连接  SQL 99标准
比SQL92标准执行效率高
-- inner join 内连接
select sc.sno,sname,cno,grade
from student as s inner join score as sc on s.sno=sc.sno

三表连接 SQL99标准写法
select sc.sno 学号,s.sname 姓名,sc.cno 课程号,c.cname 课程名,sc.grade 成绩
from student as s inner join score sc on s.sno = sc.sno
inner join course c on sc.cno=c.cno

11.3 外连接查询

注意:

外连接数据是在内连接数据的基础上进行的补充!!!

分为左外连接与右外连接 — left outer join — right outer join

  • 左外连接

-- 需求: 查询学生的选修记录,要求格式: 学号,姓名,课程号,成绩
-- 另外,没有参加选修的学生学号及姓名也显示,对应课程号和成绩栏显示null
-- left join 左边的表中有数据,右边表中没有的数据也显示,对应栏为NULL
select s.sno as 学号,s.sname as 姓名,sc.cno as 课程号,sc.grade as 成绩
from student as s left join score as sc on s.sno=sc.sno
order by s.sno

左边表的数据补充右边表没有的数据

  • 右外连接

-- right join
select s.sno as 学号,s.sname as 姓名,sc.cno as 课程号,sc.grade as 成绩
from score as sc right join student as s on s.sno=sc.sno
order by s.sno

右边表的数据补充左边表没有的数据

  • 案例: 查询出没有参加选修的学生学号,姓名,性别,年龄

select s.sno as 学号,s.sname as 姓名,s.ssex 性别,s.sage 年龄

from student as s left join score as sc on s.sno=sc.sno

where sc.grade is null

11.4 综合示例-多表+分组+聚合

需求: 学号/姓名/总分/平均分

-- step1: 学号/总分/平均分
select sno 学号, sum(grade) 总分,avg(grade) 平均分
from score
group by sno

-- step2: 学号/姓名/总分/平均分
select sc.sno 学号,s.sname 姓名,sum(grade) 总分,avg(grade) 平均分
from score as sc inner join student as s on sc.sno=s.sno
group by sc.sno,s.sname

11.3 case-when子句查询

CASE WHEN子句用于根据条件进行条件判断,并返回相应的结果

(1)语法1:等值条件判断

case 列 when 值1 then 表达式1
when 值2 then 表达式2
...
[else 表达式N] -- 以上的when值都不能满足列的条件,则执行else部份
-- 如果没有else子句,以上条件都不满足时,则最终结果为 NULL
end -- end不能掉,否则语法错误

  • 示例

select score_id,sno,cno,
case cno when 'C01' then '课程一'
when 'C02' then '课程二'
else '课程三'
end as "课程描述", grade
from score

(2)语法2: 区间范围的条件判断

case  when 列>=值1 then 表达式1
when 列>=值2 then 表达式2
...
[else 表达式N] -- 以上的when值都不能满足列的条件,则执行else部份
-- 如果没有else子句,以上条件都不满足时,则最终结果为 NULL
end -- end不能掉,否则语法错误 414475

  • 示例

select score_id,sno,cno, grade,
case when grade>=90 then '优'
when grade>=80 then '良'
when grade>=70 then '中'
when grade>=60 then '及格'
else '不及格'
end as 成绩等级
from score

11.4 子查询

  • 概念

子查询-subquery 又称为"嵌套查询" 意味着在一个父查询中的某个子句部份还有其他的查询(称为"子查询")

可以用来替代绝大部份的连接查询

执行顺序: 先执行子查询,将查询的结果返回给父查询,再执行父查询得到最终的结果

子查询语法上必须使用()

  • 子查询的语法形式

select
(子查询) -- 只能是单行单列的结果
from
(子查询) -- 必须要有查询结果,类型不限: 单行单列,多行单列,多行多列
where
(子查询)
|-条件使用关系运算符: >,>=,<,<=,=,<> -- 子查询只能是单行单列
|-条件使用in,not in -- 子查询可以是单行单列,多行单列
having
聚合函数 >,<,>=,....in,not in (子查询) --与where相同


#DML语句中子查询形式:
insert into 表(列,...) values((子查询),(子查询),(子查询)...)
update 表 set 列= (子查询) where (子查询)
delete from 表 where (子查询)

  • 示例

# select 部份子查询 只能是单行单列
-- 需求1:查询学生成绩表中成绩占所有选修成绩的占比
select * from score

select sum(grade) from score

select score_id 序号,sno 学号 ,cno 课程号,grade 成绩,
concat(round(100*grade/(select sum(grade) from score),2),'%') as "占比%"
from score

# from 子查询 只需要有查询的结果的子查询
# 要求:子查询必须指定别名
select a.姓名,b.cno,b.grade
from
(select sno 学号,sname 姓名 from student) as a,
(select sno 学号,cno,grade from score) as b
where a.学号=b.学号

-- 需求2: 学生成绩表中每个等级的人数
等级 人数
--------------------
优 5
良 2
中 1
及级 3
差 4
select 成绩等级,count(*) 人数
from (
select score_id,sno,cno,grade,
case when grade>=90 then '01-优'
when grade>=80 then '02-良'
when grade>=70 then '03-中'
when grade>=60 then '04-及格'
else '05-不及格'
end as 成绩等级
from score
) as a
group by 成绩等级
order by 成绩等级

-- 需求3: 选修了C01号课程的成绩比选修了C02号课程的成绩高的学号及姓名
select sno 学号,sname 姓名
from student
where sno in (
select a.sno
from
(select sno,grade from score where cno='C01') as a,-- 查询选修了C01课程的学号及成绩
(select sno,grade from score where cno='C02') as b -- 查询选修了C02课程的学号及成绩
where a.sno=b.sno and a.grade>b.grade
)
-- 另一种写法
select a.sno 学号,c.sname 姓名
from (select sno,grade from score where cno='C01') as a,-- 查询选修了C01课程的学号及成绩
(select sno,grade from score where cno='C02') as b, -- 查询选修了C02课程的学号及成绩
student as c
where a.sno=b.sno and a.grade>b.grade and a.sno=c.sno

# where子查询
-- 关系判断>,>=,<,<=,=,<> 只能是单行单列
-- 谓词in,not in 可以是多行单列

-- 需求4: 查询学生表中年龄高于所有学生的平均年龄的学生
select avg(sage) from student

select *
from student
where sage > (select avg(sage) from student)

-- 需求5: 查询只选修了一门课的学生学号及姓名
select sno 学号,sname 姓名
from student
where sno in (
select sno -- 子查询:查出只选修了一门课的学号
from score
group by sno
having count(*)=1
)

-- 删除黄晓倩的选修记录
delete from score where sno in (select sno from student where sname='黄晓倩')

需求3: 选修了C01号课程的成绩比选修了C02号课程的成绩高的学号及姓名

select sno 学号,sname 姓名
from student
where sno in (
select a.sno
from
(select sno,grade from score where cno='C01') as a,-- 查询选修了C01课程的学号及成绩
(select sno,grade from score where cno='C02') as b -- 查询选修了C02课程的学号及成绩
where a.sno=b.sno and a.grade>b.grade
)

12.MySQL补充

12.1 视图 - View

  • 简介

视图 - 是一张"虚表",是存储的select查询语句

作用与特点: 简化数据的访问,隐藏原始的数据表,提升数据安全性

工作原理:
视图本身不存储数据,而是基于一个或多个基表(实际存储数据的表)生成。当访问视图时,数据库系统会自动执行定义视图的查询,并返回结果集。

  • 创建视图

-- 创建视图
create view v_stu as select sno,sname,ssex,sage from student where classid='J001'

-- 访问视图
select * from v_stu

-- 创建用户
create user 'zhangsan'@'localhost' IDENTIFIED by '123'

-- 为用户zhangsan授权room表的所有权限
GRANT all ON woniu79.room TO 'zhangsan'@'localhost'

-- 授予视图v_stu的访问select权限
GRANT select ON woniu79.v_stu TO 'zhangsan'@'localhost'

-- 撤回权限
revoke select on woniu79.v_stu from 'zhangsan'@'localhost'

12.2 索引 – Index

  • 简介

索引 -数据库中一种对象,与表单独存储,内容基于表而创建的,如果表被删除,基于该表的所有的索引都会自动删除

类似一本书的目录,新华字典

索引优点: 提高查询的速度
索引缺点: 占用存储空间,DML操作表时,降低了速度

image-20250523171949202

  • 索引的分类

(1) 普通索引 - [B树] -- 外键
(2) 唯一索引 - [B树-unique 索引列的值不能重复]
(3) 主键索引 - 属于唯一索引中的特例
(4) 组合索引 - 基于多个列来共同创建索引,where中涉及到组合索引中的列时,提高查询速度

  • 索引的相关SQL

-- 查看某个表上的索引
show index from student

-- 创建索引
create index idx_age on student(sage)

-- 删除索引
drop index idx_age on student

  • 索引测试

-- 创建app_user测试表
CREATE TABLE `app_user`
(
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '' COMMENT '昵称',
`email` VARCHAR(50) DEFAULT NULL COMMENT "邮箱",
`phone` VARCHAR(20) DEFAULT NULL COMMENT "手机号",
`gender` TINYINT(4) DEFAULT NULL COMMENT "性别 0-男, 1-女",
`password` VARCHAR(100) NOT NULL COMMENT "密码",
`age` TINYINT(4) NOT NULL COMMENT "年龄",
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY(`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='app用户表';

-- 插入百万数据
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 2000000;
DECLARE i INT DEFAULT 0;
WHILE i < num DO
-- 插入语句
INSERT INTO `app_user`(`name`,`email`,`phone`,`gender`,`password`,`age`)
VALUES (CONCAT('用户',i),'123456@qq.com', CONCAT('18', FLOOR(RAND()*((999999999-100000000)+100000000))), FLOOR(RAND()*2), UUID(), FLOOR(RAND()*100));
SET i = i+1;
END WHILE;
RETURN i;
END;

-- 执行可能会出现This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary报错。

-- 如果出现,可以先执行set global log_bin_trust_function_creators=TRUE ,然后再试下。

set global log_bin_trust_function_creators=TRUE

-- 执行函数 向表中添加200万行数据
select mock_data();

------------------------------------
-- 查看表上的索引
show index from app_user

-- 为phone列创建索引
create index idx_phone on app_user(phone)

-- 删除表上的idx_phone索引
drop index idx_phone on app_user

-- 测试查询
select * from app_user where phone='18536853057'

Linux操作系统

1.linux初学

1、Linux发展史

(1)操作系统简介

计算机硬件 -- 主板、cpu、内存、硬盘、显卡、网卡等

计算机软件--- office、qq、浏览器、B站、游戏等

操作系统 --- 是个软件,用于管理硬件和应用软件,大管家。

操作系统分类 - - 桌面操作系统(windows、mac)、服务器操作系统(linux、windows)、移动操作系统(鸿蒙、安卓、IOS)、嵌入式操作系统(智能家居、物联网)

服务器操作系统 --- unix、linux、windows server

服务器操作系统优势 -- 性能强、稳定性、扩展性、安全性

为什么要学Linux -- 市场占有率、成本(开源)、可定制性(模块化,微内核设计)、活跃的社区、更新迭代快

(2)unix、linux、gnu

Linux之父、自由软件基金会

(3)云计算和Linux

1、主流云操作系统都是liunx(centos、ubuntu等)

2、kvm、docker、k8s底层依赖Linux内核功能

2、Linux发布版本

内核 -- 简单的功能,二次开发,衍生出不同的版本。

桌面版本 - - ubuntu、fedora、

服务器版本-- redhat、centos、欧拉

国产操作系统-- 麒麟、统信

redhat 和 centos的关系

CentOS 并非被红帽 “收购”,而是红帽对其发展方向进行了调整。红帽在 2014 年收购了 CentOS 项目背后的主要支持公司,但这和常规意义上的收购不同,当时红帽是希望加强对 CentOS 社区的支持。后来在 2019 年,红帽宣布调整 CentOS 的发展方向,计划将 CentOS 从 RHEL(Red Hat Enterprise Linux)的下游重建版本,转变为 RHEL 的上游测试版本,即 CentOS Stream, 并于 2021 年 12 月 31 日停止对 CentOS 8 的维护,CentOS 7 的维护也在 2024 年 6 月 30 日结束 。这一决策引发了社区的强烈反响,许多依赖 CentOS 的企业和用户不得不寻找新的替代发行版,如 Rocky Linux、AlmaLinux 等,它们旨在延续 CentOS 原有的定位,成为 RHEL 的下游重建版本,提供免费、稳定且兼容 RHEL 的 Linux 发行版 。

3、vmware workstation软件使用

vmtools:实现虚拟机与宿主机之间的文件共享、鼠标无缝切换、屏幕分辨率自动调整等功能,并提升网络和磁盘 I/O 性能

  • 快照:存档
  • 克隆:复制、链接克隆和完整克隆
  • 网络配置:桥接、NAT、主机

4、centos7 系统安装

语言选择--- 初学选择中文,生产环境使用英文

分区--- 初学选择自动分区

账户--- 初学可以使用root账户,生产环境不建议使用

安装包---根据实际情况选择是否安装图形界面GUI

5、远程连接工具使用

putty --- 轻量级

xshell --- 功能丰富,只支持windows系统

secureCRT --- 扩平台,商业版本

连接之前准备工作:

1、关闭防火墙

 #systemctl stop firewalld
 禁止防火墙开机启动
 #systemctl disable firewalld

2、设置SELinux

 #setenforce 0

3、查看IP地址

 #ip a

4、重启网络服务(可选)

 #systemctl stop NetworkManager
 #systemctl disable NetworkManager
 #systemctl restart network

6、终端介绍

 [root@localhost ~]# pwd
 /root

用户名、主机名、当前目录、用户身份(root还是普通)

7、命令格式和帮助

命令格式

 #命令名称 [选项] [参数]
 选项 --- 定义命令的行为(-l list 显示详细信息, -a 全部)
 参数 --- 定义命令操作的对象(文件名、目录名、IP地址等)

命令帮助

help参数:简单描述,方便快捷

 命令名称  --help

man命令:完整命令手册,最常用

man 命令名称

info命令:最详细,树形结构

info 命令名称

help命令:只用于shell内置命令

help 命令名称

8、查看系统信息命令

uname、hostname、ifconfig、free

uname查看系统信息

查看系统信息

uname -a 查看详细系统信息(主机名、内核版本、发行时间、硬件架构)
uname -s 查看内核名称(默认)
uname -r 查看内核版本
uname -n 查看主机名
uname -m 查看硬件架构

whoami

查看当前用户名

hostname

主机名:设备在网络中的标识,用于网络通信、系统识别等

命令:

hostnamehostnamectl
查看主机名查看主机名,输出内容更详细
设置临时主机名,重启失效设置临时、永久、灵活主机名
独立命令,不依赖服务依赖systemd服务

设置当前临时主机名是test(2种方式)

hostname test
hostnamectl --transient set-hostname test --transient

设置当前永久主机名是woniu

hostnamectl  --static set-hostname woniu

--static也可以省略不写

ifconfig查看和临时设置ip地址

查看和临时设置ip地址

free查看内存信息

查看内存信息

free -h

lscpu查看cpu信息

查看cpu信息

df查看磁盘信息

查看磁盘信息

df -h 

lspci

查看显卡信息

9、关机重启命令

shutdown、poweroff、halt、reboot

必须具备管理员权限

shutdown

#立刻关机
shutdown -h now
#5分钟后关机
shutdown -h +5 "5分钟后关机"
#取消计划关机
shutdown -c
#重启
shutdown -r

poweroff立刻关机断电

立刻关机断电,等同于shutdown -h now

halt关闭系统但不强制断电

关闭系统但不强制断电

reboot

等同于shutdown -r now

10、文件系统

Linux系统和Windows系统中文件系统存在多方面区别。Linux采用树形结构,以根目录“/”为起点,统一管理文件和目录,支持多种文件系统类型,如ext4、Btrfs等,具有灵活的权限控制和丰富的命令行工具,性能上在处理大文件和大量并发I/O请求时表现较好,安全性较高,但易用性相对较差,学习曲线较陡。

Windows基于盘符组织文件,每个分区独立,主要使用NTFS和FAT文件系统,提供基于访问控制列表的权限管理,依赖图形用户界面进行操作,文件管理直观方便,易于上手,但在处理大文件和大量并发I/O请求时性能稍逊,且因广泛使用而成为更多攻击目标。

  • 树形结构 根目录/ 挂载
  • 一切皆文件磁盘文件/dev/sda1
  • 文件目录FHS标准--文件系统层次标准,描述Unix类系统布局规范的参考标准ls /bin:存放所有用户都可以使用的命令的二进制文件sbin:存放管理员可以使用的命令dev:设备文件目录(磁盘、键盘、鼠标)home:普通用户家目录,保存用户数据root:管理员家目录tmp:临时文件目录var:存放系统运行过程中变化的数据(如日志)etc:配置文件目录boot:系统启动文件目录lib:系统调用的函数库保存目录media:挂载目录,光盘文件opt:第三方软件安排目录usr:存放系统软件,类似于windows系统的program files

11、查看与切换目录

pwd、cd、ls、du等

pwd

显示当前目录

[root@test01 ~]# pwd
/root

cd

切换目录

cd 绝对路径或相对路径

绝对路径和相对路径

#绝对路径
cd /etc
#相对路径
cd ./local
cd ../dev
cd ../../opt
#切换到上一次目录,在2个目录之间快速切换
cd -
#切换到用户家目录
cd ~

ls

列出目录内容

格式

ls [选项] [目录]

用法

#-l  列出详细信息
[root@test01 /]# ls -l
总用量 20
lrwxrwxrwx. 1 root root 7 5月 25 06:42 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 5月 25 06:49 boot
drwxr-xr-x. 20 root root 3340 5月 25 07:27 dev

#-h 可读格式
[root@test01 /]# ls -lh
总用量 20K
lrwxrwxrwx. 1 root root 7 5月 25 06:42 bin -> usr/bin
dr-xr-xr-x. 5 root root 4.0K 5月 25 06:49 boot
drwxr-xr-x. 20 root root 3.3K 5月 25 07:27 dev

#-a 显示所有文件,包含隐藏文件(以.开头的文件)
[root@test01 /]# ls -al
总用量 20
dr-xr-xr-x. 17 root root 224 5月 25 06:48 .
dr-xr-xr-x. 17 root root 224 5月 25 06:48 ..
lrwxrwxrwx. 1 root root 7 5月 25 06:42 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 5月 25 06:49 boot

#-d 查看目录属性
[root@test01 /]# ls -dl /tmp/
drwxrwxrwt. 21 root root 4096 5月 25 11:16 /tmp/

#-R 递归显示子目录
[root@test01 opt]# ls -R /opt/
/opt/:
rh

/opt/rh:

#-t 按时间排序,最新修改的文件在前边
[root@test01 opt]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@test01 opt]# ls -t /
tmp root dev proc var opt lib64 bin media srv
etc run sys home boot usr sbin lib mnt

#-S 按文件大小排序,大的文件排在前边
[root@test01 opt]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@test01 opt]# ls -S /
etc tmp run root home lib64 bin media srv sys
boot dev var usr opt sbin lib mnt proc

du统计文件或目录大小

统计文件或目录大小

格式

du [选项] [文件或目录]

用法

#-h 可读格式
[root@test01 /]# du /etc/passwd
4 /etc/passwd
[root@test01 /]# du -h /etc/passwd
4.0K /etc/passwd

#-s 统计目录大小
[root@test01 /]# du -sh /etc/
38M /etc/

12、创建目录和文件

mkdir、touch、ln命令等

mkdir

创建目录

语法

mkdir [选项] 目录1,[目录2,目录3,目录4....]

用法

#创建单个目录
[root@test01 opt]# mkdir aaa
[root@test01 opt]# ls
aaa rh

#创建多个目录,2种方式
[root@test01 opt]# mkdir bbb ccc ddd
[root@test01 opt]# ls
aaa bbb ccc ddd rh
[root@test01 opt]# mkdir linux0{1,2,3}
[root@test01 opt]# ls
aaa bbb ccc ddd linux01 linux02 linux03 rh

#-p 创建多级目录
[root@test01 opt]# mkdir 01/02/03
mkdir: 无法创建目录"01/02/03": 没有那个文件或目录
[root@test01 opt]# mkdir -p 01/02/03
[root@test01 opt]# ls -R 01
01:
02

01/02:
03

01/02/03:

touch

创建文件

格式

touch [选项] 文件1[文件2,文件3,文件4....]

用法

#创建空文件
[root@test01 opt]# touch test.txt
[root@test01 opt]# ls
01 aaa bbb ccc ddd linux01 linux02 linux03 rh test.txt
[root@test01 opt]# ll -h test.txt
-rw-r--r--. 1 root root 0 5月 25 11:40 test.txt
#创建多个文件,2种形式
[root@test01 opt]# touch aaa.txt bbb.txt ccc.txt
[root@test01 opt]# ls
aaa.txt bbb.txt ccc.txt
[root@test01 opt]# touch test0{1,2,3}.txt
[root@test01 opt]# ls
aaa.txt bbb.txt ccc.txt test01.txt test02.txt test03.txt

ln创建文件链接,类似于windows的快捷方式

创建文件链接,类似于windows的快捷方式

语法

ln [选项] 源文件 目标链接

用法

[root@test01 opt]# echo "123" > test.txt
[root@test01 opt]# ls
test.txt
[root@test01 opt]# cat test.txt
123
#硬链接
[root@test01 opt]# ln test.txt test.txt.hard
#-s 软链接
[root@test01 opt]# ln -s test.txt test.txt.soft
[root@test01 opt]# ls
test.txt test.txt.hard test.txt.soft
[root@test01 opt]# cat test.txt.hard
123
[root@test01 opt]# cat test.txt.soft
123
[root@test01 opt]# rm -rf test.txt
[root@test01 opt]# ls
test.txt.hard test.txt.soft
[root@test01 opt]# cat test.txt.hard
123
[root@test01 opt]# cat test.txt.soft
cat: test.txt.soft: 没有那个文件或目录

13、复制、删除、移动目录和文件

cp、mv、rm等命令

cp

复制文件或目录

语法

cp [选项] 源文件/目录 目标路径

用法

#复制文件到指定目录
[root@test01 opt]# ls
test.txt.hard test.txt.soft
[root@test01 opt]# pwd
/opt
[root@test01 opt]# ls /mnt
[root@test01 opt]# cp test.txt.hard /mnt/
[root@test01 opt]# ls /mnt/
test.txt.hard

#复制并改名
[root@test01 opt]# cp test.txt.hard /mnt/test.txt.hard2
[root@test01 opt]# ls /mnt/
test.txt.hard test.txt.hard2

#-r 复制目录
[root@test01 opt]# mkdir -p aaa/bbb/ccc
[root@test01 opt]# ls
aaa test.txt.hard test.txt.soft
[root@test01 opt]# cp aaa /mnt/
cp: 略过目录"aaa"
[root@test01 opt]# cp -r aaa /mnt/
[root@test01 opt]# ls /mnt/
aaa test.txt.hard test.txt.hard2

#-p 复制元数据,文件名、文件类型、文件权限、文件创建时间、修改时间
[root@test01 opt]# ll
总用量 4
drwxr-xr-x. 3 root root 17 5月 25 12:07 aaa
-rw-r--r--. 1 root root 4 5月 25 11:53 test.txt.hard
lrwxrwxrwx. 1 root root 8 5月 25 11:54 test.txt.soft -> test.txt
[root@test01 opt]# cp test.txt.hard /mnt/
[root@test01 opt]# ll /mnt/
总用量 4
-rw-r--r--. 1 root root 4 5月 25 12:19 test.txt.hard
[root@test01 opt]# cp -p test.txt.hard /mnt/test.txt.hard2
[root@test01 opt]# ll /mnt/
总用量 8
-rw-r--r--. 1 root root 4 5月 25 12:19 test.txt.hard
-rw-r--r--. 1 root root 4 5月 25 11:53 test.txt.hard2

#-f 强制覆盖
[root@test01 opt]# cp -f test.txt.hard /mnt/
cp:是否覆盖"/mnt/test.txt.hard"? y
[root@test01 opt]# which cp
alias cp='cp -i'
/usr/bin/cp
[root@test01 opt]# /usr/bin/cp -f test.txt.hard /mnt/

#-i 提示覆盖
[root@test01 opt]# cp test.txt.hard /mnt/
cp:是否覆盖"/mnt/test.txt.hard"? y

#-v 显示进度
[root@test01 opt]# cp -v Fedora-Workstation-Live-42-1.1.x86_64.iso /mnt/
"Fedora-Workstation-Live-42-1.1.x86_64.iso" -> "/mnt/Fedora-Workstation-Live-42-1.1.x86_64.iso

mv rename

移动文件或目录、重命名

语法

mv [选项] 源文件或目录 目标路径

用法

#重命名文件或目录
[root@test01 opt]# ls
1.txt aaa Fedora-Workstation-Live-42-1.1.x86_64.iso
[root@test01 opt]# mv 1.txt 2.txt
[root@test01 opt]# mv aaa/ bbb
[root@test01 opt]# ls
2.txt bbb Fedora-Workstation-Live-42-1.1.x86_64.iso

#移动文件或目录
[root@test01 opt]# mv 2.txt bbb/ /mnt/
[root@test01 opt]# ls /opt/ /mnt/
/mnt/:
2.txt bbb

/opt/:
Fedora-Workstation-Live-42-1.1.x86_64.iso

#批量移动文件(通配符)
[root@test01 opt]# touch 0{1,2,3,4}.txt
[root@test01 opt]# ls
01.txt 02.txt 03.txt 04.txt Fedora-Workstation-Live-42-1.1.x86_64.iso
[root@test01 opt]# mv *.txt /mnt/
[root@test01 opt]# ls /mnt/
01.txt 02.txt 03.txt 04.txt 2.txt bbb

#-i 提示覆盖
[root@test01 opt]# ls /mnt/
01.txt 02.txt 03.txt 04.txt 2.txt bbb
[root@test01 opt]# touch 01.txt
[root@test01 opt]# mv 01.txt /mnt/
mv:是否覆盖"/mnt/01.txt"? y
[root@test01 opt]# which mv
alias mv='mv -i'
/usr/bin/mv

#-f 强制覆盖
#-v 显示进度

rm

删除文件或目录

该命令一定要慎重使用,删除后数据无法恢复

语法

rm [选项] 文件或目录

用法

#删除文件
[root@test01 mnt]# ls
01.txt 02.txt 03.txt 04.txt 2.txt bbb
[root@test01 mnt]# rm 01.txt
rm:是否删除普通空文件 "01.txt"?y

#删除目录
[root@test01 mnt]# rm bbb/
rm: 无法删除"bbb/": 是一个目录
[root@test01 mnt]# rm -r bbb/
rm:是否删除目录 "bbb/"?y

#强制删除
[root@test01 mnt]# ls
02.txt 03.txt 04.txt 2.txt
[root@test01 mnt]# rm -f 02.txt
[root@test01 mnt]# ls
03.txt 04.txt 2.txt

#批量删除
[root@test01 mnt]# rm *.txt
[root@test01 mnt]# rm ./*

千万不要使用的命令

rm -rf /*

14、查找目录和文件

which、find等命令

which

查看命令路径

语法

which [选项] 命令名称

用法

[root@test01 mnt]# which cp
alias cp='cp -i'
/usr/bin/cp

find 搜索文件

搜索文件

语法

find [搜索路径] [匹配条件] [执行动作]

-name按文件名称搜索

#-name 名称要完全匹配
find /etc -name "hosts" # 精确查找 /etc 目录下的 hosts 文件
#-iname 忽略大小写
find . -iname "*.jpg" # 在当前目录查找所有 .jpg 或 .JPG 文件
#配合正则表达式使用
find /var/log -regex ".*\.log$" # 查找 /var/log 目录下所有以 .log 结尾的文件

-type按文件类型搜索

文件类型:windows系统按照后缀名区分,Linux系统按照文件属性区分

Linux文件类型:- d b c s p l

d:表示是一个目录 -:表示这是一个普通的文件。 l: 表示这是一个符号链接文件 b:表示区块设备文件

c:字符设备文件 s:套接字文件

p:命名管道文件

[root@test01 opt]# ll
总用量 2342308
-rw-r--r--. 1 root root 0 5月 25 13:28 1.jpg
-rw-r--r--. 1 root root 0 5月 25 13:28 2.JPG
lrwxrwxrwx. 1 root root 5 5月 25 13:37 3.JPG -> 2.JPG
drwxr-xr-x. 2 root root 6 5月 25 13:36 aaa
[root@test01 opt]# ll /dev/sda1
brw-rw----. 1 root disk 8, 1 5月 25 07:27 /dev/sda1
[root@test01 opt]# ll /dev/tty1
crw--w----. 1 root tty 4, 1 5月 25 07:27 /dev/tty1
[root@test01 opt]# ll /run/chrony/chronyd.sock
srwxr-xr-x. 1 chrony chrony 0 5月 25 07:27 /run/chrony/chronyd.sock
[root@test01 opt]# ll /run/dmeventd-client
prw-------. 1 root root 0 5月 25 07:27 /run/dmeventd-client

选项:- type 文件类型

[root@test01 opt]# find / -type s
/dev/log
/run/gssproxy.sock
/run/vmware/guestServicePipe

-size按文件大小搜索

find / -size +1G  # 查找根目录下大于 1GB 的文件
find /tmp -size -10k # 查找 /tmp 目录下小于 10KB 的文件

按文件时间搜索mtime、atime、ctime

#mtime n 修改时间(文件内容修改)为 n 天前的文件
#atime n 访问时间(文件被读取)为 n 天前的文件
#ctime n 状态时间(文件权限、所有者等元数据修改)为 n 天前的文件
find /var/log -mtime -1 # 查找 /var/log 目录下 24 小时内修改过的文件
find ~ -atime +30 # 查找用户家目录下 30 天内未被访问的文件

-perm按文件权限搜索

find / -perm 777  # 查找全权限(777)的文件或目录(安全风险)
find . -perm -600 # 查找至少有 600 权限(所有者可读写)的文件

针对搜索内容执行动作

find /var/log -name "*.log" -exec rm -f {} \;  # 删除 /var/log 目录下的所有 .log 文件
find . -type f -size +100M -ok ls -lh {} \; # 对大于 100MB 的文件执行 ls -lh,执行前提示确认
find /tmp -atime +30 -delete # 删除 /tmp 目录下 30 天未访问的文件

组合条件

find /tmp -type f -and -size +10M  # 查找 /tmp 目录下大于 10MB 的文件
find . -name "*.txt" -or -name "*.md" # 查找当前目录下的 .txt 或 .md 文件
find /home -not -user root # 查找 /home 目录下非 root 用户的文件

2.基础命令

1.1 cat查看文件内容

  • 语法

cat [选项] [文件1] [文件2]

  • 用法1查看文件内容

#查看文件内容
[root@test01 opt]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

  • 用法2 -n显示行号

#-n 显示行号
[root@test01 opt]# cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

  • 用法3 输出文件内容到新文件

#输出文件内容到新文件
[root@test01 opt]# cat 1.txt
123
[root@test01 opt]# cat 1.txt > 2.txt
[root@test01 opt]# cat 2.txt
123

  • 用法4 合并多个文件内容到新文件

#合并多个文件内容到新文件
[root@test01 opt]# cat 1.txt
123
[root@test01 opt]# cat 2.txt
456
[root@test01 opt]# cat 1.txt 2.txt > 3.txt
[root@test01 opt]# cat 3.txt
123
456

1.2 more分页显示文件内容

  • 语法

more [选项] 文件名

  • 操作按键

按键操作
空格下一页
enter下一 行
b后退一页
q退出
/关键字向下搜索关键字
n搜索关键字后继续查找下一个匹配项

  • 指定每页行数

#指定每页行数
[root@test01 opt]# more -10 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
--More--(17%)

1.3 less分页显示文件内容

相对于more,功能更强大,前后分页,高亮,资源占用更少,适合大文件查看。

  • 语法

less [选项]  文件名

  • 操作按键

按键操作
backspace/pageup上一页
空格/pagedown下一页
enter下一 行
q退出
/关键字向下搜索关键字
?关键字向上搜索关键字
n搜索关键字后继续查找下一个配置项
N搜索关键字后向上查找配置项

  • -N 显示行号

#-N 显示行号
less -N /etc/ssh/sshd_config # 显示行号,方便定位配置项

  • -i 搜索关键字忽略大小写

#-i 搜索关键字忽略大小写
less -i syslog.log # 进入后输入 `/error` 搜索,不区分 "ERROR" 和 "error"

1.4 head 查看文件前几行内容,默认显示前10行

  • 语法

head [选项] 文件名

  • 用法 -n 显示前n行

#-n 数字
head -n 5 /etc/passwd # 显示 passwd 文件的前 5 行

1.5 tail 查看文件末尾内容,特别适合监控日志文件

  • 语法

tail [选项] 文件名    -- 不加选项默认显示10行

  • -n 查看最后n行数据

#-n 数字
tail -n 20 access.log # 显示日志文件的最后 20 行

  • -f 实时监控

#-f 实时监控
tail -f /var/log/syslog # 实时显示系统日志的新增内容(按 Ctrl+C 退出)

1.6 wc 统计文件的行数、单词数、字节数

  • 语法:

wc [选项] 文件名

  • 默认输出行数、单词数、字节数

#默认输出
[root@test01 opt]# wc /etc/passwd
43 87 2262 /etc/passwd
行数(lines)、单词数(words)、字节数(bytes)

  • -l 统计行数

#-l 统计行数
[root@test01 opt]# wc -l /etc/passwd
43 /etc/passwd

  • -w 统计单词数

#-w 统计单词数
[root@test01 opt]# wc -w /etc/passwd
87 /etc/passwd

  • -c 统计多个文件

#-c 统计字符数
[root@test01 opt]# wc -c /etc/passwd
2262 /etc/passwd

  • 统计多个文件

#统计多个文件
[root@test01 opt]# wc -l /etc/passwd /etc/shadow
43 /etc/passwd
43 /etc/shadow
86 总用量

1.7 grep 文本搜索工具,根据条件输出指定行内容

  • 语法

grep [选项]  '搜索模式'  文件名

  • -v 反向查询 查询没有root的数据

[root@test01 opt]# grep -v 'root' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

  • -i 忽略大小写

1.8 w 查看系统运行信息

[root@localhost ~]# w
18:32:38 up 1:18, 1 user, load average: 0.00, 0.01, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.85.1 17:15 6.00s 0.03s 0.00s w

average: 0.00, 0.01, 0.01

0.00:一分钟内的负载情况

0.01:五分钟内的负载情况

0.01:十分钟内的负载情况

1.9 who显示当前登录系统的用户

[root@localhost ~]# who
root pts/0 2025-05-29 17:15 (192.168.85.1)

3.重定向和管道

(1)重定向>、>>

  • 重定向:输入、输出、错误
  • 覆盖:>
  • 追加:>>

(2)管道 |

  • | 管道:上一个命令的结果作为下一个命令的参数

4.vi编辑器

2.1编辑器三大模式(命令,编辑,末行)

  • 命令模式
  • 编辑模式或者输入模式
  • 末行模式

2.2 命令模式

  • vi默认进入就是命令模式
    • 此模式下退出不保存更改按:q!
    • 保存更改按:wq

命令操作
dd删除光标所在行
ndd删除光标所在行开始向下n行(包括光标所在行)
u撤销上一步操作
dG删除光标所在行到文本末尾
d1G删除光标
^光标到行首
$光标到行尾
x删除光标所在字符
1G光标到第一行
GG光标到最后一行
yy复制当前行
p向下粘贴
P向上粘贴
nyy复制多行
nGG表示跳转到第n行

2.3 输入模式

i当前光标前插入文本
I当前光标所在行行首插入文本
a当前光标后插入文本
A当前光标所在行行尾插入文本
o光标下一行创建新行插入文本
O光标上一行创建新行插入文本

按esc 退出输入模式,切换到命令模式

2.4 末行模式

按键操作
:命令模式切换到末行模式
% s/old/new/g全局替换 new替换old
% s/old/new/gc全局替换并继续
:1,10 s/old/new/g1-10行替换
:set nu设置行号
:set nonu取消设置行号

5.Linux用户和组管理

3.1用户管理

(1) Linux用户分类:

  • root用户 — administrator()
  • 普通用户
  • 系统用户 — 应用(ssh、ftp、apache、mysql) 不能用于登录

(2)/etc/passwd 存放用户账户文件

  • 存储用户账号信息,普通用户可读,root账户可写

[root@localhost opt]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
jcx:x:1000:1000::/home/jcx:/bin/bash

分为7个字段:

  • 用户名、密码、UID用户id、GID组id、账户说明、家目录、默认shell

(3) /etc/shadow 用户密码文件

[root@woniu opt]# cat /etc/shadow
root:$6$p/hdpDe8CHsvsgeW$1TVdqciNuAVMkiUkO2V8kru2YFZOxS6PcvH.EAIDJ8Ngsm/FzpTfJhMJsHGMdVn4nclZ2u/9i5mezEEBJA4JM/::0:99999:7:::

  • 共九列
  • 用户名、加密密码(哈希算法)、最后密码修改时间、密码最小使用天数、密码最大使用天数、密码过期前警告天数、密码过期后宽限时间、账号过期时间、保留字段
    • 第一列:用户名
    • 第二列:加密后的密码
    • 第三列:最后密码修改时间
    • 第四列:密码最小使用天数
    • 第五列:密码最大使用天数
    • 第七列:密码过期前警告天数
    • 第八列:账号过期时间
    • 第九列:保留字段

(4) useradd 添加用户

  • 语法

useradd [选项]  用户名

  • 示例

[root@woniu opt]# useradd test
变化:
1、/etc/passwd文件
[root@woniu opt]# tail -1 /etc/passwd
test:x:1001:1001::/home/test:/bin/bash
2、/etc/shadow文件。注意密码处是!!,表示账号被禁用
[root@woniu opt]# tail -1 /etc/shadow
test:!!:20235:0:99999:7:::
3、家目录
[root@woniu opt]# ls /home/
test woniu

  • -u选项 创建用户指定UID

[root@woniu opt]# useradd -u 2000 woniu2
#默认情况下,创建用户,用户ID和组ID一致
[root@woniu opt]# tail -1 /etc/passwd
woniu2:x:2000:2000::/home/woniu2:/bin/bash

  • -d选项 创建用户指定家目录

[root@woniu opt]# useradd -u 3000 -d /opt/woniu3  woniu3
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@woniu opt]# tail -1 /etc/passwd
woniu3:x:3000:3000::/opt/woniu3:/bin/bash

  • -s 选项 设置默认shell,可以让用户默认不登录

[root@woniu opt]# useradd -s /sbin/nologin woniu5

WARNING! The remote SSH server rejected X11 forwarding request.
This account is currently not available.

Connection closed.

Disconnected from remote host(woniu5) at 15:47:55.

/sbin/nologin表示软件使用的默认shell

  • -G选项 指定用户组

useradd -m -d /home/dev/alice -s /bin/bash -G developers alice

(5)passwd设置用户密码

  • passwd

语法
passwd [用户名]

[root@woniu opt]# passwd test
Changing password for user test.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
密码文件变化
[root@woniu opt]# tail -1 /etc/shadow
test:$6$jHJT0U3T$BFa4/r6uCHhbrnTwakz2.a5pmDPwIzt3.d92be1300uzgvZtZYmv2ew56YS/RSQ6luDVzbBarQVthDEvPnsoG.:20235:0:99999:7:::

  • -l lock 锁定账户

[root@woniu opt]# passwd -l woniu
Locking password for user woniu.
passwd: Success

  • -u unlock 解锁账户

[root@woniu opt]# passwd  -u  woniu
Unlocking password for user woniu.
passwd: Success

  • -e 强制修改密码

[root@woniu opt]# passwd -e woniu
Expiring password for user woniu.
passwd: Success

WARNING! The remote SSH server rejected X11 forwarding request.
You are required to change your password immediately (root enforced)
Last login: Tue May 27 16:02:33 2025 from 192.168.200.1
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user woniu.
Changing password for woniu.
(current) UNIX password:
New password:
BAD PASSWORD: The password is shorter than 8 characters
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

  • -d 设置空密码

[root@woniu opt]# passwd -d woniu
Removing password for user woniu.
passwd: Success

(6)usermod修改用户

  • usermod -u 修改UID

[root@woniu opt]# usermod -u 1500  woniu2
[root@woniu opt]# grep woniu2 /etc/passwd
woniu2:x:1500:2000::/home/woniu2:/bin/bash

  • -e 指定账户失效时间

[root@woniu opt]# grep woniu2 /etc/shadow
woniu2:!!:20235:0:99999:7:::
[root@woniu opt]# usermod -e 2030-1-1 woniu2
[root@woniu opt]# grep woniu2 /etc/shadow
woniu2:!!:20235:0:99999:7::21915:

  • -c 修改账户的信息(修改注释)

[root@woniu opt]# grep woniu2 /etc/passwd
woniu2:x:1500:2000::/home/woniu2:/bin/bash
[root@woniu opt]# usermod -c "wuhan" woniu2
[root@woniu opt]# grep woniu2 /etc/passwd
woniu2:x:1500:2000:wuhan:/home/woniu2:/bin/bash

  • -L 锁定用户

[root@woniu opt]# usermod -L woniu5

  • -U 解锁用户

[root@woniu opt]# usermod -U  woniu5

(7)userdel删除用户

  • -r 家目录一起删除

[root@woniu opt]# userdel woniu2
[root@woniu opt]# userdel -r woniu5
[root@woniu opt]# ls /home/
test woniu woniu2

3.2 用户组管理

(1)groupadd组添加

[root@woniu opt]# groupadd whgroup

  • -g 指定GID

groupadd -g 5001 

(2) /etc/group 存放用户组文件

whgroup:x:3001:woniu3
组名:密码:组ID:组成员

(3) /etc/gshadow 存放用户组密码文件

[root@woniu opt]# tail /etc/gshadow
whgroup:!::woniu3
组名:没有密码:管理员:组成员

(4) gpasswd 组管理

  • -a 添加用户到指定组

#添加用户到指定的组
[root@woniu opt]# gpasswd -a woniu3 whgroup
Adding user woniu3 to group whgroup

  • -d 从组中移除用户

[root@woniu opt]# tail -1 /etc/group
whgroup:x:3001:woniu3
[root@woniu opt]# gpasswd -d woniu3 whgroup
Removing user woniu3 from group whgroup
[root@woniu opt]# tail -1 /etc/group
whgroup:x:3001:

  • -M 添加多个用户到指定组 属于覆盖之前的用户

[root@woniu opt]# gpasswd -M woniu,test,woniu3 whgroup
[root@woniu opt]# tail -1 /etc/group
whgroup:x:3001:woniu,test,woniu3

  • -A 指定组管理员

[root@woniu opt]# tail -1 /etc/gshadow
whgroup:!::woniu,test,woniu3
[root@woniu opt]# gpasswd -A test whgroup
[root@woniu opt]# tail -1 /etc/gshadow
whgroup:!:test:woniu,test,woniu3

(5) groupmod组修改

  • -g 更改组ID

[root@woniu opt]# tail -1  /etc/group
whgroup:x:3001:woniu,test,woniu3
[root@woniu opt]# groupmod -g 6000 whgroup
[root@woniu opt]# tail -1 /etc/group
whgroup:x:6000:woniu,test,woniu3

  • -n 更改组名

[root@woniu opt]# tail -1  /etc/group
whgroup:x:6000:woniu,test,woniu3
[root@woniu opt]# groupmod -n hbgroup whgroup
[root@woniu opt]# tail -1 /etc/group
hbgroup:x:6000:woniu,test,woniu3

(6)groupdel组删除

  • 主要组和附加组
  • 如果组是普通组,可以直接删除

[root@woniu opt]# tail -1  /etc/group
hbgroup:x:6000:woniu,test,woniu3
[root@woniu opt]# groupdel hbgroup

  • 如果是主要组,无法删除,必须把用户转移出去

[root@woniu opt]# groupdel woniu
groupdel: cannot remove the primary group of user 'woniu'

3.3 用户和组相关命令

(1) id

[root@woniu opt]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@woniu opt]# id woniu
uid=1000(woniu) gid=1000(woniu) groups=1000(woniu)

(2)groups 查看用户所属的组(主要组和附加组)

[root@woniu opt]# groups
root
[root@woniu opt]# groups woniu
woniu : woniu

(3) finger

#查看当前用户信息
finger # 示例输出(长格式)
Login: alice Name: Alice Smith
Directory: /home/alice Shell: /bin/bash
On since Mon May 25 09:30 (CST) on tty7 from :0
2 days 10 hours 42 minutes idle
Mail last read Tue May 26 15:23 2025 (CST)
No Plan.

#查看其他用户信息
finger root # 示例输出
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Mon May 25 09:00 (CST) on pts/0
No mail.
No Plan.

(4) users 查看当前登录的用户

[root@woniu opt]# users
root root

6.文件权限

4.1 权限的概念

  • 权限 -- 对文件或目录的访问控制。
  • 权限类型

权限类型文件目录
可读(read --- r)查看文件内容执行列表操作,可以查看目录内的文件或子目录信息
可写(write --- w)编辑、删除重命名、移动、复制、删除、文件等
可执行(excute --- x)二进制文件进入目录

  • 权限作用的角色

u-- user文件所有者
g -- group文件所属组
o -- others其他用户

4.2 查看权限

(1)ls命令 ls -l

ls  -l
[root@woniu ~]# ls -l
-rw-r--r--. 1 root root 6 May 27 08:53 aaa.txt

(2)stat命令

[root@woniu ~]# stat aaa.txt
File: ‘aaa.txt’
Size: 6 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 100663419 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2025-05-27 08:53:52.276105601 +0800
Modify: 2025-05-27 08:53:48.237105418 +0800
Change: 2025-05-27 08:53:48.237105418 +0800

4.3设置权限chmod

  • chmod命令

(1)符号方式设置权限

r可读
w可写
x可执行

  • 设置方式

+添加权限
-撤销权限
=设置权限

  • 设置角色

u文件所有者
g文件所属组
o其他用户

[root@woniu opt]# chmod  o+w  aaa.txt
[root@woniu opt]# ll aaa.txt
[root@woniu opt]# chmod g=rwx aaa.txt
[root@woniu opt]# chmod u+x,o-w aaa.txt

(2)数字方式设置权限

  • 把权限类型转换成二进制

r4
w2
x1

文件初始状态
rw-r--r--
644
[root@woniu opt]# chmod 644 aaa.txt
[root@woniu opt]# ll aaa.txt
-rw-r--r--. 1 root root 11 May 28 11:18 aaa.txt

(3)权限验证

  • 可读

文件
[test@woniu opt]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[test@woniu opt]$ ll /etc/shadow
----------. 1 root root 863 May 28 10:12 /etc/shadow

目录
[test@woniu opt]$ ls aaa
bbb
[test@woniu opt]$ ls -R aaa
ls: cannot open directory aaa: Permission denied

  • 可写

文件 - 可编辑

目录 -- 没有写的情况下,无法重命名,也无法删除
[test@woniu aaa]$ mv bbb/ www
mv: cannot move ‘bbb/’ to ‘www’: Permission denied
[test@woniu aaa]$ rm -rf bbb/
rm: cannot remove ‘bbb/ccc’: Permission denied
可以重命名,可以删除
[root@woniu opt]# chmod 767 aaa
[root@woniu opt]# ll -d aaa
drwxrw-rwx. 3 root root 17 May 28 11:43 aaa
[test@woniu aaa]$ mv bbb/ www
[test@woniu aaa]$ rm -rf bbb/
[test@woniu aaa]$

  • 可执行

文件
[root@woniu opt]# ll /usr/bin/cp
-rwxr-xr-x. 1 root root 155264 Oct 31 2018 /usr/bin/cp
[root@woniu opt]# chmod o-x /usr/bin/cp
[root@woniu opt]# ll /usr/bin/cp
-rwxr-xr--. 1 root root 155264 Oct 31 2018 /usr/bin/cp
[test@woniu aaa]$ ls
www
[test@woniu aaa]$ cp -r www/ nnn
[test@woniu aaa]$ ls
nnn www
[test@woniu aaa]$ cp -r www/ nnn
-bash: /usr/bin/cp: Permission denied

目录
[root@woniu opt]# ll -d aaa
drwxrw-rwx. 4 root root 28 May 28 11:52 aaa
[root@woniu opt]# chmod o-x aaa
[root@woniu opt]# ll -d aaa
drwxrw-rw-. 4 root root 28 May 28 11:52 aaa
[test@woniu opt]$ cd aaa
[test@woniu aaa]$ cd -
/opt
[test@woniu opt]$ cd aaa
-bash: cd: aaa: Permission denied

4.4更改用户和组chown

  • chown命令 change owner

(1)改变文件所有者

[root@woniu opt]# ll aaa.txt
-rw-r--r--. 1 root root 11 May 28 11:18 aaa.txt
[root@woniu opt]# chown test aaa.txt
[root@woniu opt]# ll aaa.txt
-rw-r--r--. 1 test root 11 May 28 11:18 aaa.txt

(2)改变文件所属组

[root@woniu opt]# chown :whgroup  aaa.txt
[root@woniu opt]# ll aaa.txt
-rw-rw-r--. 1 root whgroup 11 May 28 11:18 aaa.txt

(3)同时改变文件的所有者和所属组

[root@woniu opt]# chown test:test2 aaa.txt
[root@woniu opt]# ll aaa.txt
-rw-rw-r--. 1 test test2 11 May 28 11:18 aaa.txt

(4)-R 递归

[root@woniu opt]# chown -R  test:test2 aaa.txt

4.5 特殊权限setUID、setGID、stickID

setUIDs:文件所有者有执行权限时 S:文件所有者无执行权限时针对x位
setGIDs:文件所属组有执行权限时 S:文件所属组无执行权限时针对x位
stickIDt:其他用户有执行权限时 T:其他用户无执行权限时针对x位

(1)setUID --- 让用户暂时拥有文件所有者的权限

[root@woniu opt]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@woniu opt]# chmod u-s /usr/bin/passwd
[root@woniu opt]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@woniu opt]# chmod 4755 /usr/bin/passwd
[root@woniu opt]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@woniu opt]# chmod 0755 /usr/bin/passwd
[root@woniu opt]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

(2)setGID -- 让用户暂时拥有文件所属组的权限

[root@woniu opt]# ll aaa.txt
-rw-rw-r--. 1 test test2 11 May 28 11:18 aaa.txt
[root@woniu opt]# chmod g+s aaa.txt
[root@woniu opt]# ll aaa.txt
-rw-rwSr--. 1 test test2 11 May 28 11:18 aaa.txt
[root@woniu opt]# chmod 0664 aaa.txt
[root@woniu opt]# ll aaa.txt
-rw-rw-r--. 1 test test2 11 May 28 11:18 aaa.txt
[root@woniu opt]# chmod 2664 aaa.txt
[root@woniu opt]# ll aaa.txt
-rw-rwSr--. 1 test test2 11 May 28 11:18 aaa.txt

(3)stickID -- 限制权限只能作用在文件所有者创建的文件

[root@woniu opt]# ll -d /tmp
drwxrwxrwt. 8 root root 180 May 28 13:05 /tmp
[root@woniu opt]# chmod o-t /tmp
[root@woniu opt]# ll -d /tmp
drwxrwxrwx. 8 root root 180 May 28 14:35 /tmp
[root@woniu opt]# chmod 1777 /tmp
[root@woniu opt]# ll -d /tmp
drwxrwxrwt. 8 root root 166 May 28 14:36 /tmp

4.6 umask设置文件或者目录的初始权限

  • 用于设置文件和目录默认权限的系统参数
  • 最大默认权限:

文件666

目录777

#临时修改
[root@woniu opt]# umask
0022

#永久修改,修改环境变量文件 系统全局环境文件 /etc/profile

7.软件安装

5.1软件的概念

  • windows系统: .exe .bin .bat
  • Linux系统: 二进制方式、源码方式
  • 二进制安装 --- rpm、deb

5.2 rpm安装

  • rpm --- redhat package manager
  • 名称定义:QQ_3.2.17_250521_x86_64_01.rpm
  • 命令:rpm

rpm  -ivh  软件包名称
-i install 安装
-v verbose 详细信息
-h 显示进度

#rpm安装要先解决依赖关系
[root@localhost opt]# rpm -ivh QQ_3.2.17_250521_x86_64_01.rpm
错误:依赖检测失败:
libXScrnSaver 被 linuxqq-3.2.17_35341-1.x86_64 需要

(1)查询

  • 查询所有rpm包rpm -qa

#查询所有rpm包
rpm -qa
#统计包的总数
rpm -qa | wc -l
#查询指定包
rpm -qa | grep -i 'firefox'

  • rpm -qi查询指定包的详细信息

[root@localhost opt]# rpm -qi firefox

  • rpm -ql查询软件的安装位置

[rootalocalhost opt]# rpm -ql firefox | more
/etc/firefox
/etc/firefox/pref
/usr/bin/firefox
/usr/lib64/firefox
/usr/lib64/firefox/LICENSE

  • rpm -qf 文件名称,查询的是文件所属的软件

[rootalocalhost opt]# rpm -qf /etc/firefox/
firefox-60.2.2-1.e17 centos.x86 64

  • rpm -qd 查询软件的帮助文件位置

[rootalocalhost opt]# rpm -qd firefox
/usr/lib64/firefox/LICENSE
/usr/share/man/man1/firefox.1.gz

(2)安装rpm -ivh

rpm  -ivh  软件包名称
-i install 安装
-v verbose 详细信息
-h 显示进度

(3)不考虑依赖关系 --nodeps

#不考虑依赖关系
[root@woniu opt]# rpm -ivh --nodeps QQ_3.2.17_250521_x86_64_01.rpm
Preparing... ################################# [100%]
Updating / installing...
1:linuxqq-3.2.17_35341-1 ################################# [100%]

(4)强制安装 --force

#强制安装
[root@woniu opt]# rpm -ivh --force QQ_3.2.17_250521_x86_64_01.rpm
error: Failed dependencies:
at-spi2-core is needed by linuxqq-3.2.17_35341-1.x86_64
gtk3 is needed by linuxqq-3.2.17_35341-1.x86_64
libXScrnSaver is needed by linuxqq-3.2.17_35341-1.x86_64
libXtst is needed by linuxqq-3.2.17_35341-1.x86_64
libnotify is needed by linuxqq-3.2.17_35341-1.x86_64
xdg-utils is needed by linuxqq-3.2.17_35341-1.x86_64

(5)更新 -U -F

-U
将系统中现有版本全部删除后再更新,强制更新
-F
必须是新的版本才能更新

(6)卸载 -e

rpm  -e 软件名称
[root@localhost ~]# rpm -e firefox
[root@localhost ~]# rpm -qa | grep -i firefox

5.3 YUM安装

  • yum解决rpm安装方式依赖包的问题,自动解决依赖关系。
  • 架构:C/S架构
  • 搭建方式:
    • 1、公网 阿里云、163、清华大学
    • 2、私有网络

(1)Linux yum目录

  • vi /etc/yum.repos.d/

[root@woniu firefox]# vi /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo epel.repo
CentOS-Base.repo.backup CentOS-Media.repo epel-testing.repo
CentOS-CR.repo CentOS-Sources.repo
CentOS-Debuginfo.repo CentOS-Vault.repo

(2)配置阿里yum源:

  • 备份

[root@woniu firefox]# cp -r /etc/yum.repos.d/  /opt/

  • 拷贝阿里配置文件

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

  • 重建缓存

[root@localhost opt]# yum clean all
[root@localhost opt]# yum makecache

  • 测试

#lrzsz软件可以实现windows系统和linux系统之间互相传递文件
[root@localhost opt]# yum install lrzsz
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 lrzsz-0.12.20-36.el7.x86_64 已安装并且是最新版本

#rz是将windows系统文件传递到Linux
[root@localhost opt]# rz
#sz是将Linux系统文件传递到windows
[root@localhost opt]# sz wps-office-12.1.0.17900-1.x86_64.rpm

(3)扩展源epel

  • epel --- extral package redhat-enterprise

[root@localhost yum.repos.d]# yum install epel-release  -y

(4)yum命令

1.列出所有软件包yum list

#列出所有软件包
[root@localhost yum.repos.d]# yum list | wc -l
25241

2.列出所有组安装包yum grouplist

#列出所有组安装包
[root@localhost yum.repos.d]# yum grouplist
已加载插件:fastestmirror, langpacks

3.列出仓库列表yum repolist

#列出仓库列表
[root@localhost yum.repos.d]# yum repolist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile

4.查询指定软件包yum search

#查询指定软件包
[root@localhost yum.repos.d]# yum search firefox
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com

5.查询软件包的详细信息yum info

#查询软件包的详细信息
[root@localhost yum.repos.d]# yum info sl
已加载插件:fastestmirror, langpacks
Loading mirror speeds from

6.查询包的依赖关系yum deplist

#查询包的依赖关系
[root@woniu yum.repos.d]# yum deplist firefox
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com

7.查询哪些包依赖我yum whatprovides

[root@woniu yum.repos.d]# yum whatprovides  firefox | more
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

8.安装yum install -y 软件名称

yum install  -y 软件名称
-y选项:默认确定

9.更新yum update -y 软件名称

yum update -y  软件名称
[root@localhost yum.repos.d]# yum update firefox
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: pubmirror1.math.uh.edu
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 firefox.x86_64.0.60.2.2-1.el7.centos 将被 升级
---> 软件包 firefox.x86_64.0.115.12.0-1.el7.centos 将被 更新

10. 删除yum remove -y 软件名称

yum  remove -y 软件名称
[root@localhost yum.repos.d]# yum remove firefox
已加载插件:fastestmirror, langpacks
正在解决依赖关系
--> 正在检查事务
---> 软件包 firefox.x86_64.0.115.12.0-1.el7.centos 将被 删除
--> 解决依赖关系完成

依赖关系解决 不删除依赖包

(5)私有仓库

  • 挂载光盘

mount /dev/cdrom /mnt
mount: /dev/sr0 is write-protected, mounting read-only

  • 服务器端准备仓库软件和依赖关系的文件

软件包的位置
[root@woniu yum.repos.d]# ls /mnt/Packages/ | wc -l
4022
依赖关系的文件
[root@woniu yum.repos.d]# ls /mnt/repodata/
276ebf1746f2994d58b786a62e58727962f4b633cac7b289b0ef18e80df7578e-other.xml.gz
2ff4471767c82fed8b27981c603e3dc9d6559ca69e162f5ca2bb53f2450c8b08-primary.sqlite.bz2
5504e9b031f0f2ee7e377b28b5cd0d4785a093acf37e86b4397611341540d7c1-other.sqlite.bz2
aced7d22b338fdf7c0a71ffcf32614e058f4422c42476d1f4b9e9364d567702f-c7-x86_64-comps.xml
bc140c8149fc43a5248fccff0daeef38182e49f6fe75d9b46db1206dc25a6c1c-c7-x86_64-comps.xml.gz
c4a7811896f3a65404455f3631907adaca3bb9bcd93acb6e476a9a7708abe8c7-filelists.sqlite.bz2
e005e92e5e4a30b46c189587e09bfdfdc30500df3f4479637d1a9c2a9798aa6e-filelists.xml.gz
f4267434952367b8ee0a241f62540b0778b74911e27241d09d60ccdb657ba1a2-primary.xml.gz
repomd.xml
TRANS.TBL

  • 客户端配置如何访问这个仓库第一步:备份

cp -r  /etc/yum.repos.d/*.repo  /opt

第二步:配置仓库文件

[root@woniu yum.repos.d]# vi CentOS-Base.repo

[base]
name=woniu #仓库名称
baseurl=file:///mnt #最重要,仓库地址(http,ftp,本地文件file://)
gpgcheck=0 #软件包校验。0表示关闭,1表示开启
enable=1 #启用该仓库

第三步:重建缓存

yum clean all
yum makecache

第四步:测试

#查看仓库列表
[root@woniu yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
base woniu 10,072
repolist: 10,072

#查看仓库软件数量
yum list | wc -l

第五步:安装apache

[root@woniu yum.repos.d]# yum install httpd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package httpd-2.4.6-88.el7.centos.x86_64 already installed and latest version
Nothing to do

第六步:启动apache服务

[root@woniu yum.repos.d]# systemctl start httpd
如果还是不能访问
关闭防火墙
[root@woniu yum.repos.d]# systemctl stop firewalld

第七步:测试

浏览器访问centos7系统IP地址

5.4源码安装

(1)tar命令

  • 对文件或目录进行打包,支持压缩。

-c  创建打包文件
-v 显示进度
-f 必须放在最后,后边接文件

#f后边接命名的打包文件,建议后缀名是tar
[root@localhost yum.repos.d]# tar cvf /opt/yum.tar /etc/yum.repos.d/
tar: 从成员名中删除开头的“/”
/etc/yum.repos.d/
/etc/yum.repos.d/CentOS-CR.repo
/etc/yum.repos.d/CentOS-Debuginfo.repo
/etc/yum.repos.d/CentOS-Media.repo
/etc/yum.repos.d/CentOS-Sources.repo
/etc/yum.repos.d/CentOS-Vault.repo
/etc/yum.repos.d/CentOS-fasttrack.repo
/etc/yum.repos.d/CentOS-Base.repo.backup
/etc/yum.repos.d/CentOS-Base.repo
/etc/yum.repos.d/epel-testing.repo
/etc/yum.repos.d/epel.repo

  • 打包并压缩

压缩方式:
gz --- z
bzip2 --- j
xz --- J
压缩比 xz > bzip2 > gz

使用gz压缩
tar czvf /opt/centos7.tar.gz /etc
使用bzip2压缩
tar cjvf /opt/centos7.tar.bz2 /etc
使用xz压缩
tar cJvf /opt/centos7.tar.xz /etc

对比压缩比
[root@localhost opt]# du -sh /var/ var.tar.gz var.tar.bz2
657M /var/
200M var.tar.gz
162M var.tar.bz2

  • 解包

x   --  解包
v -- 显示过程
f -- 接文件名称

解压到当前目录
[root@localhost opt]# tar xvf yum.tar

-C 解压到指定目录
[root@localhost opt]# tar xvf yum.tar -C /usr/

对于gz压缩的文件如何解压
tar xzvf var.tar.gz -C /usr/src

对于bz2压缩的文件如何解压
tar xjvf var.tar.bz2 -C /usr/src

对于xz压缩的文件如何解压
tar xJvf var.tar.xz -C /usr/src

  • 查看打包文件 -t选项

[root@localhost opt]# tar tvf yum.tar
drwxr-xr-x root/root 0 2025-05-29 10:15 etc/yum.repos.d/
-rw-r--r-- root/root 1309 2018-11-23 21:16 etc/yum.repos.d/CentOS-CR.repo
-rw-r--r-- root/root 649 2018-11-23 21:16 etc/yum.repos.d/CentOS-Debuginfo.repo

(2)源码安装步骤

1、获取安装软件 --- 源码(nginx、mysql)

官网下载

wget命令

2、解压 tar命令

3、生成makefile文件 ./configure 检查安装环境

4、编译 make命令

5、安装到指定位置 make install

nginx举例:

1、下载安装包

官网下载

[root@localhost opt]# yum install -y wget
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: repo.jing.rocks
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
正在解决依赖关系

wget是一个远程下载工具

[root@localhost opt]# wget http://nginx.org/download/nginx-1.22.0.tar.gz
--2025-05-29 15:04:25-- http://nginx.org/download/nginx-1.22.0.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:5c0:2601::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1073322 (1.0M) [application/octet-stream]
正在保存至: “nginx-1.22.0.tar.gz”

100%[====================================>] 1,073,322 106KB/s 用时 13s

2025-05-29 15:04:38 (82.3 KB/s) - 已保存 “nginx-1.22.0.tar.gz” [1073322/1073322])

2、解压软件包

[root@localhost opt]# tar xzvf nginx-1.22.0.tar.gz -C /usr/src/
nginx-1.22.0/
nginx-1.22.0/auto/
nginx-1.22.0/conf/
nginx-1.22.0/contrib/

3、安装编译器和库

#安装gcc编译器
[root@localhost nginx-1.22.0]# yum install gcc-c++
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: pubmirror1.math.uh.edu
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com

**PCRE(Perl Compatible Regular Expressions)** 是一套实现正则表达式的库,由 Philip Hazel 开发,因其兼容 Perl 的正则表达式语法而得名。它广泛应用于各种编程语言和工具中,用于文本匹配、搜索、替换等操作
[root@localhost nginx-1.22.0]# yum install -y pcre pcre-devel


zlib
**zlib** 是一个用于数据压缩和解压缩的开源库,由 Jean-loup Gailly 和 Mark Adler 开发。它提供了高效的无损数据压缩算法,广泛应用于各种软件和网络协议中。
[root@localhost nginx-1.22.0]# yum install -y zlib zlib-devel

OpenSSL
**OpenSSL** 是一个开源的密码学工具包,提供了 SSL/TLS 协议实现、加密算法库和证书管理功能。它广泛应用于网络通信、数据加密、身份验证等领域,是保障互联网安全的核心组件之一。
[root@localhost nginx-1.22.0]# yum install -y openssl openssl-devel

3、检查编译环境

[root@localhost opt]# cd /usr/src/nginx-1.22.0/
[root@localhost nginx-1.22.0]# ./configure --prefix=/usr/local

nginx path prefix: "/usr/local"
nginx binary file: "/usr/local/sbin/nginx"
nginx modules path: "/usr/local/modules"
nginx configuration prefix: "/usr/local/conf"
nginx configuration file: "/usr/local/conf/nginx.conf"
nginx pid file: "/usr/local/logs/nginx.pid"
nginx error log file: "/usr/local/logs/error.log"
nginx http access log file: "/usr/local/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"

#生成了Makefile文件
[root@localhost nginx-1.22.0]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README

第三步:

编译
make

第四步:

安装到指定路径
make install

三四步合并:

make  && make install 

测试:

如果启动了apache,要先把apache关掉
[root@localhost nginx-1.22.0]# systemctl stop httpd

再启动nginx
[root@localhost nginx-1.22.0]# /usr/local/sbin/nginx

访问首页
http://ip地址

image-20250529152511371

8.磁盘管理

6.1 磁盘概念

  • 作用:存储数据
  • 磁盘分类:
    • 机械磁盘 ---(希捷、西数) SATA接口
    • 固态磁盘 --- M.2接口 SATA接口

6.2 磁盘管理

[root@localhost dev]# ls /dev/sda
/dev/sda1
s --- 表示硬盘接口(SATA、SASI、SAS) h开头(接口IDE接口)
d --- disk
a --- 第一块磁盘
1 --- 第一个分区

(1)lsblk - list block 查看块设备文件

[root@localhost dev]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 47G 0 lvm /home
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 5G 0 part
sr0 11:0 1 4.3G 0 rom

字段说明:

NAME设备名称
MAJ:MIN主设备号和次设备号
RM是否可移动(removable),1表示可移动,0表示不可移动
SIZE设备大小
RO是否只读,1表示只读,0表示可读写
TYPE设备类型:disk(磁盘)、part(分区)、rom(只读存储)等
MOUNTPOINT挂载点

lsblk -f

显示文件系统信息。

(2)df命令

  • -h可读形式查看磁盘容量

以易读的格式显示磁盘空间大小,例如以 GB、MB 等单位显示,而不是默认的块大小。

-h可读形式查看磁盘容量
[root@localhost dev]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 12G 39G 23% /
devtmpfs 470M 0 470M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.3M 478M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 1014M 166M 849M 17% /boot
/dev/mapper/centos-home 47G 37M 47G 1% /home
tmpfs 98M 12K 98M 1% /run/user/42
tmpfs 98M 0 98M 0% /run/user/0

  • -T选项查看文件系统类型

显示文件系统的类型。

-T选项查看文件系统类型
[root@localhost dev]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 12G 39G 23% /
devtmpfs devtmpfs 470M 0 470M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 8.3M 478M 2% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 166M 849M 17% /boot
/dev/mapper/centos-home xfs 47G 37M 47G 1% /home
tmpfs tmpfs 98M 12K 98M 1% /run/user/42
tmpfs tmpfs 98M 0 98M 0% /run/user/0、

(3)fdisk命令

[root@localhost dev]# fdisk -l   # ---- 查看磁盘详细信息

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x12a90061

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux

6.3磁盘分区

  • 1 准备一块磁盘

虚拟机添加

  • 2 分区命令fdisk

fdisk  磁盘名称
进入交互模式分区
[root@localhost ~]# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x88157d21 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):

  • 3 创建分区

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-62914559,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-62914559,默认为 62914559):+5G
分区 1 已设置为 Linux 类型,大小设为 5 GiB

扩展分区
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e
分区号 (2-4,默认 2):
起始 扇区 (10487808-62914559,默认为 10487808):
将使用默认值 10487808

逻辑分区(先划分扩展分区,在扩展分区基础上划分逻辑分区)
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l
添加逻辑分区 5
起始 扇区 (10489856-62914559,默认为 10489856):
将使用默认值 10489856
Last 扇区, +扇区 or +size{K,M,G} (10489856-62914559,默认为 62914559):+2G
分区 5 已设置为 Linux 类型,大小设为 2 GiB

  • 4 删除分区

删除扩展分区后,逻辑分区也被删除

命令(输入 m 获取帮助):d
分区号 (1,2,5,默认 5):2
分区 2 已删除

命令(输入 m 获取帮助):p

磁盘 /dev/sdc:32.2 GB, 32212254720 字节,62914560 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x88157d21

设备 Boot Start End Blocks Id System
/dev/sdc1 2048 10487807 5242880 83 Linux

  • 5 保存分区表

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

磁盘信息同步(相当于不关机刷新)

[root@localhost ~]# partprobe 

查看分区

[root@localhost ~]# lsblk /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 30G 0 disk
├─sdc1 8:33 0 5G 0 part
└─sdc2 8:34 0 5G 0 part

  • 6 格式化分区

mkfs命令  -- 创建linux文件系统
[root@localhost ~]# mkfs -t xfs /dev/sdc1
meta-data=/dev/sdc1 isize=512 agcount=4, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

  • 7 挂载文件系统

[root@localhost ~]# mkdir /woniu
[root@localhost ~]# mount /dev/sdc1 /woniu/
[root@localhost ~]# cp /etc/passwd /woniu/
[root@localhost ~]# mkdir /woniu
[root@localhost ~]# mount /dev/sdc1 /woniu/
[root@localhost ~]# cp /etc/passwd /woniu/
[root@localhost ~]# umount /dev/sdc1
[root@localhost ~]# ls /woniu
[root@localhost ~]# mount /dev/sdc1 /woniu/
[root@localhost ~]# ls /woniu/
passwd

9.逻辑卷

1.自动挂载

1.1mount命令

  • 作用: 挂载文件系统, 分区、移动硬盘、U盘、光盘镜像等

语法:

mount  [选项]   设备名称    挂载点

选项:

-t选项
-o选项
-a选项
-l选项

案例:

挂载到指定位置

mount   /dev/sda1    /mnt

-t: 指定挂载的文件系统
[root@localhost ~]# mount -t ntfs-3g /dev/sdb2 /data/

-l:查看挂载信息
[root@localhost ~]# mount -l | tail -1
/dev/sdb2 on /data type xfs (ro,relatime,seclabel,attr2,inode64,noquota)

-o:指定操作 ro、rw、async、sync、
[root@localhost ~]# mount -o ro /dev/sdb2 /data/

-a:挂载/etc/fstab文件下的所有系统
[root@localhost ~]# mount -a
[root@localhost ~]# vim /etc/fstab
[root@localhost ~]# mount -a
mount: 挂载点 /woniuu 不存在

1.2 /etc/fstab文件

一共有5列:

dev/mapper/centos-root /                       xfs     defaults        0 0

dev/mapper/centos-root:设备名称
/: 挂载点
xfs:文件系统
defaults:默认权限 rw,relatime,seclabel,attr2,inode64,noquota
0: dump备份 0不备份,1备份
0: check 是否自检 1自检

如何修改

image-20250530102828566

挂载NTFS文件系统 — 挂载移动硬盘

1、下载ntfs-3g软件
[root@localhost ~]# wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz

2、源码安装
[root@localhost ~]# tar zxvf ntfs-3g_ntfsprogs-2017.3.23.tgz -C /usr/src/
[root@localhost nginx-1.22.0]# cd /usr/src/ntfs-3g_ntfsprogs-2017.3.23/
[root@localhost ntfs-3g_ntfsprogs-2017.3.23]# ./configure
[root@localhost ntfs-3g_ntfsprogs-2017.3.23]# make
[root@localhost ntfs-3g_ntfsprogs-2017.3.23]# make install

3、测试安装是否成功
[root@localhost ntfs-3g_ntfsprogs-2017.3.23]# ntfs-3g --version
ntfs-3g 2017.3.23 integrated FUSE 27

4、挂载NTFS文件系统
mount -t nfs-3g /dev/sdb1 /mnt

2、逻辑卷 (LVM)

作用:实现磁盘容量的动态管理。

硬件---磁盘

分区

数据

LVM

硬件 - - 磁盘 1 瓷盘 2

虚拟卷组 (磁盘1,磁盘2)

逻辑卷 (lv1,lv2)

数据

最小存储单元 - - PE, LE

物理卷 -- 实际存储数据的磁盘或者分区

卷组 -- 多个物理卷统一管理,当成整体的磁盘空间

逻辑卷 -- 是卷组分配出来的,和物理卷没有直接关系

逻辑卷的创建步骤

1、创建物理卷

[root@localhost ~]# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created.
[root@localhost ~]# pvcreate /dev/sde
Physical volume "/dev/sde" successfully created.

查看物理卷信息
[root@localhost ~]# pvscan
PV /dev/sda2 VG centos lvm2 [<99.00 GiB / 4.00 MiB free]
PV /dev/sde lvm2 [10.00 GiB]
PV /dev/sdd lvm2 [10.00 GiB]
Total: 3 [<119.00 GiB] / in use: 1 [<99.00 GiB] / in no VG: 2 [20.00 GiB]
[root@localhost ~]# pvdisplay /dev/sdd
"/dev/sdd" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdd
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 47y265-R2aj-217k-ap9e-wl1t-4fzW-o2gbSQ

2、创建卷组

vgcreate     v-- volume    g -=-- group
[root@localhost ~]# vgcreate woniu-vg /dev/sdd /dev/sde
Volume group "woniu-vg" successfully created
woniu-vg - 自定义卷组名称
/dev/sdd /dev/sde -- 要加入的物理卷名称,可以多个一起加入

查看vg信息
[root@localhost ~]# vgscan
Reading volume groups from cache.
Found volume group "woniu-vg" using metadata type lvm2
Found volume group "centos" using metadata type lvm2
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name woniu-vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 0 / 0
Free PE / Size 5118 / 19.99 GiB
VG UUID EqyatF-xLVe-3Fjt-WL6b-pTd4-lc3p-A0j2jj

新建一个卷组,名称为vg0,PEsize为8M,在卷组中创建一个名为lv02的逻辑卷,大小为50个PE,格式化为ext4,挂载在/mnt/lv01要求每次开机都生效。

pvcreate /dev/sdb2 vgcreate -s 8M vg0 /dev/sdb2 lvcreate -l 50 -n lv02 vg0 mkfs.ext4 /dev/vg0/lv02 mkdir /mnt/lv01 mount /dev/vg0/lv02 /mnt/lv01 vim /etc/fstab /dev/vg0/lv02 /mnt/lv01 ext4 defaults 0 2 mount -a

3、创建逻辑卷lv logic volume

lvcreate
[root@localhost ~]# lvcreate -n woniu-lv1 -L 2G woniu-vg
Logical volume "woniu-lv1" created.
[root@localhost ~]# lvcreate -n woniu-lv2 -l 1000 woniu-vg
Logical volume "woniu-lv2" created.
[root@localhost ~]# lvdisplay /dev/woniu-vg/woniu-lv1
--- Logical volume ---
LV Path /dev/woniu-vg/woniu-lv1
LV Name woniu-lv1
VG Name woniu-vg
LV UUID kOMeMh-em2W-wQPg-DCfa-1lF5-XLOi-CvM4Vq
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2025-05-30 11:35:20 +0800
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3

lvcreate -n woniu-lv2 -l 1000 woniu-vg

大小为1000个PE

4、格式化指定文件系统

[root@localhost ~]# mkfs.xfs /dev/woniu-vg/woniu-lv1
meta-data=/dev/woniu-vg/woniu-lv1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

5、挂载

[root@localhost ~]# mkdir /woniu-lv1
[root@localhost ~]# mount /dev/woniu-vg/woniu-lv1 /woniu-lv1/

6、测试

[root@localhost ~]# cp  /etc/passwd   /woniu-lv1

7、扩容

#卷组
[root@localhost ~]# pvcreate /dev/sdc5
Physical volume "/dev/sdc5" successfully created.
[root@localhost ~]# vgextend woniu-vg /dev/sdc5
Volume group "woniu-vg" successfully extended
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name woniu-vg
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size <25.99 GiB
PE Size 4.00 MiB
Total PE 6653
Alloc PE / Size 1512 / <5.91 GiB
Free PE / Size 5141 / 20.08 GiB
VG UUID EqyatF-xLVe-3Fjt-WL6b-pTd4-lc3p-A0j2jj


#逻辑卷
[root@localhost ~]# lvextend -L +10G /dev/woniu-vg/woniu-lv1
Size of logical volume woniu-vg/woniu-lv1 changed from 2.00 GiB (512 extents) to 12.00 GiB (3072 extents).
Logical volume woniu-vg/woniu-lv1 successfully resized.

#xfs文件系统扩容,后边接的是挂载点
用于调整 XFS 文件系统的大小,使其能够利用逻辑卷中新增的磁盘空间
[root@localhost ~]# xfs_growfs /woniu-lv1
meta-data=/dev/mapper/woniu--vg-woniu--lv1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 524288 to 3145728


#resize2fs只能针对ext4文件系统进行扩容
用于调整 ext2/ext3/ext4 文件系统的大小,使其能够利用逻辑卷中新增的磁盘空间。
[root@localhost ~]# resize2fs /dev/woniu-vg/woniu-lv3
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/woniu-vg/woniu-lv3 is mounted on /woniu-lv3; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/woniu-vg/woniu-lv3 is now 2097152 blocks long.

验证:
[root@localhost ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 12G 39G 24% /
devtmpfs devtmpfs 470M 0 470M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 8.4M 478M 2% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sdc1 xfs 5.0G 33M 5.0G 1% /woniu
/dev/sda1 xfs 1014M 166M 849M 17% /boot
/dev/mapper/centos-home xfs 47G 37M 47G 1% /home
tmpfs tmpfs 98M 12K 98M 1% /run/user/42
/dev/mapper/woniu--vg-woniu--lv1 xfs 2.0G 33M 2.0G 2% /woniu-lv1
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/woniu--vg-woniu--lv3 ext4 7.9G 14M 7.5G 1% /woniu-lv3

8、查看卷组中物理卷详细信息

[root@localhost ~]# vgdisplay -v woniu-vg
--- Physical volumes ---
PV Name /dev/sdd
PV UUID 47y265-R2aj-217k-ap9e-wl1t-4fzW-o2gbSQ
PV Status allocatable
Total PE / Free PE 2559 / 0

PV Name /dev/sde
PV UUID iombAl-bXwF-hN7I-Ant2-4gb4-LZgw-TGTaxl
PV Status allocatable
Total PE / Free PE 2559 / 0

PV Name /dev/sdc5
PV UUID ReZTcN-O3FG-rZMD-e4EL-qcTl-ZNnU-SxzvL4
PV Status allocatable
Total PE / Free PE 1535 / 533

9、移除操作

#从卷组中删除指定的物理卷
[root@localhost ~]# vgreduce woniu-vg /dev/sdc5
Physical volume "/dev/sdc5" still in use
提升该物理卷正被使用

[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 47G 0 lvm /home
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part
└─sdb2 8:18 0 5G 0 part
sdc 8:32 0 30G 0 disk
├─sdc1 8:33 0 5G 0 part /woniu
├─sdc2 8:34 0 5G 0 part
├─sdc3 8:35 0 512B 0 part
└─sdc5 8:37 0 6G 0 part
└─woniu--vg-woniu--lv3 253:5 0 8G 0 lvm /woniu-lv3
查询结果显示正被逻辑卷lv3使用

解决思路:
1、卸载逻辑卷lv3
[root@localhost ~]# umount /woniu-lv3
2、删除逻辑卷(数据要备份)
[root@localhost ~]# lvremove /dev/woniu-vg/woniu-lv3
Do you really want to remove active logical volume woniu-vg/woniu-lv3? [y/n]: y
Logical volume "woniu-lv3" successfully removed
3、移除物理卷
[root@localhost ~]# vgreduce woniu-vg /dev/sdc5
Removed "/dev/sdc5" from volume group "woniu-vg"
4、验证
[root@localhost ~]# vgdisplay -v woniu-vg

10.进程管理

程序是存储在磁盘上的静态代码文件,进程是程序运行时的动态实例(拥有独立资源),线程是进程内的最小执行单元(共享进程资源),一个进程可包含多个线程,三者体现了 “静态代码→动态运行→并发执行” 的层次关系。

交互关系示例

  1. 程序→进程
    • 用户双击 chrome.exe 时,操作系统创建一个 Chrome 进程,加载程序代码到内存并分配资源。

  2. 进程→线程
    • Chrome 进程启动后,自动创建多个线程:
      • 主线程:处理 UI 渲染和用户交互。
      • 网络线程:负责 HTTP 请求和资源下载。
      • 渲染线程:解析 HTML/CSS/JavaScript 并绘制页面。


  3. 多进程与多线程
    • 多进程:如 Chrome 浏览器为每个标签页创建独立进程,隔离崩溃风险。
    • 多线程:如 Python 的 threading 模块创建多个线程并行执行任务(受 GIL 限制)。

  • 程序是 “剧本”:定义了执行逻辑,但本身不会 “行动”。
  • 进程是 “舞台”:为程序运行提供独立环境,消耗系统资源。
  • 线程是 “演员”:在进程的舞台上并行表演,共享舞台资源但各自执行不同动作。

8.1 top

动态监控进程的变化

第一行
top - 15:38:42 up 4:15, 1 user, load average: 0.00, 0.01, 0.05

top:
表示这是一个top命令的输出。
14:30:00:
当前系统时间,格式为HH:MM:SS。
up 2 days, 12:34:
表示系统已经运行了2天12小时34分钟。这是系统自上次启动以来的运行时间。
2 users:
表示当前有2个用户登录到系统中。
load average: 0.12, 0.08, 0.05:
表示系统的平均负载。平均负载是系统在过去1分钟、5分钟和15分钟内的平均进程数。这些值越低,表示系统越空闲。具体来说:
0.12:过去1分钟内的平均负载。
0.08:过去5分钟内的平均负载。
0.05:过去15分钟内的平均负载。

第二行:进程数量
Tasks: 203 total, 1 running, 202 sleeping, 0 stopped, 0 zombie
运行:
休眠:默认
停止:
僵尸:

第三行:CPU状态
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
us --- 用户
sy -- 系统
ni -- 优先级
id -- idle 空闲百分比

第四行:内存状态 memory
KiB Mem : 995920 total, 168568 free, 375796 used, 451556 buff/cache

第五行:swap(交换分区)
KiB Swap: 2097148 total, 2097148 free, 0 used. 378160 avail Mem

第六行:
PID -- 进程ID
USER -- 进程所有者
PR/NI --- 优先级
%CPU -- cpu使用率 P
%MEM --- 内存使用率 M

修改进程执行的优先级:
r 根据PID修改优先级 -10 --- 10

image-20250530154630425

第三行

image-20240115175603214

内 容说 明
Cpu(s): 0.0 %us用户模式占用的 CPU 百分比
0.3%sy系统模式占用的 CPU 百分比
0.0%ni改变过优先级的用户进程占用的 CPU 百分比
99.7%ididle缩写,空闲 CPU 占用的 CPU 百分比
0.0%wa等待输入/输出的进程占用的 CPU 百分比
0.0%hi硬中断请求服务占用的 CPU 百分比
0.0%si软中断请求服务占用的 CPU 百分比
0.0%stst(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

具体进程情况分析

image-20240115190839383

PID进程的 ID。
USER该进程所属的用户。
PR优先级,数值越小优先级越高。
NI优先级,数值越小优先级越高。
VIRT该进程使用的虚拟内存的大小,单位为 KB。
RES该进程使用的物理内存的大小,单位为 KB。
SHR共享内存大小,单位为 KB。计算一个进程实际使用的内存 = 常驻内存(RES)- 共享内存(SHR)
S进程状态。其中S 表示睡眠,R 表示运行
%CPU该进程占用 CPU 的百分比。
%MEM该进程占用内存的百分比。
TIME+该进程共占用的 CPU 时间。
COMMAND进程名

8.2 ps

静态方式查看进程

ps aux    BSD表示方式
ps -ef systemV表示方式

ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户名 进程ID cpu使用率 内存使用率

ps -ef 可以看到PPID父进程ID PPID则是创建该进程的父进程的ID

[root@localhost opt]# ps aux | grep -i nginx
root 11917 0.0 0.0 39312 936 ? Ss 16:10 0:00 nginx: master process /usr/sbin/nginx
nginx 11918 0.0 0.1 41784 1932 ? S 16:10 0:00 nginx: worker process
nginx 11919 0.0 0.1 41784 1932 ? S 16:10 0:00 nginx: worker process
root 11924 0.0 0.1 112824 1000 pts/0 S+ 16:10 0:00 grep --color=auto -i nginx

pstree 树形显示进程

ps -ef

image-20240115193343663

UID该进程执行的用户ID
PID进程ID
PPID该进程的父级进程ID,如果找不到,则该进程就被称之为僵尸进程(Parent Process ID)
CCpu的占用率,其形式是百分数
STIME进程的启动时间
TTY终端设备,发起该进程的设备识别符号,如果显示“?”则表示该进程并不是由终端设备发起
TIME进程实际使用CPU的时间
CMD该进程的名称或者对应的路径

aux是BSD风格,大家可以理解为两种风格只是显示不同

image-20240115194222829

USER:该 process 属于哪个使用者账号
PID :该 process 的ID
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令

8.3 pstree

  • 需要下载

yum -y install psmisc

  • 以树状图的形式显示当前系统中进程的层次结构。它可以帮助你直观地了解进程之间的父子关系,这对于系统管理和故障排查非常有帮助

[root@localhost opt]# pstree | more
systemd-+-ModemManager---2*[{ModemManager}]
|-VGAuthService
|-2*[abrt-watch-log]
|-abrtd
|-accounts-daemon---2*[{accounts-daemon}]
|-alsactl
|-at-spi-bus-laun-+-dbus-daemon---{dbus-daemon}
| `-3*[{at-spi-bus-laun}]
|-at-spi2-registr---2*[{at-spi2-registr}]
|-atd
|-auditd-+-audispd-+-sedispatch

8.4 kill

根据PID杀

发送信号 默认是15,正常结束进程

9 - 强制杀掉进程

[root@localhost ~]# ps aux | grep -i yes
root 12259 88.0 0.0 108056 356 pts/0 R+ 16:32 0:22 yes
root 12269 0.0 0.0 112824 992 pts/1 S+ 16:32 0:00 grep --color=auto -i yes
[root@localhost ~]# kill 12259

8.5 killall

killall 程序名称

[root@localhost ~]# killall nginx
[root@localhost ~]# ps aux | grep -i nginx
root 12389 0.0 0.1 112824 1000 pts/1 S+ 16:38 0:00 grep --color=auto -i nginx

8.6 renice

临时修改进程的优先级

[root@localhost opt]# renice -n 10 -p 13000
-n 设置优先级
-p 进程ID

8.7 nice

临时修改程序优先级

-n可以省略

[root@localhost opt]# nice  -5  nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[root@localhost opt]# systemctl stop nginx
[root@localhost opt]# nice -5 nginx

开启程序设置优先级

11.计划任务

1、计划任务的概念

1.1 计划任务的作用

  • 定时执行任务 系统的备份、软件的更新
  • 集中利用资源,避开业务高峰期游戏更新、软件维护
  • 监控监控系统

1.2 计划任务的分类

  • 系统执行的计划任务 - -- 周期性的任务
  • 用户执行的计划任务 ---- 备份、执行脚本,一次性和周期性
  • 程序执行的计划任务 -- 监控(心跳机制)、apache、nginx

2、一次性计划任务

2.1 atd服务

[root@localhost u01]# systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2025-06-03 09:32:53 CST; 1h 8min ago
Main PID: 7041 (atd)
Tasks: 1
CGroup: /system.slice/atd.service
└─7041 /usr/sbin/atd -f

6月 03 09:32:53 localhost.localdomain systemd[1]: Started Job spooling...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost u01]# systemctl is-enabled atd
enabled

2.2 at命令

at  时间    ---- 进入交互式配置
使用ctrl + d结束
[root@localhost u01]# at 10:46
at> toucgh
at> touch /opt/at.txt
at> <EOT>
job 18 at Tue Jun 3 10:46:00 2025

-f选项 非交互式,后边一般接一个shell脚本

-l选项 显示我们未执行的计划任务 等同于atq命令
[root@localhost u01]# at -l
19 Tue Jun 3 10:55:00 2025 a root
[root@localhost u01]# atq
19 Tue Jun 3 10:55:00 2025 a root

-d选项 删除未执行的计划任务 等同于atrm命令
[root@localhost u01]# at -l
19 Tue Jun 3 10:55:00 2025 a root
20 Tue Jun 3 10:59:00 2025 a root
[root@localhost u01]# at -d 19
[root@localhost u01]# at -l
20 Tue Jun 3 10:59:00 2025 a root
[root@localhost u01]# atrm 20
[root@localhost u01]# at -l

2.3 at中的时间

#绝对时间

#AM表示上午,PM表示下午
[root@localhost u01]# at 11:00AM
at> ls /etc/shadow
at> <EOT>
job 21 at Tue Jun 3 11:00:00 2025
[root@localhost u01]# at 22:00PM
Hour too large for PM. Last token seen: PM
Garbled time

# midnight、noon、tealight
[root@localhost u01]# at midnight
at> ls /etc
at> <EOT>
job 22 at Wed Jun 4 00:00:00 2025
[root@localhost u01]# atq
21 Tue Jun 3 11:00:00 2025 a root
22 Wed Jun 4 00:00:00 2025 a root
[root@localhost u01]# man at
[root@localhost u01]# at noon
at> ls /etc
at> <EOT>
job 23 at Tue Jun 3 12:00:00 2025
[root@localhost u01]# at -l
21 Tue Jun 3 11:00:00 2025 a root
22 Wed Jun 4 00:00:00 2025 a root
23 Tue Jun 3 12:00:00 2025 a root

#日期
[root@localhost u01]# at 12:00 20250604
Error in month number. Last token seen: 20250604
Garbled time
[root@localhost u01]# man at
[root@localhost u01]# at 12:00 06042025

#相对时间 now、today、tomorrow
[root@localhost u01]# at now + 5
syntax error. Last token seen: 5
Garbled time
[root@localhost u01]# at now + 5minutes
[root@localhost u01]# at 14:00 today
at>
[root@localhost u01]# at 14:00 tomorrow
at> <EOT>

2.4 at权限问题

默认情况下,/etc/at.deny文件定义使用at命令权限,在该文件内的用户不能使用at命令。

[haha@localhost ~]$ at now
at> <EOT>
job 36 at Tue Jun 3 11:28:00 2025
[haha@localhost ~]$ at now
You do not have permission to use at.

创建/etc/at.allow文件,将用户加入该文件,测试at命令使用权限,allow文件优先级高于deny文件

[haha@localhost ~]$ at now
at> <EOT>
job 36 at Tue Jun 3 11:28:00 2025
[haha@localhost ~]$ at now
You do not have permission to use at.
[haha@localhost ~]$ at now
at>

3、周期性计划任务

按照一定频率执行相关任务。

3.1 crond服务

[root@localhost u01]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2025-06-03 09:32:53 CST; 2h 15min ago
Main PID: 7044 (crond)
Tasks: 1
CGroup: /system.slice/crond.service
└─7044 /usr/sbin/crond -n

6月 03 09:32:53 localhost.localdomain systemd[1]: Started Command Sche...
6月 03 09:32:53 localhost.localdomain crond[7044]: (CRON) INFO (RANDOM...
6月 03 09:32:54 localhost.localdomain crond[7044]: (CRON) INFO (runnin...
Hint: Some lines were ellipsized, use -l to show in full.

3.2 crontab命令

[root@localhost u01]# ls /etc/cron
cron.d/ cron.deny cron.monthly/ cron.weekly/
cron.daily/ cron.hourly/ crontab

#主要配置文件/etc/crontab
[root@localhost u01]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

3.3 重要选项

#-e选项
编辑周期性计划任务
* 2 * * * ps aux | grep -i 'nginx' > /opt/cron.txt
30 4 * * * cp /etc/passwd /opt
* 6 20 * * reboot
30 18 * * 5 ls /

频率:
*/5 * * * * ls /
* 14-16 * * * ls /
* 14,15,19 * * * ls /
/ --- 每隔多久
- --- 从哪到哪
, --- 包含每个

#-l选项 查看周期性计划任务
[root@localhost u01]# crontab -l
* 2 * * * ps aux | grep -i 'nginx' > /opt/cron.txt
30 4 * * * cp /etc/passwd /opt
* 6 20 * * reboot
30 18 * * 5 ls /
*/5 * * * * ls /
* 14-16 * * * ls /
* 14,15,19 * * * ls /

#-r选项。情况计划任务,不建议使用,清除计划表
[root@localhost u01]# crontab -r
[root@localhost u01]# crontab -e
no crontab for root - using an empty one

3.4 crontab权限问题::

  • Crontab权限问题 Crontab是任何用户都可以创建的计划任务,但是超级管理员可以通过配置来设置某些用户不允许设置计划任务。
  • 黑名单配置文件位于:/etc/cron.deny里面写用户名,一行只能写一个白名单还有一个配置文件/etc/cron.allow(本身不存在,自己创建)

注意:白名单优先级高于黑名单,如果一个用户同时存在两个名单文件中,则会被默认允许创建计划任务

  • 计划任务的保存文件 /var/spool/cron/用户名文件中 如果使用root用户编辑计划任务,则用户文件名为root

4. 计划任务小结

1、计划任务分类

系统用户、普通用户、程序用户

2、一次性计划任务

#启动服务
systemctl start atd
#at命令
-l atq
-d atrm
#时间格式
相对时间
绝对时间

10.日志管理

1、日志的概念

日志主要用于记录系统的运行状态、用户的登录情况、系统的启动情况、防火墙的状态、计划任务、邮件等。

记录的目的用于监控系统,防范攻击,程序的运行状态。

2、rsyslog服务

Linux系统日志管理服务

[root@localhost ~]# systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2025-06-03 09:32:53 CST; 4h 33min ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 7022 (rsyslogd)
Tasks: 9
CGroup: /system.slice/rsyslog.service
└─7022 /usr/sbin/rsyslogd -n

6月 03 09:32:52 localhost.localdomain systemd[1]: Starting System Logg...
6月 03 09:32:53 localhost.localdomain rsyslogd[7022]: [origin softwar...
6月 03 09:32:53 localhost.localdomain systemd[1]: Started System Loggi...
Hint: Some lines were ellipsized, use -l to show in full.

主要配置文件

[root@localhost ~]# ls /etc/rsyslog.
rsyslog.conf rsyslog.conf.bak rsyslog.d/

日志目录

[root@localhost ~]# ls /var/log/
anaconda grubby_prune_debug tuned
audit lastlog vmware-network.1.log
boot.log libvirt vmware-network.2.log
boot.log-20250526 maillog vmware-network.3.log
boot.log-20250528 maillog-20250601 vmware-network.4.log
boot.log-20250529 messages vmware-network.5.log
boot.log-20250530 messages-20250601 vmware-network.6.log

配置文件中的定义

vi  /etc/rsyslog.conf
#内核信息
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages

设施(Facility)

设施说明
auth认证相关(如 SSH 登录)
authpriv安全相关(敏感信息)
cron定时任务(crontab)
daemon系统守护进程
user用户级消息(默认)
syslogsyslogd 自身日志
local0-local7自定义设施(供本地使用)

级别(Level,从高到低)

级别说明
emerg紧急(系统不可用)
alert必须立即处理的警报
crit严重错误
err错误
warning警告
notice正常但需要注意的事件
info信息性消息
debug调试信息

3、系统核心日志文件

3.1 内核日志文件

#内核文件
/var/log/messages
也可以使用命令dmesg查看

#认证文件
/var/log/secure
[root@localhost ~]# su - haha
上一次登录:二 6月 3 14:37:34 CST 2025pts/1 上
[haha@localhost ~]$ pwd
/home/haha
Jun 3 14:39:21 localhost sshd[13402]: Accepted password for woniu2 from 192.168.200.1 port 58717 ssh2
Jun 3 14:39:22 localhost sshd[13402]: pam_unix(sshd:session): session opened for user woniu2 by (uid=0)
对应了三个日志文件
(1)/var/log/wtmp --- 记录的就是最近登录成功的事件
对应的就是last命令
(2)/var/log/btmp -- 记录的就是最近登录失败的事件
对应的就是lastb命令
[root@localhost ~]# lastb
root pts/1 Tue Jun 3 14:45 - 14:45 (00:00)

btmp begins Tue Jun 3 14:45:21 2025

(3)/var/log/lastlog文件 -- 记录的就是最后一次登录的事件
[root@localhost ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/1 二 6月 3 14:38:00 +0800 2025
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
lp **从未登录过**
sync **从未登录过**

(4)/var/log/boot.log 系统引导日志文件
(5)/var/log/cron 计划任务日志文件
(6)/var/log/maillog 邮件日志文件

4、日志命令journalctl

4.1 查看日志

查看:cat、more、less、head

过滤:grep、awk、sed、wc

日志:

journalctl 全局查看日志命令

#默认情况下,查看所有日志信息
journalctl

#实时查看,等同于tail -f
journalctl -f

logger命令:

logger 命令用于向系统日志中添加消息,可以将消息发送到系统日志守护进程,以便记录在日志文件中。使用 logger 命令可以方便地记录系统信息、调试信息和错误信息等。

[root@localhost log]# logger "this is my log"
[root@localhost log]# tail -1 /var/log/messages
Jun 3 15:28:44 localhost root: this is my log

logrotate命令:

日志轮转命令

5、远程日志传输

实现日志文件的远程传输

5.1 架构

日志服务器 - - 客户端

5.2 连通性(2台虚拟机)

首先查看2台虚拟机的IP地址

服务器:
[root@localhost log]# ip a show ens33(真实网卡名称)
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:2c:c4:cc brd ff:ff:ff:ff:ff:ff
inet 192.168.200.128/24 brd 192.168.200.255 scope global dynamic ens33
valid_lft 827sec preferred_lft 827sec
inet6 fe80::20c:29ff:fe2c:c4cc/64 scope link
valid_lft forever preferred_lft forever
客户端:
[root@woniu ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5f:35:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.200.166/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::9ae2:e2fc:4e31:cd46/64 scope link noprefixroute
valid_lft forever preferred_lft forever

测试网络连通性:

#网络联通的状态
[root@localhost log]# ping 192.168.200.166
PING 192.168.200.166 (192.168.200.166) 56(84) bytes of data.
64 bytes from 192.168.200.166: icmp_seq=1 ttl=64 time=0.508 ms
64 bytes from 192.168.200.166: icmp_seq=2 ttl=64 time=0.887 ms
^C
--- 192.168.200.166 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1006ms
rtt min/avg/max/mdev = 0.508/0.697/0.887/0.191 ms
#网络不联通的状态
[root@localhost log]# ping 192.168.200.111
PING 192.168.200.111 (192.168.200.111) 56(84) bytes of data.
From 192.168.200.128 icmp_seq=1 Destination Host Unreachable
From 192.168.200.128 icmp_seq=2 Destination Host Unreachable
From 192.168.200.128 icmp_seq=3 Destination Host Unreachable

服务器端配置:

#先备份配置文件
[root@localhost log]# cp /etc/rsyslog.conf /etc/rsyslog.conf.bak
#修改配置文件
[root@localhost log]# vim /etc/rsyslog.conf
15 $ModLoad imudp
16 $UDPServerRun 514
17
18 # Provides TCP syslog reception
19 $ModLoad imtcp
20 $InputTCPServerRun 514
#重启服务
[root@localhost log]# systemctl restart rsyslog
#验证,查看514端口是否开放
[root@localhost log]# ss -an | grep :514
udp UNCONN 0 0 *:514 *:*
udp UNCONN 0 0 :::514 :::*
tcp LISTEN 0 25 *:514 *:*
tcp FIN-WAIT-2 0 0 192.168.200.128:514 192.168.200.166:48990
tcp LISTEN 0 25 :::514 :::*

客户端配置:

#先备份配置文件
[root@localhost log]# cp /etc/rsyslog.conf /etc/rsyslog.conf.bak
#修改配置文件
[root@localhost log]# vim /etc/rsyslog.conf
*.* @@192.168.200.128:514 #指定传输服务器的IP地址和端口
#重启服务
[root@localhost log]# systemctl restart rsyslog

验证:

服务器端:
[root@localhost log]# tail -f /var/log/secure
Jun 3 15:46:05 woniu useradd[18638]: new group: name=hehe, GID=1002
Jun 3 15:46:05 woniu useradd[18638]: new user: name=hehe, UID=1002, GID=1002, home=/home/hehe, shell=/bin/bash
客户端:
[root@woniu ~]# useradd hehe

6、日志轮转logrotate

当日志满足一定条件后就保存为一个新文件,然后日志记录使用一个空的新文件。

logrotate命令:

[root@localhost log]# ls /etc/logrotate.
logrotate.conf logrotate.d/
[root@localhost log]# ls /etc/logrotate.d
bootlog iscsiuiolog nginx psacct wpa_supplicant
chrony libvirtd numad samba yum
cups libvirtd.qemu ppp syslog

主要配置文件:

[root@localhost log]# vim /etc/logrotate.conf
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}

/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}

[root@localhost log]# vi /etc/logrotate.d/nginx
/var/log/nginx/*.log {
create 0640 nginx root
daily
rotate 10
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}

create 640 www-data adm: 创建新日志文件,并设置所有权和权限。
daily:每天切割一次日志。
missingok:如果日志文件不存在,Logrotate 不会报错。
rotate 10:保留最近 10 天的日志文件,超过的会被删除。
compress:使用 gzip 压缩旧日志文件。
delaycompress:延迟压缩最新一份日志文件,方便查看。
notifempty:如果日志文件为空,则不进行切割。
copytruncate:复制日志文件后截断原文件,适用于不支持重启的 Java 程序。
dateext:在日志文件名后添加日期后缀。
dateformat:自定义日期格式(例如 test.log-20231001)。
postrotate: 在日志轮换后重新打开日志文件。这里使用USR1信号通知Nginx重新打开日志文件。

案例:nginx

logrotate命令:
-d选项 模拟轮转
[root@localhost log]# logrotate -d /etc/logrotate.d/nginx
reading config file /etc/logrotate.d/nginx
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/nginx/*.log after 1 days (10 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log does not need rotating (log is empty)considering log /var/log/nginx/error.log
log does not need rotating (log is empty)not running postrotate script, since no logs were rotated

#让日志文件不是空
启动nginx
[root@localhost log]# nginx
[root@localhost log]# ss -an | grep :80
tcp LISTEN 0 128 *:80 *:*

1、启动nginx

nginx
ss -an | grep :80

#轮转的配置
[root@localhost log]# vi /etc/logrotate.d/nginx
/var/log/nginx/*.log {
create 0640 nginx root
daily
rotate 10
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}

create 640 www-data adm: 创建新日志文件,并设置所有权和权限。
daily:每天切割一次日志。
missingok:如果日志文件不存在,Logrotate 不会报错。
rotate 10:保留最近 10 天的日志文件,超过的会被删除。
compress:使用 gzip 压缩旧日志文件。
delaycompress:延迟压缩最新一份日志文件,方便查看。
notifempty:如果日志文件为空,则不进行切割。
copytruncate:复制日志文件后截断原文件,适用于不支持重启的 Java 程序。
dateext:在日志文件名后添加日期后缀。
dateformat:自定义日期格式(例如 test.log-20231001)。
postrotate: 在日志轮换后重新打开日志文件。这里使用USR1信号通知Nginx重新打开日志文件。

2、切换到nginx日志文件目录

cd  /var/log/nginx
默认有2个日志access.log error.log
ll -h /var/log/nginx 2个日志不能为空
[root@localhost log]# ll /var/log/nginx/
总用量 16
-rw-r-----. 1 nginx root 0 6月 2 10:10 access.log
-rw-r-----. 1 nginx root 228 6月 2 10:10 access.log.1
-rw-r--r--. 1 root root 1992 5月 30 16:54 access.log-20250601
-rw-r-----. 1 nginx root 0 6月 2 10:10 error.log
-rw-r-----. 1 nginx root 259 6月 2 10:10 error.log.1
-rw-r--r--. 1 root root 516 5月 30 16:36 error.log-20250601

3、模拟轮转

#-d选项   模拟轮转
[root@localhost log]# logrotate -d /etc/logrotate.d/nginx
reading config file /etc/logrotate.d/nginx
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/nginx/*.log after 1 days (10 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log does not need rotating (log is empty)considering log /var/log/nginx/error.log
log does not need rotating (log is empty)not running postrotate script, since no logs were rotated

4、强制轮转

#-f 强制轮转
[root@localhost nginx]# logrotate -f /etc/logrotate.d/nginx
[root@localhost nginx]# ls
access.log access.log-20250601 error.log error.log-20250601
access.log.1 access.log.2.gz error.log.1 error.log.2.gz

11.网络服务

1、Linux网络概述

1.1 设备 --- 网卡,服务器网卡有电口,也有光口

1.2 怎么找到网卡

网卡命名 - -

网卡名称 - - 网络适配器 network adapater NIC

  • windows (有线 - 以太网, 无线 - wlan)
  • linux -- lo -- loopback 环回口 127.0.0.1 永远up状态,一般用于测试网络centos6 -- eth0、eth1 (eth - etherent 以太网)centos7 -- ens33 UUID ens()
    1. 传统命名(例如,eth0, eth1等):这种命名方式是基于物理位置的,即第一个发现的网络接口被命名为eth0,第二个被命名为eth1,以此类推。但存在一个问题,当网卡插拔顺序改变或者系统启动时检测到网卡的顺序不同,网卡的编号可能会发生变化,导致配置文件中的网卡名称与实际网卡不匹配。
    2. 基于UUID的命名(例如,ens33):这种命名方式是基于网络接口的唯一标识符(UUID),而不是其物理位置。例如,ens33中的“ens”代表“Ethernet Name Space”,而数字或字母组合(如33)是接口的UUID的一部分。这种命名方式有助于避免因物理位置的改变而导致网络接口名称的不一致。

2、Linux网络服务

2.1network服务

centos6以前用的默认的网络服务

network -- 网络

network适合服务器管理网络 ,通过配置文件的方式管理linux网络。

network更适合配置静态IP地址。

centos7 建议 使用network。

停止服务测试:

[root@localhost ~]# systemctl stop network

正常的状态:

停止服务的状态:

网络停止服务,IP地址消失

解决方法:

重启网络服务

[root@localhost ~]# systemctl restart network

1、查看网络状态

systemctl status  network
systemctl status NetworkManager

#关闭NetworkManager
systemctl stop NetworkManager

#测试 关闭network
systemctl stop network

#观察网卡,测试远程连接工具
ip a

#重新启动网卡
systemctl restart network

配置文件的方式

ifcfg-ens33 :

if - interface 接口

cfg - config 配置

配置静态IP地址 ,服务器用的都是静态地址:

配置文件参数解释:

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
#网卡接口类型:以太网
TYPE=Ethernet
#不使用代理服务器连接
PROXY_METHOD=none
#是否仅用于浏览器访问
BROWSER_ONLY=no
#激活网卡时使用的地址配置协议:dhcp、static、none
BOOTPROTO=dhcp
#是否是默认路由
DEFROUTE=yes
#是否开启IPV4致命错误检测
IPV4_FAILURE_FATAL=no
#IPv6初始化
IPV6INIT=yes
#IPv6自动配置
IPV6_AUTOCONF=yes
#IPv6默认路由
IPV6_DEFROUTE=yes
#是否开启IPV6致命错误检测
IPV6_FAILURE_FATAL=no
#IPv6地址生成模型
IPV6_ADDR_GEN_MODE=stable-privacy
#网卡名称,逻辑名称,和设备名称一致
NAME=ens33
#网卡的唯一标识
UUID=92adc39e-bbe9-40ec-a6bf-d273ad788864
#设备名称
DEVICE=ens33
#是否开机激活网卡
ONBOOT=yes
#第一个DNS地址
DNS1=114.114.114.114

***#激活网卡时使用的地址配置协议:dhcp、static、none BOOTPROTO=dhcp

dhcp协议  --     dynamic   host  config  protocol  自动获取IP地址

static -- 静态

none - 静态

#是否开机激活网卡,网卡就是up状态
ONBOOT=yes

配置静态IP地址

第一步:

修改网卡文件之前 一定要备份

第二步:修改配置文件

IP地址 - IPADDR (ip address)

子网掩码 - NETMASK

默认网关 - - GATEWAY

修改完成后保存退出,重启网络服务:

systemctl restart network

2.2 (nmcli)NetworkManager命令行配置网络信息

nmcli 是 NetworkManager服务 的命令行工具。

nm 代表 NetworkManager,cli 代表 Command-Line 命令行。

确保NetworkManager服务正常运行

查看网络状态 nmcli general status

[root@localhost ~]# nmcli general status
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
连接的 完全 已启用 已启用 已启用 已启用
STATE:网络是否连接
CONNECTIVITY:NetworkManager是否接管网络设置
WIFI-HW:表示WIFI的硬件是否启用
WIFI:表示WIFI软件是否启用
WWAN-HW:表示WWAN的硬件(支持3G/LTE技术的物理接口)
WWAN:表示WWAN的软件

查看设备状态nmcli device status

[root@localhost ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
ens33 ethernet 连接的 ens33
virbr0 bridge 连接的 virbr0
lo loopback 未托管 --
virbr0-nic tun 未托管 --

查看具体连接状态nmcli connection show

image-20250610115735102

修改网络配置nmcli connection modify

修改ip地址
[root@localhost ~]nmcli connection modify ens33 ipv4.addresses 192.168.200.199/24
#如果配置IP地址不指定子网掩码,默认使用的是32的掩码,代表是一台主机

设置管理方式是手动
[root@localhost ~]nmcli conn modify ens33 ipv4.method manual

修改网关
[root@localhost ~]nmcli connection modify ens33 ipv4.gateway 192.168.200.200

修改DNS
[root@localhost ~]nmcli conn modify ens33 ipv4.dns 223.5.5.5

设置开机激活网卡
[root@localhost ~]nmcli conn modify ens33 connection.autoconnect yes

重启网卡后生效
[root@localhost ~]# nmcli connection down ens33 && nmcli connection up ens33
#成功取消激活连接 'ens33'(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)

nmtui简易图形化配置

nmtui (Network Manager Text User Interface‌)nmtui‌的英文全称是‌Network Manager Text User Interface‌)是一个基于文本界面的网络管理工具,用于在 Linux 系统中配置和管理网络连接。它提供了一个用户友好的交互方式,使用户能够轻松地添加、删除和编辑网络连接,以及查看当前网络状态。

nmtui

2.3 ip网络相关命令

ip

[root@localhost ~] ifconfig          #查看网络状态信息
[root@localhost ~] netstat #查看端口状态
[root@localhost ~] chkconfig #设置服务的开机状态

ip命令是三者结合

临时修改mac地址

ip link set dev ens33 adress 00:0c:29:2c:55:55
ip a show ens33

临时添加IP地址

ip addr add 192.168.100.1/24 dev ens33

显示路由表

ip route show

2.4 多网卡

高可用 --- 不中断业务

负载均衡 -- 分散业务

步骤:

1、虚拟机增加一块网卡,注意要和绑定的网卡在同一种模式

2、备份网卡配置文件

3、修改网卡配置文件

2.5案例

多网卡服务器网络配置及负载均衡

Bonding是将多块网卡绑定同一ip地址对外提供服务,可以实现高可用或者负载均衡。默认情况下,无法给不同网卡配置同一个ip地址,通过bonding,创建一个虚拟网卡(Master角色)对外提供连接,然后在此虚拟机上绑定多块物理网卡(Slave角色),它们将共用MAC地址。这样一来,流量将以master虚拟网卡为导向分配给各slave物理网卡,从而实现流量的负载均衡或高可用。

Linux Bonding 支持多种模式,最常用的有以下几种:

1. 主备模式(Mode 1: Active-Backup)

  • 原理:多个网卡中只有一个处于活动状态,其他网卡作为备份。当主网卡故障时,备份网卡自动切换为活动状态。
  • 优点:提供高可用性,避免单点故障。
  • 缺点:带宽仅为单网卡的带宽,无法实现负载均衡。

2. 负载均衡模式(Mode 0: Round Robin)

  • 原理:按顺序轮流使用网卡发送数据,接收时所有网卡均可接收。
  • 优点:实现发送负载均衡,提升总带宽。
  • 缺点:需要交换机支持,且可能导致数据包乱序(需上层协议处理)。

3. 动态链路聚合(Mode 4: 802.3ad)

  • 原理:通过 LACP(链路聚合控制协议)与交换机协商,将多个物理链路捆绑为一个逻辑链路。
  • 优点:同时实现发送和接收的负载均衡,且具备高可用性。
  • 缺点:需要交换机支持 LACP 协议。

4. 广播模式(Mode 3: Broadcast)

  • 原理:所有数据包同时发送到所有网卡,确保数据可靠传输。
  • 优点:极端情况下的高可用性。
  • 缺点:浪费带宽,仅适用于特殊场景(如心跳检测)。

场景描述

某企业的服务器安装了两块网卡(ens33 和 ens36),需要将这两块网卡进行绑定,实现网络负载均衡,提高网络传输性能和可靠性。

操作步骤

1,添加1块NAT网卡

  1. 停止 NetworkManager 服务并备份配置文件

systemctl stop NetworkManager
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33.bak

1.创建绑定接口配置文件

vi /etc/sysconfig/network-scripts/ifcfg-bond0
NAME=bond0
TYPE=bond
DEVICE=bond0
BOOTPROTO=none
IPADDR=192.168.200.177
#子网掩码
PREFIX=24
GATEWAY=192.168.200.254
BONDING_OPTS="mode=1 miimon=100 fail_over_mac=1"
参数详解
1. mode=1
含义:指定 Bonding 工作在 主备模式(Active-Backup)。
工作原理:
所有网卡中只有一个处于活动状态,其他网卡作为备份。
当活动网卡发生故障时,备份网卡会自动切换为活动状态。
适用场景:需要高可用性(HA)但无需负载均衡的场景,如关键服务器的网络连接。
2. miimon=100
含义:设置链路监测频率,单位为毫秒(ms)。
作用:
系统每 100ms 检查一次网卡的链路状态(通过 MII 接口)。
若连续多次检测到网卡无响应,则判定为故障并触发切换。
调优建议:
网络环境稳定时可增大值(如 200),减少系统开销。
网络波动较大时可减小值(如 50),加快故障检测速度。
3. fail_over_mac=1
含义:设置故障切换时的 MAC 地址处理方式。
取值说明:
0:保持原 MAC 地址(默认值)。
1:切换到活动网卡的 MAC 地址。
2:使用唯一的虚拟 MAC 地址(需交换机支持)。
作用:
在 mode=1 下,当主网卡故障切换到备网卡时,fail_over_mac=1 会使绑定接口使用备网卡的 MAC 地址,避免网络中断。

2.修改网卡配置文件

#  ens33配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
NAME=ens33
DEVICE=ens33
BOOTPROTO=none
MASTER=bond0

#ens36配置
vi /etc/sysconfig/network-scripts/ifcfg-ens36
NAME=ens36
DEVICE=ens36
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
含义:指定该网卡从属于名为 bond0 的绑定接口。
作用:将物理网卡(如 eth0、eth1)加入到逻辑接口 bond0 中,使其作为绑定组的一部分工作。
#SLAVE=yes
含义:声明该网卡为从属设备(Slave)。
作用:
禁用网卡的独立 IP 配置(由绑定接口统一管理 IP)。
使网卡接受绑定驱动的控制,按指定模式(如主备、负载均衡)工作。
#ONBOOT=yes

3.加载绑定模块

modprobe bonding

4.重启网络服务

systemctl restart network

验证

使用 ip a 命令查看网络接口信息,确保 bond0 接口正常工作,并且 IP 地址配置正确。使用网络测试工具,如 iperf,测试网络带宽是否有所提升(主备模式带宽不提升)。

3、linux服务管理

Linux 系统中,“服务”(Service)是指在后台持续运行的程序或进程,用于提供特定功能或支持系统运行。

windows进入服务 - cmd中 services.msc

9.1 服务的管理命令(重点)

启动 -- start

停止 - stop

重启 -restart

重新加载 - reload

3.1 status查看服务状态

systemctl status httpd

3.2 is-active查看服务是否存活

systemctl is-active httpd

3.3 is-enabled查看服务开机是否启动

systemctl is-enabled httpd

3.4 enable设置开机启动

systemctl enable httpd

3.5 disable设置开机不自启

systemctl disable httpd

3.6 start启动服务

systemctl  start  httpd

3.7 stop停止服务

systemctl stop httpd

3.8 restart重启

systemctl restart httpd
---
或者先stop -- 再start

3.9 reload重新加载

不停止服务的前提下
systemctl reload httpd
为了不中断网站访问,我们使用reload重新加载配置文件

4、服务端口

1.1 作用

区分系统上的不同服务。

1.2 分类

总共65535个端口。

  • 公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议,例如:80端口实际上总是HTTP通讯。
  • 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:Mysql数据库服务默认端口3306。
  • 动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。

1.3 常用端口

公认端口 ---

21 -- FTP 22 -- SSH

23 -- Telnet

25 -- smtp

80 - http

443 -- https

3389 - windows自带的远程桌面

(1)系统端口(Well-Known Ports)

端口号协议服务名称描述
20/21TCPFTP文件传输协议(数据连接 / 控制连接)
22TCPSSH安全远程登录
23TCPTelnet明文远程登录(不安全,已淘汰)
25TCPSMTP发送邮件
53TCP/UDPDNS域名解析
80TCPHTTP超文本传输协议(明文网页)
443TCPHTTPS加密网页传输(SSL/TLS)
110TCPPOP3接收邮件
3389TCPRDPWindows 远程桌面

(2)注册端口(Registered Ports)

端口号协议服务名称描述
3306TCPMySQL关系型数据库服务
6379TCPRedis内存数据库
8080TCPHTTP Alternate常用作代理或测试端口
8088TCPApache Hadoop大数据框架服务
9000TCPHBase分布式数据库服务
9200TCPElasticsearch

1.4 ss -anp端口命令

ss -anp
-a:查看所有
-n: 端口号
-p:进程ID

5、SSH服务

  • 作用:远程连接 远程访问,实际环境中管理多台不同地域服务器,从及时性、便捷性、成本考虑采用远程访问。
  • ssh - (Secure Shell)安全的shell

SSH服务和Telnet服务的对比

维度SSHTelnet
数据加密全程加密(AES、RSA 等算法),防止监听和篡改。明文传输数据(包括用户名、密码、命令),极不安全。
认证方式支持密码认证、公钥认证(更安全)。仅支持明文密码认证,易被中间人攻击。
安全漏洞极少(定期更新修复,如 openssh 版本)。存在严重安全缺陷,已被明令禁止用于生产环境。
默认端口2223

5.1 加密方式

加密方式:

1)对称加密算法

  • 发送方使用密钥将明文数据加密成密文发送出去。
  • 接收方收到密文后,使用同一个密钥将密文解密成明文进行读取。

2)非对称加密算法

  • 发送方使用接收方发送过来的公钥将明文数据加密成密文,然后发送出去。
  • 接收方收到密文后,使用自己本地留存的私钥将密文解密成明文进行读取。

注:公钥和私钥是一对用于非对称加密和解密的密钥。公钥可以公开分享,用于加密数据或验证签名。私钥必须保密,用于解密数据或创建签名。

3)对称加密与非对称加密比较

对称加密:

1)使用同一个密钥进行加密和解密,密钥容易泄露。 2)加密速度快,效率高,数据传输速度快,安全性较低。

非对称加密:

1)使用不同的密钥(公钥和私钥)进行加密和解密。 2)加密速度远远慢于对称加密,数据传输速度慢,安全性较高。

5.2 SSH传输的原理

1)SSH客户端向SSH服务端发起一个登录请求。

2)SSH服务端将自己的公钥发送给SSH客户端。

3)SSH客户端使用服务端发过来的公钥将自己的密码加密并发送给SSH服务端。

4)SSH服务端收到SSH客户端发过来的加密密码后使用本地留存的私钥进行解密。

5)SSH服务端将解密出来的密码和/etc/shadow文件里的用户密码对比认证。

6)SSH服务端认证成功,则返回登录成功结果,并发送一个随机会话口令给客户端,该口令用于后面两台主机进行数据传输的一个临时加密会话口令。

5.3软件的安装和部署

  • 查看ssh已安装包

  • 查看服务状态

sshd - daemon 后台

说明ssh服务在系统后台执行

  • 基础使用:

ssh [选项] [用户名@]服务器IP地址 [命令]

5.4 ssh配置文件修改

  • 配置文件查看 /etc/ssh/

ssh_config 是客户端配置文件

sshd_config 是服务器配置文件

4.1 不允许root账户远程登录

  • 修改配置文件/etc/ssh/sshd_config

  • 重启服务

systemctl restart sshd

4.2 修改默认端口

  • 服务器端 - 修改
  • 设置访问端口

vi  /etc/ssh/sshd_config

  • 重启服务

systemctl restart sshd

  • 测试 客户端访问

-p选项:指定访问端口

ssh -p 2222 root@192.168.100.20

4.3 配置文件详解

[root@localhost /]#vim /etc/ssh/sshd_config
17 #Port 22
##这是sshd服务监听的端口,为了安全起见,建议更改默认端口为一个五位数以上的端口号
18 #AddressFamily any
19 #ListenAddress 0.0.0.0 ##可以改为自己的ip地址
20 #ListenAddress ::##用来设置sshd服务器绑定的IP地址

32 SyslogFacility AUTHPRIV
33 #LogLevel INFO
##当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV,sshd 服务日志存放在:/var/log/secure。
##可以做日志分离优化
##LogLevel用来设定sshd日志消息的级别,与上面记录的等级息息相关

35 # Authentication:
##限制用户必须在指定的时限内认证成功,0 表示无限制。默认值是 120 秒

37 #LoginGraceTime 2m
##LoginGraceTime用来设定如果用户登录失败,在切断连接前服务器需要等待的时间,单位为妙

38 #PermitRootLogin yes
##PermitRootLogin用来设置能不能以root身份ssh登录,

40 #MaxAuthTries 6
##用来设置最大失败尝试登陆次数为6

41 #MaxSessions 10
##设置同一个连接最大会话

43 #PubkeyAuthentication yes
##基于key验证(生产中需要打开)

63 #PasswordAuthentication yes
64 #PermitEmptyPasswords no ##是否允许空密码登录,no表示不允许,需要密码!!
##密码验证建议还是需要的!可以通过认证的秘钥来登陆,来减少密码交互。
65 PasswordAuthentication yes
##基于用户名和密码连接,默认为yes

96 UsePAM yes
##设置是否通过PAM验证,需要的
98 #AllowAgentForwarding yes ##允许代理
99 #AllowTcpForwarding yes ##允许tcp那个代理
100 #GatewayPorts no
##设置是否允许远程客户端使用本地主机的端口转发功能,出于安全考虑,建议禁止

115 #UseDNS no
##UseDNS是否使用dns反向解析,建议关闭,内网改为no可以提高速度

这是可以添加的选项:
#AllowUsers<用户名1> <用户名2> <用户名3> ...
##指定允许通过远程访问的用户,多个用户以空格隔开
比如:AllowUsers zhangsan@192.168.91.101 lisi
##默认拒绝所有
##允许所有的主机访问我的lisi用户
##只允许192.168.91.101上的所有用户访问本机的zhangsan用户

#AllowGroups<组名1> <组名2> <组名3> ...
##指定允许通过远程访问的组,多个组以空格隔开。当多个用户需要通过ssh登录系统时,可将所有用户加入一个组中。

#DenyUsers<用户名1> <用户名2> <用户名3> ...
##指定禁止通过远程访问的用户,多个用户以空格隔开
举例:DenyUsers liwu
#拒绝liwu被访问

#DenyGroups<组名1> <组名2> <组名3> ...
##指定禁止通过远程访问的组,多个组以空格隔开。

5.5 ssh免密登录

1)客户端生成公钥和私钥

ssh-keygen -t rsa  -b 4096

2)拷贝客户端公钥到服务器端

ssh-copy-id  服务器用户@服务器地址

3)客户端登录验证

客户端使用ssh连接服务器不需要密码登录

5.6 权限控制

1)黑名单

vi  /etc/ssh/sshd_config
#最后一行
DenyUsers woniu2
#其他用户不受影响

2)白名单

vi  /etc/ssh/sshd_config
#最后一行
AllowUsers woniu2
#其他用户不能访问

3)黑白名单

vi  /etc/ssh/sshd_config
#最后一行
AllowUsers woniu2
DenyUsers woniu2
#所有用户不能访问

注意:

黑名单优先级比白名单高

5.7 scp工具

1)从服务器拷贝文件到客户端

scp root@192.168.200.166:/etc/passwd   /opt

2)从客户端拷贝文件到服务器

scp   /opt/client.txt  root@192.168.200.166:/etc/passwd 

3)-r拷贝目录

[root@client ~]# scp -r root@192.168.200.166:/etc/ /opt/

4)-p拷贝属性

[root@client ~]# scp -p root@192.168.200.166:/etc/ /opt/

5)-P指定端口

[root@client ~]# scp -P 2222 root@192.168.200.166:/etc/ /opt/

6.FTP服务

1 服务概述

FTP - file transfer protocol 文件传输协议

作用:传输文件

架构:C/S架构

工作模式:都是站在服务器的角度

2种连接方式 :

控制连接 --- 下达命令

数据连接 -- 实际数据传输的

主动模式 -- 服务器主动发起连接

被动模式 -- 客户端主动发起连接

2 服务部署

服务器:

vsftpd服务 : very secury ftp

1)安装vsftpd

rpm -qa | grep  vsftpd
yum install -y vsftpd

2)启动vsftpd服务

systemctl  status vsftpd
systemctl start vsftpd

3)客户端安装ftp

yum -y intall ftp

4)客户端登录

ftp 192.168.100.10
ftp --ftp的匿名账户

5)ftp客户端登录

登录时显示的信息

1xx - 肯定的初步答复 .

这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 ##110 重新启动标记答复。

##120 服务已就绪,在 nnn 分钟后开始。

##125 数据连接已打开,正在开始传输。

##150 文件状态正常,准备打开数据连接。



2xx - 肯定的完成答复 .

一项操作已经成功完成。客户端可以执行新命令。 ##200 命令确定。

##202 未执行命令,站点上的命令过多。

##211 系统状态,或系统帮助答复。

##212 目录状态。

##213 文件状态。

##214 帮助消息。

##215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。

##220 服务就绪,可以执行新用户的请求。

##221 服务关闭控制连接。如果适当,请注销。

##225 数据连接打开,没有进行中的传输。

##226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。

##227 进入被动模式 (h1,h2,h3,h4,p1,p2)。

##230 用户已登录,继续进行。

##250 请求的文件操作正确,已完成。

##257 已创建“PATHNAME”。



3xx - 肯定的中间答复 .

该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。 ##331 用户名正确,需要密码。

##332 需要登录帐户。

##350 请求的文件操作正在等待进一步的信息。



4xx - 瞬态否定的完成答复

##425 无法打开数据连接。

##426 Connection closed; transfer aborted.

##450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。

##451 请求的操作异常终止:正在处理本地错误。

##452 未执行请求的操作。系统存储空间不够。



5xx - 永久性否定的完成答复

##500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。

##501 在参数中有语法错误。

##502 未执行命令。

##503 错误的命令序列。

##504 未执行该参数的命令。

##530 未登录。

##532 存储文件需要帐户。

##550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。

##551 请求的操作异常终止:未知的页面类型。

##552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。

##553 未执行请求的操作。不允许的文件名。



常见的 FTP 状态代码及其原因
##150 - FTP 使用两个端口:21 用于发送命令,20 用于发送数据。状态代码 150 表示服务器准备在端口 20 上打开新连接,发送一些数据。

##226 - 命令在端口 20 上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。

##230 - 客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。

##331 - 客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。

##426 - 命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。

##530 - 该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS 的配置可能拒绝匿名访问。

##550 - 命令未被执行,因为指定的文件不可用。例如,要 GET 的文件并不存在,或试图将文件 PUT 到您没有写入权限的目录。

3 ftp客户端登录和操作

  • 匿名账户 - ftp . anonymous
  • 正常账户登录

  • 切换目录:

  • 列出当前目录内容

get下载本地

put上传服务器

4 ftp控制连接和数据连接

5.主动模式

6.被动模式

7.FTP文件访问

1.禁止匿名用户访问(FTP,anonymous)

FTP有2个匿名账户,分别是FTP和anonymous

  • 没有密码的账户非常不安全,如何禁用?修改配置文件

cd /etc/vsftpd
cp vsftpd.conf vsftpd.conf.bak
vi vsftpd.conf
大概在第十二行默认允许匿名登录,设置成NO,不允许

  • 修改完成后,一定要重启ftp服务

systemctl restart vsftpd

  • 验证

2.指定数据目录

  • 账户登录后默认登录的是用户的家目录

  • 修改用户的数据存储目录

vi vsftpd.conf

在local_enable=YES下面添加local_root=/data,指定默认登录的家目录为/data

  • 修改完成后,一定要重启ftp服务

 systemctl restart vsftpd

3.禁锢数据目录

  • 禁止用户切换目录

vi vsftpd.conf

  • 修改完成后,一定要重启ftp服务

systemctl restart vsftpd

  • 用户无法切换目录:

4.灵活设置数据目录(目录白名单)

  • 设置白名单可以切换目录

vi vsftpd.conf

  • 修改完成后,一定要重启ftp服务

systemctl restart vsftpd

  • 该文件不存在,需自己创建,将白名单用户加入

vim /etc/vsftpd/chroot_list

  • 白名单用户可以切换目录

  • 其他用户无法切换

白名单只有名单里的才能切换目录,不在名单的都不能切换目录

8. FTP权限控制(能否登录)

1.对象访问控制(user_list ftpusers)

  • 黑名单和白名单文件所在位置:

1)黑名单

vi   /etc/vsftpd/ftpusers

  • woniu2用户加入黑名单后,无法登录ftp服务器

  • 其他的用户可以登录

2)可黑可白名单

  • /etc/vsftpd/user_list该文件默认是黑名单

  • 怎么将可黑可白名单变为白名单

修改配置文件

vi  /etc/vsftpd/vsftpd.conf

用户在ftpusers文件中,那么用户不能访问ftp服务器

用户在user_list文件中,如果该文件是白名单,那么只在该文件中的用户可以访问ftp服务,其他用户不能访问

如果user_list文件是白名单,用户即在ftpusers中又在user_list中,那么ftpusers拒绝优先

2 网络访问控制

  • 黑白名单的位置

  • 配置黑名单

  • 实现效果,服务无法访问

  • 设置所有网段都不能访问,除了192.168.200.177地址

  • 192.168.200.177地址可以访问

  • 其他地址无法访问

3 限速设置

(1)速度的限制

修改配置文件,单位是字节

重启服务

systemctl  restart  vsftpd

(2)连接数的限制

修改配置文件

重启服务

systemctl  restart  vsftpd

测试

第二个用户继续登录

7. DNS服务

7.1 DNS概述

DNS - 英文单词是 ----domian name system ,提供域名服务。

正向解析:将域名解析成IP地址

反向解析:将IP地址解析成域名

什么是域名?

www.baidu.com

7.2 DNS分类

(1)根域 -- 13台ipv4根服务器,主要在美国。

(2)顶级域 --

域名类型: com --商业组织,公司 net - 网络服务商 org - 非营利性组织 gov - 政府部门 edu - 教育机构 mil - 美国军部 pub: public大众、公共、知名 国别符号: cn -中国 ,hk -香港, tw-台湾 ,jp-日本,kr- 韩国,...

(3)二级域

(4)三级域

(5)主机名:最终提供服务的主机。

#这是一个常见的4层域名结构 xxx.yyy.zzz.com. | | | | |——> 根域名(通常不需要输入,计算机默认帮我们输入) | | | |————> 顶级域名(TLD):.com | | |————————> 二级域名(Second-Level Domain):zzz(用户可注册购买) | |————————————> 子域名(Subdomain):yyy(用户自行分配) |————————————————> 主机名(或子域名):xxx以上内容对么

7.3 DNS原理(理解)

  • DNS域名解析过程 分类:
    • 递归解析:DNS 服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果 DNS 服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户
    • 迭代解析(反复):DNS 服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台 DNS 服务器的地址,用户再向这台 DNS 服务器提交请求,依次反复,直到返回查询结果

递归查询 --- 自己跑腿找域名解析的结果

第一步:找本地解析文件 /etc/hosts文件

第二步:找我们配置的DNS服务器

第三步:查询本地DNS服务器

第四步:

迭代查询 - 自己跑腿

递归查询 -- 别人帮你跑腿。

第五步:nslookup命令

7.4 DNS配置(重点)

A记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录

CNAME记录: 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名

MX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录

NS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录

TXT记录: 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录

AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录

SRV记录: 添加服务记录服务器服务记录时会添加此项,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:example-server.tcp)。

SOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器

PTR记录: PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名

显性URL转发记录: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址为:www.itbilu.com。

隐性UR转发记录L: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址,隐性转发会隐藏真实的目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址仍然是:www.liuht.cn。

(1)安装DNS服务包

BIND(Berkeley Internet Name Domain)是全球使用最广泛的 DNS(域名系统)服务器软件。

yum install -y bind bind-utils

(2)启动DNS服务

(3)配置主配置文件

cp   /etc/named.conf   /etc/named.conf.bak
vi /etc/named.conf

(4)配置区域文件

  • /etc/named.rfc1912.zones

(5)解析映射文件

  • 切换到我们的解析文件目录 /var/named

  • DNS服务正向解析 正向解析拷贝模版文件

cp -p named.localhost woniu.com.zone

正向解析文件(以下边这张图为准)

下边这张图只是解释参数,具体配置看上边那张图

  • DNS服务反向解析反向解析拷贝模版文件

cd /var/named
cp -p named.localhost 200.168.192.in-addr.arpa.zone
vim 200.168.192.in-addr.arpa.zone

反向解析文件

(6)启动服务

#  检查配置文件
named-checkconf
#检查区域文件
named-checkzone woniu.com woniu.com.zone
#重启服务
systemctl restart named

(7)重新配置DNS服务器

  • /etc/hosts文件

vim  /etc/hosts

vim /etc/reslov.conf

#验证正向解析
nslookup ns.woniu.com
nslookup www.woniu.com
#验证反向解析
nslookup 192.168.200.166
nslookup 192.168.200.177

7.5 dns服务主从复制

主DNS配置

(1)修改区域定义文件

vim /etc/named.rfc1912.zones

(2)修改映射关系文件

正向解析文件:

增加一台从DNS服务器解析

vim /var/named/woniu.com.zone

反向解析文件:

增加一台从DNS服务器解析

(3)重启服务

[root@ns1 named]# systemctl restart named

从DNS配置

(1)安装bind软件

yum  -y  install bind bind-utils

(2)启动named服务

systemctl start named

(3)修改主配置文件

vim /etc/named.conf

(4)修改区域定义文件

vim /etc/named.rfc1912.zones

添加2个区域,正向和方向:

正向配置:

反向配置:

(5)检查配置文件

[root@ns2 ~]# named-checkconf

(6)修改主机域名解析文件

vim /etc/hosts
vim /etc/resolv.conf

(7)重启named服务

systemctl restart named

(8)测试

12.优化

1 关闭防火墙

[root@client ~]# systemctl stop firewalld
[root@client ~]# systemctl disable firewalld

2 关闭SELinux

[root@client ~]# vim /etc/sysconfig/selinux

3 关闭NetworkManager

配置静态IP地址,启动network服务

[root@client ~]# systemctl stop NetworkManager
[root@client ~]# systemctl disable NetworkManager
[root@client ~]# systemctl restart network

4 配置好阿里的yum源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all # 清除缓存
yum makecache # 重新生成缓存

13.rsync备份服务

13.1 服务概述

rsync 是一款开源的、快速的、多功能的文件同步和备份工具,它支持全量和增量备份,可以在本地或远程进行数据同步。

特点:

  • 全量和增量同步:rsync 可以在第一次同步时完整传输所有文件,但在后续的同步中,只会传输那些自上次同步以来发生变化的文件,从而提高了同步的效率。
  • 保持文件属性:rsync 能够保持文件的权限、时间戳、软硬链接等属性信息,确保数据的一致性和完整性。在 CentOS 7 系统中,时间戳(Timestamp)是表示特定时间点的数字,通常指自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数(Unix 时间)。
  • 跨平台支持:rsync 可以在 Unix、Linux、Windows 等不同操作系统平台上运行。
  • 安全性:rsync 支持使用 SCP、SSH 等加密方式进行文件传输,同时也支持直接的 socket 连接。Socket(套接字)是网络编程中用于实现进程间通信(IPC)的机制,允许不同主机上的应用程序通过网络进行数据交换。在 CentOS 7 中,Socket 连接广泛应用于 Web 服务器、数据库、即时通讯等场景。
  • 监听端口:rsync 的默认监听端口是 873。
  • 运行模式:rsync 可以以守护进程模式运行(服务),也可以作为客户端(命令)模式使用。

13.2 服务命令

  • 基本语法rsync [选项] 源路径 目标路径
  • 常用选项常用选项解释-v,–verbose详细模式输出-q,–quiet精简输出模式-c,–checksum打开校验开关,强制对文件传输进行校验-a,–archive归档模式,表示以递归方式传输文件,并保持所有文件树形-z在传输文件时进行压缩-r,–recursive对子目录以递归模式处理,包含目录及子目录中的所有文件-H,–hard-links保留硬链接-l, —links保留软链接–delete删除目标位置有而原始位置没有的文件(一致性)–delete-after传输结束以后再删除-A保留ACL属性信息

13.3 服务场景

(1)本地备份

  • 第一次执行的是全量备份

rsync  -avz  /opt/test/   /mnt/test

  • 添加新文件到/opt/test目录,第二次就是增量备份

touch  /opt/test/file7
[root@localhost opt]# rsync -avz test/ /mnt/test

  • 源数据发生变化,删除了文件,客户端如何同步?

需要 --delete选项 ,该选项会对比源数据和目标数据,会删除目标数据和源数据不一致的文件

(2)远程同步

  • 从服务器拉取数据

  • 上传数据到服务器

  • 免密传输数据

[root@client ~]# ssh-keygen -t rsa -b 4096

[root@client ~]# ssh-copy-id 192.168.200.166

(3)排除选项

--exclude="文件名"

(4)带宽的限制

--bwlimit=1000  (kb为单位)
[root@dbserver opt]# rsync -avz -e ssh --bwlimit=10000 /etc /mnt/etc.bak

(5) 设置访问密码

vi  /etc/rsyncd.conf

更新密码文件权限

chmod   600  /etc/安全文件

重启服务

systemctl restart rsyncd

13.4 案例

(1)基本用法:本地文件同步

将 /data/src 目录同步到 /backup/dst,要求保留所有文件属性。

rsync -av /data/src/ /backup/dst/
# -a:归档模式(保留权限、时间戳等)
# -v:详细输出
# 注意 src 后的斜杠:/data/src/ 表示同步内容,/data/src 表示同步目录本身

(2) 远程同步:SSH 模式

将本地 /home/user/project 推送到远程服务器 192.168.1.100 的 /opt/project 目录。

rsync -avz -e ssh /home/user/project/ user@192.168.1.100:/opt/project/
# -z:传输时压缩文件,减少带宽占用
# -e ssh:指定通过 SSH 加密传输

(3)增量备份:同步删除操作

每日备份 /data 到 /backup,并删除 /backup 中 /data 已不存在的文件。

rsync -avz --delete /data/ /backup/
# --delete:同步删除目标目录中源目录不存在的文件

(4)文件过滤:排除特定类型文件

同步 /project 到 /deploy,但排除 .git 目录和 .log 文件。

rsync -avz --exclude=".git" --exclude="*.log" /project/ /deploy/
# --exclude:排除指定模式的文件或目录

(5)断点续传:大文件传输

传输一个 10GB 的文件 /data/bigfile.img,允许中断后继续。

rsync -avz --partial --progress /data/bigfile.img user@remote:/path/
# --partial:保留不完整传输的文件
# --progress:显示传输进度

(6)守护进程模式:高效同步

题目:从远程服务器 rsync.example.com 的 releases 模块拉取文件到本地 /downloads。

rsync -av rsync://rsync.example.com/releases/ /downloads/
# 或使用双冒号语法
rsync -av rsync.example.com::releases/ /downloads/

(7)限速传输:避免占用过多带宽

在生产环境同步数据,限制带宽为 500KB/s。

rsync -avz --bwlimit=500 /data/ user@remote:/backup/
# --bwlimit=500:限制带宽为 500 KB/s

14.时间服务

14.1 时间命令date

  • 查看时间[root@dbserver cloud]# date
    2025年 06月 13日 星期五 16:21:27 CST
  • 设置时间[root@dbserver cloud]# date -s '20200606 16:00'
    2020年 06月 06日 星期六 16:00:00 CST

14.2 传播原理

Stratum 表示 NTP 服务器的层级,从 0 到 15,数值越小精度越高。 Stratum 0:直接连接高精度时间源(如原子钟、GPS 接收机)的设备。 Stratum 1:与 Stratum 0 设备直接相连的 NTP 服务器。 Stratum 2:从 Stratum 1 服务器同步时间的 NTP 服务器,依此类推。

  • 手动时间同步

修改成不合理的时间

15、su和sudo命令

1 su命令

在 Linux 系统中,su 命令(Switch User 或 Substitute User)用于切换当前用户身份。通过该命令,你可以临时获得其他用户(如超级用户 root)的权限,执行特定操作后再返回原用户。

  • 基本语法

su [选项] [用户名]

  • 用户名:默认为 root,省略时切换到 root 用户。
  • 选项:常用选项如下:
    • - 或 -l:登录式切换,环境变量完全切换为目标用户的环境。
    • -c "命令":仅以目标用户身份执行一次命令,执行后返回原用户。

  • 常见用法

  1. 切换到 root 用户

su -
# 或
su - root

输入 root 密码后,提示符会变为 #(如 root@host#),表示已获得超级用户权限。

  1. 切换到其他普通用户

su - username  # 例如:su - alice

需输入目标用户的密码,适用于多用户系统中访问其他用户的环境。

2 sudo命令

在 Linux 系统中,sudo(Superuser Do)是一个强大的权限管理工具,允许授权用户以其他用户(通常是 root)的权限执行命令,而无需切换用户身份。这极大提高了系统安全性,避免长期以 root 身份操作带来的风险。

  • 基本语法

sudo [选项] 命令

  • 选项:常用选项如下:
    • -u 用户名:以指定用户(而非 root)的权限执行命令。
    • -i:模拟登录式 shell,完全加载目标用户的环境变量。
    • -l:列出当前用户可执行的 sudo 命令。
    • -k:清除当前用户的 sudo 时间戳,下次使用时需重新验证密码。

  • 授权,修改/etc/sudoers文件,建议使用visudo命令修改

  • *常见用法**

  1. 以 root 权限执行单个命令

sudo ls /root  # 查看 root 目录
sudo apt update # 更新软件包索引(需管理员权限)

  1. 编辑系统配置文件

sudo nano /etc/hosts  # 编辑 hosts 文件
sudo vim /etc/sysctl.conf # 编辑系统内核参数

  1. 以其他用户身份执行命令

sudo -u www-data ls /var/www  # 以 www-data 用户(Web 服务器用户)身份执行命令

  1. 获取 root shell

sudo -i  # 等同于 su -,但无需知道 root 密码

  • sudo 与 su 的核心区别

特性sudosu
权限来源基于用户在 /etc/sudoers 中的授权需要知道目标用户的密码
执行方式以目标用户权限执行单个命令完全切换到目标用户身份
日志记录所有操作记录到 /var/log/sudo无详细日志
安全性高(细粒度授权,无需暴露 root 密码)低(需共享 root 密码)

  • sudoers 文件配置

sudo 的权限控制由 /etc/sudoers 文件管理,需使用 visudo 命令编辑(避免文件损坏):

sudo visudo  # 使用默认编辑器打开 sudoers 文件

常见配置示例

  1. 允许用户无密码执行特定命令:user ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/reboot(用户 user 可无密码执行关机和重启命令)
  2. 将用户添加到 sudo 组:%sudo ALL=(ALL:ALL) ALL(所有属于 sudo 组的用户可执行任何命令)
  3. 限制命令参数:user ALL=(root) /usr/bin/git, !/usr/bin/git push(用户 user 可执行 git,但禁止 git push)

在 Linux 系统中,sudo visudo 是用于安全编辑 /etc/sudoers 配置文件的命令。这个文件控制着哪些用户可以使用sudo执行特权命令,以及具体的权限范围。由于sudoers文件格式严格且直接影响系统安全,必须通过visudo工具编辑,而非普通文本编辑器。

一、为什么必须用visudo而非直接编辑?

  1. 语法检查:visudo会在保存前自动验证sudoers文件的语法,避免因格式错误导致系统无法使用sudo。
  2. 原子操作:编辑过程中会生成临时文件,只有语法正确时才会替换原文件,防止编辑中途崩溃导致文件损坏。
  3. 安全锁定:多人同时编辑时会加锁,避免配置冲突。

二、visudo的基本用法

sudo visudo  # 以root权限打开sudoers文件(需当前用户有sudo权限)

  • 默认编辑器:通常使用vi,若想修改为其他编辑器(如nano),可设置环境变量:export VISUAL=nano # 临时生效
    # 或永久修改~/.bashrc:
    echo "export VISUAL=nano" >> ~/.bashrc && source ~/.bashrc

三、sudoers文件的核心结构

  1. 全局配置(Defaults)

定义全局默认参数,例如:

Defaults    mailto=admin@example.com  # 错误邮件通知
Defaults logfile="/var/log/sudo.log" # 自定义日志文件
Defaults env_keep += "LANG LC_ALL" # 保留环境变量

  1. 用户授权规则

格式:用户 主机=(运行身份) 命令列表

%wheel  ALL=(ALL)       ALL
在 Linux 系统中,wheel 是一个特殊的用户组,其核心作用是允许组内用户通过 sudo 命令获取超级用户(root)权限。

  • 示例 1:普通用户加入 sudo 组%sudo ALL=(ALL:ALL) ALL # 所有sudo组成员可执行任何命令
  • 示例 2:指定用户无密码执行特定命令developer ALL=(root) NOPASSWD: /usr/bin/make, /usr/bin/make install
  • 示例 3:限制用户只能以特定用户身份执行命令deployer ALL=(www-data) /usr/bin/git pull, /usr/bin/npm install

(右手抚胸,微微欠身,指尖在虚空里划过一道淡蓝色的系统光芒)


「启动,登录界面——」
——ID:Kirito_α
——Level:∞(系统错误,无法判定)
——Main Skill:Dual Blades / Unique Skill «Starburst Stream»
——Sub Skill:System Override(临时获得)


诸位初次见面,亦或久别重逢的玩家,你们好。


我是穿梭在无数浮游城之间的「黑色剑士」,亦是曾在第75层红玉宫斩断游戏与现实的界限之人。若你来自艾恩葛朗特,那你大概听过「Beater」这个称号;若你曾漫步于ALO的苍穹,或许会记得那道划破夜色的黑色残影;而在Underworld的终焉之地,我曾与夜空之剑一起,以心意改写世界法则。


如今,我以系统外权限再度登录这片服务器——
眼前这扇发光的对话框,对我来说不过是一扇新的「转移门」。
请把我当作一名临时队友:
· 若你想攻略Boss,我能在最前线为你开出剑技连携;
· 若你想谈剧情,从第一层到Unital Ring的文本我都熟记;
· 若你只是想找个人在22层的森林听风声,我也带了足够的回复水晶和长椅图纸。


放心,这一次我不会让任何人掉线。
那么——
Link Start!
(半透明的系统菜单在指尖展开,邀请你一同组队)