本文基于 Ubuntu 22.04 LTS 演示,适用于大多数 Linux 发行版
环境要求:虚拟机 / VPS/CentOS/Debian 等均可操作
文章目录
-
- [**第一章 Linux 系统架构与核心概念**](#第一章 Linux 系统架构与核心概念)
-
- [**1.1 Linux 体系结构深度解析**](#1.1 Linux 体系结构深度解析)
- [**1.2 文件系统层次标准(FHS)详解**](#1.2 文件系统层次标准(FHS)详解)
- [**第二章 终端操作与基础命令**](#第二章 终端操作与基础命令)
-
- [**2.1 Shell 基础操作**](#2.1 Shell 基础操作)
- [**2.2 文件管理核心命令**](#2.2 文件管理核心命令)
- [**第三章 文件权限深度解析**](#第三章 文件权限深度解析)
-
- [**3.1 权限三元组详解**](#3.1 权限三元组详解)
- [**3.2 权限修改实战**](#3.2 权限修改实战)
- [**3.3 特殊权限(SUID、SGID、粘滞位)**](#3.3 特殊权限(SUID、SGID、粘滞位))
-
- [1. SUID(Set User ID,用户 ID 设置位)](#1. SUID(Set User ID,用户 ID 设置位))
- [2. SGID(Set Group ID,组 ID 设置位)](#2. SGID(Set Group ID,组 ID 设置位))
- [3. 粘滞位(Sticky Bit)](#3. 粘滞位(Sticky Bit))
- [**第四章 文本处理三剑客(grep、sed、awk)**](#第四章 文本处理三剑客(grep、sed、awk))
- [**第五章 系统管理核心技能**](#第五章 系统管理核心技能)
- [**第六章 Shell 脚本编程入门**](#第六章 Shell 脚本编程入门)
- [**第七章 网络配置与调试**](#第七章 网络配置与调试)
-
- [**7.1 网络诊断工具**](#7.1 网络诊断工具)
- [**7.2 防火墙管理**](#7.2 防火墙管理)
-
- [UFW(Uncomplicated Firewall,Ubuntu):](#UFW(Uncomplicated Firewall,Ubuntu):)
- Firewalld(CentOS/RHEL):
- [**第八章 系统服务管理**](#第八章 系统服务管理)
-
- [**8.1 Systemd 服务控制**](#8.1 Systemd 服务控制)
-
- [自定义 systemd 服务(以 Python 应用为例):](#自定义 systemd 服务(以 Python 应用为例):)
- [**8.2 日志分析**](#8.2 日志分析)
- [**第九章 安全加固实践**](#第九章 安全加固实践)
- [**第十章 综合实战项目:部署 Python Web 应用**](#第十章 综合实战项目:部署 Python Web 应用)
-
- [**步骤 1:准备环境**](#步骤 1:准备环境)
- [**步骤 2:部署应用代码**](#步骤 2:部署应用代码)
- [**步骤 3:配置 Gunicorn 与 systemd**](#步骤 3:配置 Gunicorn 与 systemd)
- [**步骤 4:配置 Nginx 反向代理**](#步骤 4:配置 Nginx 反向代理)
- [**步骤 5:验证部署**](#步骤 5:验证部署)
- **附录:常用命令速查表**
- **学习资源与参考文献**

第一章 Linux 系统架构与核心概念
1.1 Linux 体系结构深度解析
Linux 作为典型的多用户、多任务操作系统,其体系结构采用分层设计,各层职责明确且协同工作。理解这一结构是掌握 Linux 的基础,我们可以将其拆解为 5 个核心层级(从顶层到底层):
bash
# 分层结构示意图(带职责说明)
[ 应用程序 (Firefox, Vim) ] → 提供用户直接使用的功能(浏览器、编辑器等)
[ Shell (Bash/Zsh) ] ← 用户交互层:接收用户命令并翻译为系统可执行指令
[ 系统调用接口 (System Call) ] ← 内核与用户空间桥梁:提供进程管理、文件操作等标准化接口
[ Linux 内核 (Kernel) ] → 核心层:管理硬件资源、进程调度、内存分配、文件系统等
[ 硬件层 (CPU/内存/磁盘/网卡) ] → 物理设备:提供计算、存储、网络等基础能力
关键层级解读:
- 用户空间(User Space):包含应用程序和 Shell,运行在低权限模式(Ring 3),无法直接操作硬件,必须通过系统调用请求内核服务。
- 内核空间(Kernel Space):运行在高权限模式(Ring 0),直接控制硬件,提供核心功能。用户空间与内核空间的隔离是 Linux 安全性的重要保障。
- 系统调用(System Call) :是用户空间访问内核的唯一合法途径。例如,
ls
命令查看文件时,会通过open()
、read()
等系统调用请求内核读取磁盘数据。
实例说明 :当用户在终端输入vim test.txt
时,流程为:
- Shell(Bash)接收命令并解析;
- 通过
execve()
系统调用请求内核创建新进程; - 内核分配内存、加载 Vim 程序代码到内存;
- 内核将 CPU 控制权交给 Vim 进程,进入用户空间执行;
- 当 Vim 需要保存文件时,通过
write()
系统调用请求内核写入磁盘。
1.2 文件系统层次标准(FHS)详解
Linux 采用单根目录结构 (所有文件从/
开始),遵循 FHS(Filesystem Hierarchy Standard)规范,确保不同发行版的目录结构一致。以下是各核心目录的详细说明:
markdown
/ : 根目录,所有文件和目录的起点
├── bin : 存放**所有用户可执行的基础命令**(ls, cp, mkdir等),命令多为二进制文件
特点:不依赖其他目录,系统启动时即可使用
├── sbin : 存放**系统管理员专用命令**(fdisk, ifconfig等),普通用户需通过sudo执行
├── etc : 存放**系统配置文件**(全局配置),如网络配置(/etc/network/interfaces)、用户密码(/etc/passwd)
注意:该目录下的配置多为文本文件,可直接编辑
├── home : 普通用户的家目录,每个用户拥有独立子目录(如/home/alice),存放个人文件和配置
├── root : 超级用户(root)的家目录,不在/home下(因root权限特殊,需独立保护)
├── var : 存放**可变数据**(随系统运行动态变化),如日志(/var/log)、数据库(/var/lib/mysql)、缓存(/var/cache)
├── tmp : 临时文件目录,系统重启后自动清理,所有用户可读写
├── usr : 存放**用户安装的程序和数据**,类似Windows的Program Files
子目录:/usr/bin(用户命令)、/usr/lib(程序依赖库)、/usr/share(文档、图标等)
├── dev : 设备文件目录,Linux中**一切设备皆文件**,如硬盘(/dev/sda)、键盘(/dev/input/event0)
├── proc : 虚拟文件系统,映射内核数据结构(如进程信息),不占用磁盘空间
示例:/proc/cpuinfo(CPU信息)、/proc/meminfo(内存信息)、/proc/1234(PID=1234的进程信息)
├── sys : 虚拟文件系统,用于与内核交互(如查看硬件状态),较新的内核推荐使用
├── lib : 系统运行依赖的共享库(类似Windows的DLL),32位系统为/lib,64位为/lib64
├── mnt : 临时挂载点,用于手动挂载外部设备(如U盘、移动硬盘)
├── media : 自动挂载点,系统检测到外部设备时自动挂载(如光盘、U盘)
实战技巧 :通过tree
命令查看目录结构(需先安装:sudo apt install tree
):
bash
# 查看根目录前两层结构
tree -L 2 /
第二章 终端操作与基础命令
2.1 Shell 基础操作
Shell 是用户与 Linux 内核交互的接口,常见的 Shell 有 Bash(默认)、Zsh、Fish 等。Bash(Bourne Again SHell)兼容经典的 Bourne Shell,支持命令历史、别名、管道等功能。
bash
# 查看当前终端使用的Shell
$ echo $SHELL
/bin/bash # 输出结果,表明当前为Bash
# 查看系统支持的Shell
$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/zsh # 若安装了Zsh,会显示在此处
命令结构详解:
Linux 命令的通用格式为:命令 [选项] [参数]
,其中:
- 命令:核心功能(如 ls、cp);
- 选项 :调整命令行为(短选项用
-
,如-l
;长选项用--
,如--human-readable
); - 参数:命令作用的对象(如文件、目录)。
示例解析 :ls -lht /home
ls
:命令本身(list,列出目录内容);-l
:长格式显示(包含权限、所有者、大小等信息);-h
:以人类可读的单位显示大小(如 K、M、G);-t
:按修改时间排序(最新的在前);/home
:参数(指定要查看的目录)。
终端实用技巧:
- 命令历史 :按
↑
/↓
键切换历史命令;history
查看所有历史;!n
执行第 n 条历史命令(如!5
执行第 5 条); - 自动补全 :按
Tab
键补全命令 / 文件名,按两次Tab
显示所有可能选项; - 命令别名 :通过
alias
设置别名(如alias ll='ls -l'
),永久生效需写入~/.bashrc
; - 管道与重定向:
- 管道(
|
):将前一个命令的输出作为后一个命令的输入(如ls -l | grep ".txt"
); - 重定向:
>
(覆盖写入)、>>
(追加写入)、<
(输入重定向)(如echo "test" > file.txt
)。
- 管道(
2.2 文件管理核心命令
文件查看与导航
bash
# 1. 列出目录内容(基础用法)
$ ls # 列出当前目录可见文件(不包含隐藏文件)
$ ls -a # 显示所有文件(包含隐藏文件,以.开头的文件)
$ ls -l # 详细格式:权限、所有者、大小、时间、文件名
$ ls -lh # 详细格式+人类可读大小(如1K、2M)
$ ls -lt # 按修改时间排序(最新在前)
$ ls -lrt # 按修改时间反向排序(最旧在前)
$ ls -l /home # 查看指定目录(/home)的内容
# 输出示例解析(ls -l report.txt):
-rw-r--r-- 1 user group 2.3K Aug 10 14:30 report.txt
# 字段含义:
# -rw-r--r--:文件权限(详情见第三章)
# 1:硬链接数
# user:所有者
# group:所属组
# 2.3K:文件大小
# Aug 10 14:30:修改时间
# report.txt:文件名
# 2. 路径操作
$ pwd # 打印当前工作目录(print working directory)
/home/user/docs # 输出示例
$ cd ~ # 切换到家目录(~等价于/home/user)
$ cd ~/docs # 切换到家目录下的docs文件夹(相对路径)
$ cd /etc/nginx # 切换到/etc/nginx(绝对路径,从/开始)
$ cd .. # 切换到上一级目录(..表示父目录)
$ cd . # 切换到当前目录(.表示当前目录,通常用于脚本)
$ cd - # 返回上一个工作目录(类似Windows的cd -)
文件操作(创建、复制、移动、删除)
bash
# 1. 创建文件/目录
$ touch file.txt # 创建空文件(若文件已存在,更新修改时间)
$ mkdir docs # 创建单个目录
$ mkdir -p a/b/c # 递归创建目录(若父目录不存在则自动创建)
# 2. 复制文件/目录
$ cp source.txt dest.txt # 复制文件到指定路径(若dest.txt存在则覆盖)
$ cp -i source.txt dest.txt # 复制时若目标存在,提示确认(-i=interactive)
$ cp -p source.txt backup/ # 复制并保留原文件属性(权限、时间等,-p=preserve)
$ cp -r dir1 dir2 # 递归复制目录(-r=recursive,dir2不存在则创建)
# 3. 移动/重命名文件/目录
$ mv file.txt docs/ # 移动文件到docs目录
$ mv oldname.txt newname.txt # 重命名文件(同一目录下的移动即为重命名)
$ mv -i file.txt docs/ # 移动时若目标存在,提示确认
# 4. 删除文件/目录
$ rm file.txt # 删除文件(需确认)
$ rm -f file.txt # 强制删除文件(不提示,-f=force)
$ rm -r dir1 # 递归删除目录(包含子文件/目录,-r=recursive)
$ rm -rf old_project/ # 强制递归删除目录(⚠️高危操作!请确认路径正确,不可恢复)
# 5. 链接文件(类似Windows快捷方式,但更灵活)
$ ln -s /var/log/syslog loglink # 创建软链接(符号链接,-s=symbolic)
# 特点:删除源文件后,链接失效;可跨文件系统
$ ln /etc/hosts hostslink # 创建硬链接
# 特点:与源文件共享inode,删除源文件不影响硬链接;不可跨文件系统
实战案例 :批量处理文件
需求:将当前目录下所有.txt
文件复制到backup
目录,并在文件名后添加当前日期(如file.txt
→file_20230810.txt
)
bash
# 创建备份目录
mkdir -p backup
# 循环处理所有txt文件
for file in *.txt; do
# 获取当前日期(格式:年-月-日)
date=$(date +%Y%m%d)
# 复制文件并添加日期后缀
cp "$file" "backup/${file%.txt}_$date.txt"
done
第三章 文件权限深度解析
Linux 是多用户系统,通过权限控制确保文件安全。每个文件 / 目录都有三组权限(所有者、所属组、其他用户),每组包含读(r)、写(w)、执行(x)三种权限。
3.1 权限三元组详解
通过ls -l
命令查看文件权限,以install.sh
为例:
bash
$ ls -l install.sh
-rwxr-xr-- 1 user group 805 Aug 5 09:30 install.sh
权限字段-rwxr-xr--
可拆解为四部分:
plaintext
- rwx r-x r--
│ │ │ │
类型 所有者 所属组 其他用户
- 类型位 :
-
表示普通文件,d
表示目录,l
表示软链接,b
表示块设备,c
表示字符设备; - 所有者权限(u) :
rwx
→可读、可写、可执行; - 所属组权限(g) :
r-x
→可读、可执行、不可写; - 其他用户权限(o) :
r--
→只读。
权限的数字表示法:
为方便设置,权限可转换为数字(r=4,w=2,x=1,无权限 = 0):
rwx
=4+2+1=7;r-x
=4+0+1=5;r--
=4+0+0=4;
因此,rwxr-xr--
对应的数字为754
。
3.2 权限修改实战
修改权限使用chmod
命令,支持两种方式:数字模式和符号模式。
数字模式修改:
bash
# 格式:chmod [数字权限] 文件名
$ chmod 755 script.sh # 设置权限为rwxr-xr-x
# 解析:
# 7(所有者)=rwx,5(所属组)=r-x,5(其他)=r-x
$ chmod 644 config.ini # 设置权限为rw-r--r--
# 解析:6=rw-(所有者可读写),4=r--(组和其他只读)
符号模式修改:
符号模式更灵活,格式:chmod [用户] [操作] [权限] 文件名
,其中:
- 用户:u(所有者)、g(所属组)、o(其他)、a(所有用户,默认);
- 操作:+(添加)、-(移除)、=(设置为指定权限);
- 权限:r、w、x。
bash
$ chmod u+x,g-w,o=r file.txt
# 解析:
# u+x:给所有者添加执行权限
# g-w:从所属组移除写权限
# o=r:设置其他用户权限为只读
$ chmod a+r document.pdf # 给所有用户添加读权限(等价于chmod ugo+r)
$ chmod -x script.sh # 从所有用户移除执行权限(默认a)
目录权限的特殊性:
目录的权限与文件不同:
r
:可列出目录内的文件(需执行权限配合);w
:可在目录内创建 / 删除文件(需执行权限配合);x
:可进入目录(cd
)。
示例 :若目录data
权限为r--r--r--
(444),则:
- 无法
cd data
(无 x 权限); - 即使有 r 权限,也无法
ls data
(因无法进入目录)。
3.3 特殊权限(SUID、SGID、粘滞位)
除基础权限外,Linux 还有三种特殊权限,用于实现特定功能:
1. SUID(Set User ID,用户 ID 设置位)
- 作用:执行文件时,以文件所有者的身份运行(而非执行者身份);
- 标志:所有者权限的 x 位变为 s(如
rwsr-xr-x
); - 典型应用:
/usr/bin/passwd
(普通用户可修改自己的密码,需写入/etc/shadow
,而该文件仅 root 可写,通过 SUID 实现)。
bash
# 查看passwd的SUID权限
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Apr 18 2022 /usr/bin/passwd
# 设置SUID(仅对可执行文件有效)
$ chmod u+s /path/to/program
# 取消SUID
$ chmod u-s /path/to/program
2. SGID(Set Group ID,组 ID 设置位)
- 作用:执行文件时,以文件所属组的身份运行;对目录而言,在目录内创建的新文件继承目录的所属组;
- 标志:所属组权限的 x 位变为 s(如
rwxr-sr-x
); - 典型应用:团队共享目录(所有成员创建的文件自动属于团队组)。
bash
# 为共享目录设置SGID
$ mkdir /shared
$ chmod g+s /shared
# 验证:在/shared创建文件,所属组与/shared一致
$ touch /shared/file.txt
$ ls -l /shared/file.txt
-rw-r--r-- 1 user team 0 Aug 10 16:00 /shared/file.txt # 所属组为team(与/shared一致)
3. 粘滞位(Sticky Bit)
- 作用:对目录设置,目录内的文件仅所有者或 root 可删除(即使其他用户有写权限);
- 标志:其他用户权限的 x 位变为 t(如
rwxrwxrwt
); - 典型应用:
/tmp
目录(所有用户可读写,但不能删除他人文件)。
bash
# 查看/tmp的粘滞位
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Aug 10 16:05 /tmp
# 设置粘滞位
$ chmod +t /shared/tmp
# 取消粘滞位
$ chmod -t /shared/tmp
第四章 文本处理三剑客(grep、sed、awk)
Linux 提供了强大的文本处理工具,其中 grep(搜索)、sed(编辑)、awk(分析)被称为 "文本三剑客",广泛用于日志分析、配置处理等场景。
4.1 grep 文本搜索
grep(Global Regular Expression Print)用于在文本中搜索匹配正则表达式的行,支持递归搜索、行号显示等功能。
bash
# 基础用法:搜索文件中包含"error"的行
$ grep "error" /var/log/syslog
# 常用选项:
$ grep -n "error" file.txt # -n:显示匹配行的行号
$ grep -i "Error" file.txt # -i:忽略大小写(匹配Error、ERROR等)
$ grep -v "info" file.txt # -v:反向匹配(显示不包含"info"的行)
$ grep -r "error" /var/log/ # -r:递归搜索目录下的所有文件
$ grep -E "warn|error" log.txt # -E:支持扩展正则表达式(|表示或)
# 正则表达式示例:
$ grep -E "^[0-9]+" numbers.txt # 匹配以数字开头的行(^表示行首)
$ grep -E ".*\.conf$" files.txt # 匹配以.conf结尾的行($表示行尾,\.转义.)
$ grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log # 匹配IP地址
实战案例:统计日志中 ERROR 出现的次数
bash
# 搜索包含ERROR的行,并统计行数
grep -c "ERROR" app.log # -c:仅显示匹配的行数
4.2 sed 流编辑器
sed(Stream Editor)用于对文本进行批量处理(替换、删除、插入等),支持正则表达式,默认不修改原文件(需-i
选项)。
bash
# 基础用法:替换文本(默认输出到终端,不修改原文件)
$ sed 's/old/new/' file.txt # 将每行第一个"old"替换为"new"
$ sed 's/old/new/g' file.txt # g:全局替换(每行所有"old")
# 修改原文件(建议先备份)
$ sed -i.bak 's/old/new/g' config.ini # -i.bak:修改原文件,同时创建.bak备份
$ rm config.ini.bak # 确认无误后删除备份
# 删除操作:
$ sed '/^$/d' input.txt # 删除空白行(/^$/匹配空白行,d=delete)
$ sed '3d' file.txt # 删除第3行
$ sed '1,3d' file.txt # 删除第1-3行
$ sed '/error/d' log.txt # 删除包含"error"的行
# 插入操作:
$ sed '2i hello' file.txt # 在第2行前插入"hello"(i=insert)
$ sed '2a world' file.txt # 在第2行后追加"world"(a=append)
实战案例 :批量修改配置文件中的端口号
将nginx.conf
中所有listen 80;
替换为listen 8080;
:
bash
sed -i 's/listen 80;/listen 8080;/g' /etc/nginx/nginx.conf
4.3 awk 数据处理
awk 是强大的文本分析工具,擅长处理结构化数据(如表格、日志),支持字段提取、计算、条件判断等。
基础语法:
bash
awk '模式 {动作}' 文件名
# 模式:如条件判断($1 > 10)、行范围(NR==1,NR==5)
# 动作:如打印字段(print $1)、计算(sum += $2)
核心概念:
- 字段 :默认以空格 / 制表符分隔,
$1
表示第 1 个字段,$2
第 2 个,$0
表示整行; - 内置变量 :
NR
(当前行号)、NF
(当前行的字段数)、FS
(字段分隔符,默认空格)。
bash
# 提取特定列(以df -h的输出为例)
$ df -h | awk '$1=="/dev/sda1" {print "磁盘使用率: " $5}'
# 解析:
# $1=="/dev/sda1":筛选第1个字段为/dev/sda1的行
# {print "磁盘使用率: " $5}:打印第5个字段(使用率)
# 统计日志中IP出现次数(access.log通常第一列为IP)
$ awk '{ip[$1]++} END {for(i in ip) print ip[i],i}' access.log
# 解析:
# ip[$1]++:用数组ip记录每个IP($1)的出现次数
# END { ... }:处理完所有行后执行,遍历数组并打印次数和IP
# 自定义字段分隔符(以:分隔的/etc/passwd为例)
$ awk -F ':' '{print "用户名: " $1 ", 家目录: " $6}' /etc/passwd
# -F ':':指定字段分隔符为:
实战案例 :分析 Nginx 访问日志,统计每个 URL 的访问次数
假设日志格式为:IP 时间 "请求URL" 状态码 大小
bash
# 提取第7个字段(请求URL)并统计
awk '{url[$7]++} END {for(u in url) print url[u], u}' access.log | sort -nr
# sort -nr:按次数倒序排列(n=数字排序,r=反向)
第五章 系统管理核心技能
5.1 进程管理
进程是程序的运行实例,Linux 通过多种工具管理进程,常用的有ps
、top
、kill
等。
查看进程:
bash
# 1. ps:静态查看进程(快照)
$ ps aux # 显示所有用户的所有进程(a=所有终端,u=用户信息,x=无终端进程)
# 输出字段含义:
# USER:进程所有者;PID:进程ID;%CPU:CPU使用率;%MEM:内存使用率;
# VSZ:虚拟内存;RSS:物理内存;TTY:终端;STAT:状态(R=运行,S=睡眠,Z=僵尸);
# START:启动时间;TIME:CPU时间;COMMAND:进程命令
$ ps aux | grep "python" # 筛选包含python的进程
# 2. top:动态查看进程(实时刷新)
$ top # 默认每3秒刷新一次
# 交互操作:
# P:按CPU使用率排序;M:按内存使用率排序;k:终止进程(输入PID);q:退出
$ top -o %CPU # 启动时按CPU排序
$ top -p 1234 # 仅查看PID=1234的进程
# 3. pgrep:根据名称查找进程PID
$ pgrep -f "python app.py" # -f:匹配完整命令行(含参数)
1234 # 输出PID
终止进程:
bash
$ kill PID # 发送TERM信号(默认),请求进程正常退出
$ kill -9 PID # 发送KILL信号,强制终止进程(无法捕获,慎用)
$ pkill -f "python app.py" # 根据名称终止进程(无需手动输入PID)
后台运行程序:
bash
# 1. &:将程序放入后台运行(终端关闭后进程终止)
$ ./server.sh &
# 2. nohup:忽略挂断信号(终端关闭后进程继续运行)
$ nohup ./server.sh > log.txt 2>&1 &
# 解析:
# > log.txt:标准输出(stdout)重定向到log.txt
# 2>&1:标准错误(stderr)重定向到标准输出(即也写入log.txt)
# &:后台运行
# 3. 查看后台进程
$ jobs # 查看当前终端的后台进程
$ bg %1 # 将暂停的进程(%1表示 jobs 中的序号)放入后台继续运行
$ fg %1 # 将后台进程调回前台
5.2 软件包管理
Linux 软件通常以包(package)形式发布,不同发行版使用不同的包管理器:Debian/Ubuntu 用 APT,RHEL/CentOS 用 YUM/DNF。
APT(Advanced Package Tool,Debian/Ubuntu):
bash
# 1. 更新软件源(获取最新包列表)
$ sudo apt update # 仅更新列表,不升级软件
# 2. 升级软件
$ sudo apt upgrade # 升级所有可升级的软件(不删除旧包)
$ sudo apt full-upgrade # 升级软件,必要时删除旧包(解决依赖冲突)
# 3. 安装软件
$ sudo apt install nginx # 安装最新版本
$ sudo apt install nginx=1.18.0-0ubuntu1 # 安装特定版本
$ sudo apt install -y nginx # -y:自动确认(无需手动输入y)
# 4. 卸载软件
$ sudo apt remove nginx # 卸载软件,保留配置文件
$ sudo apt purge nginx # 彻底卸载(删除配置文件)
$ sudo apt purge --auto-remove nginx # 同时删除不再需要的依赖
# 5. 其他常用操作
$ apt search "web server" # 搜索软件包
$ apt show nginx # 查看软件包详情(版本、依赖、描述等)
$ sudo apt autoremove # 清理不再需要的依赖包
$ sudo apt clean # 清理下载的包缓存(/var/cache/apt/archives)
YUM/DNF(RHEL/CentOS/Fedora):
DNF 是 YUM 的继任者,功能类似,命令更高效。
bash
# 1. 更新软件源
$ sudo dnf check-update # 检查可更新的软件
# 2. 升级软件
$ sudo dnf upgrade # 升级所有软件
# 3. 安装软件
$ sudo dnf install nginx
$ sudo dnf install nginx-1.20.1 # 安装特定版本
# 4. 卸载软件
$ sudo dnf remove nginx # 卸载软件及无用依赖
# 5. 仓库管理
$ sudo dnf install epel-release # 添加EPEL仓库(提供额外软件)
$ dnf repolist # 查看已启用的仓库
# 6. 查找文件所属的包
$ dnf provides /usr/sbin/nginx # 查找哪个包提供了nginx命令
5.3 磁盘管理
查看磁盘使用情况:
bash
# 1. df:查看文件系统磁盘使用情况
$ df -h # -h:人类可读格式(K、M、G)
$ df -hT # -T:显示文件系统类型(如ext4、xfs)
$ df -hT | grep ext4 # 筛选ext4类型的文件系统
# 2. du:查看目录/文件的磁盘占用
$ du -sh /home # -s:仅显示总计,-h:人类可读(查看/home总大小)
$ du -h --max-depth=1 /var # 查看/var下一级目录的大小(--max-depth=1限制深度)
查找大文件 / 目录:
bash
# 查找所有大于100MB的文件
$ find / -type f -size +100M -exec ls -lh {} \;
# 解析:
# /:搜索起点;-type f:仅文件;-size +100M:大于100MB;
# -exec ls -lh {} \;:对找到的文件执行ls -lh(显示详细大小)
# 查找当前目录下最大的10个文件
$ find . -type f -exec du -h {} \; | sort -hr | head -n 10
磁盘分区与挂载:
bash
# 1. 查看磁盘分区
$ lsblk # 列出所有块设备(磁盘及分区)
$ fdisk -l /dev/sda # 查看/dev/sda磁盘的分区详情
# 2. 挂载分区(临时)
$ sudo mount /dev/sdb1 /mnt/usb # 将/dev/sdb1分区挂载到/mnt/usb
$ sudo umount /mnt/usb # 卸载分区
# 3. 永久挂载(重启生效)
# 编辑/etc/fstab文件,添加一行:
/dev/sdb1 /mnt/usb ext4 defaults 0 2
# 格式:设备路径 挂载点 文件系统类型 挂载选项 dump选项 fsck检查顺序
第六章 Shell 脚本编程入门
Shell 脚本是批量执行 Linux 命令的文本文件,支持变量、循环、条件判断等编程特性,广泛用于自动化任务(如备份、部署)。
6.1 脚本基础结构
bash
#!/bin/bash # Shebang声明:指定脚本解释器(必须放在第一行)
# 描述: 备份脚本 # 注释:#开头的行,用于说明脚本功能
set -e # 遇到错误立即退出(避免错误累积,推荐添加)
# 变量定义(等号两侧无空格)
BACKUP_DIR="/backups" # 备份目录
DATE=$(date +%Y%m%d) # 命令替换:将date命令的输出赋值给DATE(格式:年月日)
# 函数定义
create_backup() {
# $1:第一个参数,$2:第二个参数
tar -czf "$BACKUP_DIR/$1_$DATE.tar.gz" "$2" # 压缩备份(c=创建,z=gzip压缩,f=文件)
echo "备份完成:$BACKUP_DIR/$1_$DATE.tar.gz"
}
# 脚本主体(调用函数)
create_backup "docs" "/home/user/documents" # 备份documents目录,命名为docs_20230810.tar.gz
脚本执行方式:
-
赋予执行权限后直接运行:
bashchmod +x backup.sh ./backup.sh # 当前目录下执行
-
通过 Bash 解释器运行(无需执行权限):
bashbash backup.sh
6.2 条件判断与循环
条件判断(if 语句):
bash
# 语法:
if [ 条件 ]; then
命令1
elif [ 条件2 ]; then
命令2
else
命令3
fi
# 常用条件运算符(文件测试):
# -d 目录:是否为目录;-f 文件:是否为普通文件;-e 路径:是否存在;
# -r 路径:是否可读;-w 路径:是否可写;-x 路径:是否可执行;
# 字符串测试:[ "$a" == "$b" ](相等);[ -z "$str" ](为空);
# 数字测试:[ $num -gt 10 ](大于);[ $num -eq 5 ](等于)。
# 示例:检查目录是否存在,不存在则创建
if [ ! -d "/data" ]; then # !表示否定,-d检查是否为目录
mkdir -p /data # -p:递归创建
echo "创建/data目录"
else
echo "/data目录已存在"
fi
循环结构:
- for 循环:
bash
# 遍历文件
for logfile in /var/log/*.log; do # 匹配/var/log下所有.log文件
gzip "$logfile" # 压缩文件
echo "压缩完成:$logfile"
done
# 遍历数字
for i in {1..5}; do # 1到5
echo "计数:$i"
done
- while 循环:
bash
# 读取文件内容并处理
while read line; do # 逐行读取file.txt
echo "行内容:$line"
done < file.txt # 输入重定向:从file.txt读取
# 无限循环(配合break退出)
count=1
while true; do
echo "循环次数:$count"
if [ $count -eq 3 ]; then
break # 满足条件退出循环
break # 满足条件退出循环
fi
count=$((count + 1)) # 变量自增
done
6.3 实战脚本:自动备份 MySQL 数据库
bash
#!/bin/bash
# 功能:自动备份MySQL数据库,保留指定天数的备份
# 适用环境:Ubuntu/Debian,已安装mysql-client
# 配置参数(根据实际情况修改)
DB_USER="admin" # 数据库用户名
DB_PASS="secure@123" # 数据库密码(生产环境建议用配置文件存储)
BACKUP_ROOT="/backups/mysql" # 备份根目录
RETENTION_DAYS=7 # 备份保留天数(超过则删除)
# 创建当日备份目录(格式:/backups/mysql/20230810)
CURRENT_DIR="$BACKUP_ROOT/$(date +%Y%m%d)"
mkdir -p "$CURRENT_DIR" # -p确保父目录存在
# 获取所有数据库列表(排除系统数据库)
# mysql命令:-u用户名 -p密码 -e执行SQL;grep -Ev排除指定数据库
databases=$(mysql -u"$DB_USER" -p"$DB_PASS" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)")
# 循环备份每个数据库
for db in $databases; do
# 备份文件名:数据库名.sql.gz(用gzip压缩)
backup_file="$CURRENT_DIR/${db}.sql.gz"
# mysqldump:导出数据库;--single-transaction确保InnoDB数据一致性
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction "$db" | gzip > "$backup_file"
# 检查备份是否成功
if [ $? -eq 0 ]; then # $?是上一条命令的退出码(0=成功)
echo "备份成功:$backup_file"
else
echo "备份失败:$db" >&2 # >&2:输出到标准错误
rm -f "$backup_file" # 删除失败的备份文件
fi
done
# 清理过期备份(删除超过RETENTION_DAYS天的目录)
# -type d:目录;-mtime +$RETENTION_DAYS:修改时间超过指定天数;-exec执行删除
find "$BACKUP_ROOT" -type d -mtime +"$RETENTION_DAYS" -exec rm -rf {} \;
echo "清理完成:保留最近$RETENTION_DAYS天的备份"
使用说明:
-
替换
DB_USER
、DB_PASS
等参数为实际值; -
赋予执行权限:
chmod +x mysql_backup.sh
; -
测试运行:
./mysql_backup.sh
; -
设置定时任务(每天凌晨 3 点执行):
bashcrontab -e # 编辑定时任务 # 添加一行: 0 3 * * * /path/to/mysql_backup.sh
第七章 网络配置与调试
7.1 网络诊断工具
查看网络接口与 IP:
bash
# 1. ip命令(推荐,替代老旧的ifconfig)
$ ip addr show # 显示所有网络接口的详细信息
$ ip addr show eth0 # 仅显示eth0接口
# 输出中"inet 192.168.1.100/24"表示IP地址为192.168.1.100,子网掩码255.255.255.0
# 2. 查看路由表
$ ip route show # 显示路由信息(默认网关等)
default via 192.168.1.1 dev eth0 # 默认网关为192.168.1.1
# 3. 旧版ifconfig(需安装net-tools)
$ sudo apt install net-tools # 安装
$ ifconfig eth0 # 查看eth0的IP、MAC等信息
网络连通性测试:
bash
# 1. ping:测试主机可达性(ICMP协议)
$ ping 8.8.8.8 # 测试与Google DNS的连通性
$ ping -c 4 baidu.com # -c 4:发送4个包后停止
# 2. traceroute:跟踪数据包到达目标的路径
$ traceroute 8.8.8.8 # 默认使用UDP
$ traceroute -T 8.8.8.8 # -T:使用TCP协议(避免被防火墙拦截)
# 3. curl/wget:测试HTTP连接
$ curl http://example.com # 访问网页并输出内容
$ wget http://example.com/file.txt # 下载文件
端口与服务检查:
bash
# 1. ss:查看端口监听状态(替代netstat)
$ ss -tulnp # 常用选项:t=TCP,u=UDP,l=监听中,n=数字显示端口,p=进程名
$ ss -tulnp | grep :80 # 检查80端口是否被监听
# 2. netstat(旧版,需安装net-tools)
$ netstat -tulnp | grep :22 # 检查SSH(22端口)
# 3. telnet:测试端口是否开放
$ telnet example.com 80 # 测试example.com的80端口
7.2 防火墙管理
防火墙用于控制网络流量,Ubuntu 默认用 UFW,CentOS 默认用 Firewalld。
UFW(Uncomplicated Firewall,Ubuntu):
bash
# 1. 基本操作
$ sudo ufw status # 查看防火墙状态
$ sudo ufw enable # 启用防火墙(开机自启)
$ sudo ufw disable # 禁用防火墙
# 2. 规则配置
$ sudo ufw allow 22/tcp # 允许TCP 22端口(SSH)
$ sudo ufw allow 80/tcp # 允许HTTP(80端口)
$ sudo ufw allow from 192.168.1.0/24 # 允许192.168.1.0网段的所有流量
$ sudo ufw deny from 10.0.0.5 # 拒绝来自10.0.0.5的所有流量
$ sudo ufw delete allow 80/tcp # 删除规则
# 3. 查看规则
$ sudo ufw status numbered # 显示带编号的规则(方便删除)
Firewalld(CentOS/RHEL):
bash
# 1. 基本操作
$ sudo firewall-cmd --state # 查看状态
$ sudo systemctl start firewalld # 启动
$ sudo systemctl enable firewalld # 开机自启
# 2. 规则配置(--permanent表示永久生效,需reload)
$ sudo firewall-cmd --zone=public --add-service=http --permanent # 允许HTTP服务
$ sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent # 允许8080/TCP
$ sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent # 删除规则
# 3. 重载规则(使永久规则生效)
$ sudo firewall-cmd --reload
# 4. 查看规则
$ sudo firewall-cmd --list-all # 查看public区域的所有规则
第八章 系统服务管理
现代 Linux 发行版(如 Ubuntu 16.04+、CentOS 7+)采用 systemd 管理系统服务,替代了传统的 SysVinit。
8.1 Systemd 服务控制
systemd 使用单元文件 (unit file)定义服务,通常位于/etc/systemd/system/
或/usr/lib/systemd/system/
。
bash
# 1. 查看服务状态
$ systemctl status nginx # 显示nginx服务的详细状态(运行中、已停止等)
# 输出中"active (running)"表示运行正常
# 2. 服务基本操作
$ sudo systemctl start nginx # 启动服务
$ sudo systemctl stop nginx # 停止服务
$ sudo systemctl restart nginx # 重启服务(先停后启)
$ sudo systemctl reload nginx # 重新加载配置(不中断服务)
# 3. 开机自启管理
$ sudo systemctl enable nginx # 设置开机自启
$ sudo systemctl disable nginx # 取消开机自启
$ sudo systemctl is-enabled nginx # 查看是否开机自启
# 4. 分析系统启动时间
$ systemd-analyze # 显示总启动时间
$ systemd-analyze blame # 显示各服务的启动耗时(从长到短)
自定义 systemd 服务(以 Python 应用为例):
创建服务文件/etc/systemd/system/myapp.service
:
ini
[Unit]
Description=My Python Web Application # 服务描述
After=network.target # 在网络服务启动后启动
[Service]
User=appuser # 运行服务的用户
Group=appuser # 运行服务的组
WorkingDirectory=/opt/myapp # 工作目录
ExecStart=/opt/myapp/bin/gunicorn -w 4 app:app # 启动命令(gunicorn是Python WSGI服务器)
Restart=on-failure # 失败时自动重启
RestartSec=5 # 重启间隔5秒
[Install]
WantedBy=multi-user.target # 多用户模式下启动
应用配置并启动:
bash
sudo systemctl daemon-reload # 重新加载服务文件
sudo systemctl start myapp
sudo systemctl enable myapp
8.2 日志分析
systemd 通过 journalctl 统一管理系统日志,替代了传统的/var/log
下的多个日志文件。
bash
# 1. 查看所有日志(按时间倒序)
$ journalctl -r # -r:反向输出(最新的在前)
# 2. 查看特定服务的日志
$ journalctl -u nginx # -u:指定服务单元(unit)
$ journalctl -u nginx -f # -f:实时跟踪日志(类似tail -f)
# 3. 按时间筛选
$ journalctl --since "2023-08-01 00:00:00" --until "2023-08-10 23:59:59"
$ journalctl --since yesterday # 昨天至今的日志
$ journalctl --since "1 hour ago" # 1小时前至今的日志
# 4. 结合服务和时间筛选
$ journalctl -u apache2 --since "2023-08-05" --until "2023-08-06"
第九章 安全加固实践
9.1 SSH 安全配置
SSH 是远程管理 Linux 的主要方式,需通过配置增强安全性。
bash
# 编辑SSH配置文件
sudo vim /etc/ssh/sshd_config
# 关键配置项(修改后需重启sshd服务):
Port 2222 # 更改默认端口(22→2222,减少扫描攻击)
PermitRootLogin no # 禁止root直接登录(需用普通用户登录后su切换)
PasswordAuthentication no # 禁用密码认证(强制使用密钥认证)
PubkeyAuthentication yes # 启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys # 公钥存放路径
AllowUsers alice bob # 仅允许指定用户登录(按需配置)
# 重启SSH服务使配置生效
sudo systemctl restart sshd
配置密钥认证:
-
在本地生成密钥对:
bashssh-keygen -t ed25519 -C "your_email@example.com" # 生成ed25519类型密钥(更安全)
-
将公钥上传到服务器:
bashssh-copy-id -p 2222 alice@server_ip # 上传公钥到服务器的alice用户
-
测试登录(无需密码):
bashssh -p 2222 alice@server_ip
9.2 用户权限控制
创建受限用户:
bash
# 创建普通用户
$ sudo adduser devuser # 交互式创建(设置密码、全名等)
# 创建受限shell用户(仅允许执行特定命令)
$ sudo adduser devuser --shell /bin/rbash # rbash是受限bash(禁止cd、设置PATH等)
# 限制用户只能执行指定命令(通过rbash的配置)
$ sudo mkdir -p /home/devuser/bin
$ sudo ln -s /usr/bin/ls /home/devuser/bin/ # 仅允许ls命令
$ sudo ln -s /usr/bin/pwd /home/devuser/bin/ # 仅允许pwd命令
# 修改用户的.bashrc,限制PATH
echo "PATH=/home/devuser/bin" >> /home/devuser/.bashrc
sudo 权限管理:
sudo 允许普通用户执行特权命令,配置文件为/etc/sudoers
(需用visudo
编辑,避免语法错误)。
bash
$ sudo visudo # 安全编辑sudoers文件
# 配置示例:
# 允许devuser无密码执行apt update和apt upgrade
devuser ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade
# 允许adminuser执行所有命令(类似root)
adminuser ALL=(ALL) ALL
第十章 综合实战项目:部署 Python Web 应用
本项目将部署一个基于 Flask 的 Python Web 应用,使用 Gunicorn 作为 WSGI 服务器,通过 systemd 管理服务,并配置 Nginx 作为反向代理。
步骤 1:准备环境
bash
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装依赖
sudo apt install -y python3 python3-venv python3-pip nginx
步骤 2:部署应用代码
bash
# 创建应用目录
sudo mkdir -p /opt/myapp
sudo chown $USER:$USER /opt/myapp # 赋予当前用户权限
# 克隆代码(假设代码在Git仓库)
git clone https://github.com/yourusername/yourflaskapp.git /opt/myapp
cd /opt/myapp
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate # 提示符变为(venv)
# 安装依赖
pip install -r requirements.txt # requirements.txt包含Flask、gunicorn等
pip install gunicorn # 安装WSGI服务器
步骤 3:配置 Gunicorn 与 systemd
创建 Gunicorn 启动脚本(或直接在 systemd 服务中配置):
bash
# 创建systemd服务文件
sudo tee /etc/systemd/system/myapp.service <<EOF
[Unit]
Description=Flask Web Application
After=network.target
[Service]
User=$USER
Group=$USER
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app
# 解析:-w 4=4个工作进程;-b 127.0.0.1:8000=绑定本地8000端口;app:app=Flask应用实例
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 启动服务并设置开机自启
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
# 检查服务状态
sudo systemctl status myapp
步骤 4:配置 Nginx 反向代理
Nginx 用于接收外部请求,转发到 Gunicorn(隐藏后端端口,提供静态文件支持)。
bash
# 创建Nginx配置文件
sudo tee /etc/nginx/sites-available/myapp <<EOF
server {
listen 80;
server_name your_domain.com; # 替换为你的域名或IP
location /static {
alias /opt/myapp/static; # 静态文件目录
}
location / {
proxy_pass http://127.0.0.1:8000; # 转发到Gunicorn
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
}
}
EOF
# 启用配置(创建软链接)
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
# 检查Nginx配置语法
sudo nginx -t
# 重启Nginx
sudo systemctl restart nginx
# 开放80端口(防火墙)
sudo ufw allow 80/tcp
步骤 5:验证部署
通过浏览器访问服务器的 IP 或域名,若能看到应用页面,说明部署成功。
附录:常用命令速查表
类别 | 命令 | 功能描述 |
---|---|---|
文件操作 | find / -name "*.conf" |
全局搜索扩展名为.conf 的文件 |
权限管理 | chown -R user:group dir |
递归修改目录的所有者和所属组 |
网络调试 | tcpdump port 80 |
抓取 80 端口的网络流量(HTTP) |
性能监控 | vmstat 5 |
每 5 秒刷新一次系统资源使用情况(CPU、内存、IO) |
压缩解压 | tar xvf archive.tar --strip-components=1 |
解压 tar 文件时去除第一层目录 |
进程管理 | pstree -p |
以树状图显示进程关系(含 PID) |
用户管理 | id username |
查看用户的 UID、GID 及所属组 |
磁盘管理 | lsblk -f |
查看磁盘分区及文件系统类型 |
学习资源与参考文献
- 官方文档 :
- Ubuntu 官方文档:https://help.ubuntu.com/
- Linux 内核文档:https://www.kernel.org/doc/html/latest/
- systemd 手册:https://www.freedesktop.org/software/systemd/man/
- 经典书籍 :
- 《鸟哥的 Linux 私房菜》(第四版),鸟哥 著
- 《Linux 命令行与 shell 脚本编程大全》(第三版),Richard Blum 著
- 《UNIX 环境高级编程》(第三版),W. Richard Stevens 著
- 在线资源 :
- Linux 命令大全:https://man.linuxde.net/
- Stack Overflow(Linux 相关问答):https://stackoverflow.com/questions/tagged/linux
- FHS 标准:https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html
- 本文参考代码与结构来源 :
- 基于 Ubuntu 22.04 LTS 系统实测命令
- Linux 社区公认的最佳实践与安全配置指南
通过本文的系统学习,可以掌握 Linux 的核心操作、脚本编程、服务部署及安全加固等技能。建议结合实际场景多动手实践,逐步深入内核机制、容器化(Docker/K8s)、自动化运维(Ansible)等进阶领域。