linux笔记

linux 指令大全

1Linux 目录结构

  1. linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。
  2. 在 Linux 世界里,一切皆文件

1. 根目录 /

  • 所有目录和文件的起点,所有其他目录都挂载在根目录下。

2. 核心目录

目录 用途 典型内容示例
/bin 基础命令(所有用户可用) ls, cp, cat, bash 等二进制可执行文件
/boot 系统启动文件 内核文件(vmlinuz-*)、引导加载器(如 GRUB)、initramfs 镜像等
/dev 设备文件(硬件或虚拟设备的接口) /dev/sda(硬盘)、/dev/tty(终端)、/dev/null(空设备)等
/etc 系统级配置文件 /etc/passwd(用户账户)、/etc/fstab(挂载表)、/etc/network/(网络配置)
/home 用户家目录(普通用户的个人空间) /home/username/ 包含用户的文档、下载、配置文件(如 .bashrc)等
/lib 共享库文件(支持 /bin 和 /sbin 中的程序) 动态链接库(.so 文件),例如 libc.so(C 标准库)
/media 可移动设备挂载点(自动挂载) 插入 U 盘或光盘后,通常挂载到 /media/usb 或 /media/cdrom 等目录下
/mnt 临时手动挂载点(管理员手动挂载设备) 例如临时挂载硬盘到 /mnt/disk
/opt 第三方软件安装目录(可选应用程序) 如 Oracle Database、WPS Office 等非系统级软件
/proc 虚拟文件系统(内核和进程的实时信息) /proc/cpuinfo(CPU 信息)、/proc/meminfo(内存信息)等,重启后消失
/root root 用户的家目录 root 用户的个人配置和文件
/run 运行时数据(系统启动后生成的临时文件) 如 /run/pid(进程 PID 文件)、/run/lock(锁文件)
/sbin 系统管理命令(需 root 权限执行) fdisk(磁盘分区)、ifconfig(网络配置)、iptables(防火墙)等
/srv 服务数据(存放服务相关文件,如 Web 或 FTP 数据) 例如 /srv/http/(网页文件)、/srv/ftp/(FTP 文件)
/sys 虚拟文件系统(硬件和内核的配置信息) 用于与内核交互,例如电源管理、设备驱动参数等
/tmp 临时文件(所有用户可读写,重启后可能被清理) 临时下载、缓存文件等
/usr 用户程序和数据(类似 Windows 的 Program Files) 包含子目录如 /usr/bin(用户命令)、/usr/lib(库)、/usr/share(共享数据)
/var 可变数据(频繁变化的文件,如日志、数据库等) /var/log(系统日志)、/var/www(网站根目录)、/var/lib(数据库文件)

3. /usr 的子目录

目录 用途
/usr/bin 用户级应用程序的命令(如 gcc, python)
/usr/sbin 系统管理命令(非关键,可能需要 root 权限)
/usr/lib 应用程序的共享库文件
/usr/local 本地编译安装的软件(通常手动安装的软件,优先级高于系统自带)
/usr/share 架构无关的共享数据(如文档、字体、图标等)
/usr/include 头文件(用于开发,如 C/C++ 的头文件)

4. /var 的子目录

目录 用途
/var/log 系统日志(如 syslog, auth.log 等)
/var/cache 应用程序缓存数据
/var/spool 队列数据(如邮件、打印任务)
/var/run 运行时信息(已迁移到 /run,符号链接到 /run)

5. 特殊说明

  • 符号链接:某些目录可能是符号链接。例如,现代系统中 /bin → /usr/bin、/lib → /usr/lib,实现了目录合并。
  • 虚拟文件系统:/proc 和 /sys 不占用磁盘空间,内容在内存中动态生成。
  • 权限差异:如 /sbin 和 /usr/sbin 中的命令通常需要 root 权限,而 /bin 和 /usr/bin 中的命令普通用户可使用。

6. 示例:常见文件路径

  • 用户管理:/etc/passwd(用户信息)、/etc/shadow(密码哈希)
  • 网络配置:/etc/resolv.conf(DNS)、/etc/hosts(静态主机名解析)
  • 日志检查:/var/log/syslog(通用日志)、/var/log/auth.log(认证日志)
  • 磁盘管理:/etc/fstab(挂载配置)、/dev/sda1(第一块硬盘的第一个分区)

2.Vi 和 Vim 编辑器

2.1 基本介绍

Linux 系统会内置 vi 文本编辑器 Vim 具有程序编辑的能力,可以看做是 Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用

2.2vi 和 vim 常用的三种模式

  1. 正常模式

    以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来 移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、粘贴』来处理你的文件数据

  2. 插入模式

    按下 i, I, o, O, a, A, r, R 等任何一个字母之后才会进入编辑模式, 一般来说按 i 即可

  3. 命令行模式

    输入 ==esc== 再输入 ==:== 在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的动作则是在此模式中达成的

2.3 各种模式的相互切换

image-20250415231626620

2.3vim 常用命令

2.3.1 常用编辑命令

  • i :再光标处插入文本
  • a :在光标后插入文本
  • o :在当前行下方插入新行
  • dd :删除(剪切)当前行; 删除当前行向下的 5 行 5dd
  • yy :复制当前行 ;拷贝当前行向下的 5 行 5yy
  • p :粘贴剪贴板内容到光标下方。
  • u :撤销上一次操作。
  • ctrl+r :重做上一次撤销的操作

2.3.2 移动和搜索命令

  • h, j, k, l :分别向左、下、上、右移动光标。
  • /word:向下搜索名为 word 的字符串。
  • ?word:向上搜索名为 word 的字符串
  • n:重复上一次搜索命令
  • G: 跳转到文档最末行
  • gg: 跳转到文档最首行

2.3.3 文件操作命令

  • : e filename : 打开文件。
  • : w:保存文件
  • : q:退出 vim
  • : wq 或 zz:保存文件并退出 vim
  • : q!:强制退出 vim
  • : set nu:设置文件行号
  • : set nonu :取消文件行号

2.4vim 键盘图

image-20250415233212702

3.开机、重启和用户登录注销

3.1 关机&重启命令

3.1.1 基本介绍

  • shutdown -h now :立刻进行关机
  • shutdown -h num:num 分钟后关机
  • shutdown -r now: 立即重启
  • halt:关机
  • reboot:重启
  • sync:把内存的数据同步到磁盘

3.1.2 注意事项

  • 不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中
  • 目前的 shutdown/reboot/halt 等命令均已经在关机前进行了 sync

3.2 用户登录和注销

(1)登录时尽量少用 root 帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可以利用普通用户登录,登录后再用**”su- 用户名 “ ** 命令来切换成系统管理员身份。

(2)在提示符下输入 logout 或 exit 即可注销用户;

(3)logout 注销指令在图形运行级别无效,在运行级别 3 下有效.

4.用户管理

4.1 基本介绍

Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个 账号,然后以这个账号的身份进入系统

4.2 用户

  • useradd:添加用户

  • passwd 用户名:设置或修改密码

  • userdel 用户名:删除用户

  • id 用户名 查询用户

  • su -用户名 :切换用户

  • who am i :查看当前用户

  • who am I :查看登录用户

4.3 用户组

  • groupadd 组名:添加用户组

  • groupdel 组名 :删除组

  • useradd -g 组名 用户名 :添加用户时直接添加到指定组

  • usermod -g 组名 用户名 :修改用户的组

4.4 用户和组相关文件

(1)/etc/passwd 文件

用户(user)的配置文件,记录用户的各种信息 每行的含义:用户名: 口令: 用户标识号: 组标识号: 注释性描述: 主目录: 登录 Shell

(2)/etc/shadow 文件

口令的配置文件, 每行的含义:登录名: 加密口令: 最后一次修改时间: 最小时间间隔: 最大时间间隔: 警告时间: 不活动时间: 失效时间: 标志

(3)/etc/group 文件

组(group)的配置文件,记录 Linux 包含的组的信息 每行含义:组名: 口令: 组标识号: 组内用户列表

5.实用指令

5.1 指定运行级别

5.1.1 基本介绍

运行级别说明:

  • 0 :关机

    系统默认运行级别不能设置为 0,否则无法正常启动系统(一开机就自动关机)

  • 1 :单用户【找回丢失密码】

    也称为救援模式,具有 root 权限,用于系统维护,禁止远程登录,没有网络功能,类似 Windows 下的安全模式

  • 2:多用户状态没有网络服务

    没有 NFS 网络支持

  • 3:多用户状态有网络服务

    有 NFS 和网络支持,登录后进入控制台命令行模式

  • 4:系统未使用保留给用户

    保留一般不用,在一些特殊情况下可以用它来做一些事情

  • 5:图形界面

    登录后进入图形 GUI 模式或 GNOME、KDE 图形化界面

  • 6:系统重启

    默认运行级别不能设为 6,否则系统会无限重启,无法正常启动

常用运行级别是 3 和 5 ,也可以指定默认运行级别

5.1.2 切换运行级别指令

在 Linux 系统中,可以使用 init 命令来切换启动级别。

1
init  运行级别号

例如:

1
2
3
4
5
6
7
8
9
10
11
# 切换到关机模式
init 0

# 切换到多用户文本模式
init 3

# 切换到图形化模式
init 5

# 重启系统
init 6

还可以使用 systemctl 命令来设置和切换启动级别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看当前默认启动级别
systemctl get-default

# 设置默认启动级别为多用户文本模式
systemctl set-default multi-user.target

# 设置默认启动级别为图形化模式
systemctl set-default graphical.target

# 切换到多用户文本模式
systemctl isolate multi-user.target

# 切换到图形化模式
systemctl isolate graphical.target

5.1.3 找回 root 密码

(1)找回 root 密码需要切换到单用户模式下。

如何进入到单用户模式呢?这就要拼手速了。

在开机时出现该界面时按下方向键,此界面只存在 5 秒,如果错过就得重新开机了。然后选择第一条语句 按下 c 键进入。

image-20250416112248876

将光标移到 UTF-8 这里

image-20250416113654943

在后面加入 init =/bin/sh 指令 ,再输入 ctr+x

1
init=/bin/sh

image-20250416113958003

然后再输入 mount -o remount, rw / ,然后回车

1
mount -o remount,rw /

image-20250416114210634

然后输入 passwd 设置新密码

image-20250416114623641

再输入 touch /.autorelabel 回车

1
touch /.autorelabel

image-20250416114932602

最后再输入 exec /sbin/init ,耐心等待虚拟机重启

1
exec /sbin/init

重启后就能用刚刚设置的密码登录了

5.2 帮助指令

5.2.1man 获得帮助信息

1
man [命令或配置文件]

5.2.2 help 指令

获得 shell 内置命令的帮助信息

1
help 命令

5.3 文件目录类

1
pwd

功能描述:显示当前工作目录的绝对路径)

1
ls [选项] [目录或文件]

常用选项:

-a :显示当前目录所有的文件和目录,包括隐藏的。

-l :以列表的方式显示信息

1
cd [参数]

功能描述:切换到指定目录

注意:用相对路径切换时,若待切换目录在目前目录下,则不用加/, 否则必须要加/

例如:

1
2
3
4
5
6
7
8
9
10
11
#从root->home
cd /home

#从home->
cd

#回到自己的家目录, 比如 你是root , cd~ 到 /root
cd~ 或者cd :

#回到当前目录的上一级目录
cd ..
1
mkdir [选项]  要创建的目录

作用:创建目录

常用选项-p :创建多级目录

1
rmdir [选项] 要删除的目录

作用:删除目录

注:

rmdir 删除的是空目录,如果目录下有内容时无法删除的。

如果需要删除非空目录,需要使用 rm-rf 要删除的目录

r 表示递归, f(force)表示强制

1
touch 文件名称

作用:创建 空文件

1
cp [选项] source dest

作用:拷贝文件到指定目录

常用选项

-r :递归复制整个文件夹

强制覆盖不提示的方法:\cp

1
rm [选项] 要删除的文件或目录

作用:删除指定文件或目录

常用选项

-r :递归删除整个文件夹

-f : 强制删除不提示

两者可以合起来写 rf,也可以分开写 -r -f

1
2
3
4
5
#文件重命名
mv oldFileName newFileName

#移动文件
mv now target

作用:移动文件与目录或重命名

1
cat [选项] 要查看的文件

作用:查看文件信息

常用选项:

-n :显示行号

注意:

cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上管道命令 | more

1
more

more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more 指令中内置了若干快捷键(交互的指令),如下

操作 功能说明
空格键 向下翻一页
Enter 向下翻一行
q 退出 more , 不在显示该文件内容
Ctrl + F 向下滚动一屏
Ctrl + B 返回上一屏
= 输出当前行的行号
: f 输出文件名和当前行的行号
1
less  fileName

作用:less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有 较高的效率.

应用:用于查找大型文件

操作说明:

操作 功能说明
空格键 向下翻一页
pagedown 向下翻一页
pageup 向上翻一页
q 退出 less , 不在显示该文件内容
/字符串 向下搜索【字符串】;n: 向下查找;N:向上查找
?字符串 向上搜索【字符串】;n: 向上查找;N:向下查找
1
echo [选项] [输出内容]

作用: 输出内容到控制台

应用:使用 echo 指令输出环境变量, 例如

1
2
3
echo $PATH
echo $HOSTNAME
echo $HOSTNAME
1
head 文件 

作用:head 用于显示文件的开头部分内容,默认情况下 head 指令显示文件的 前 10 行 内容

可以用 -n 更改显示的行数

1
2
#查看文件头5行内容,5可以是任意行数
head -n 5
1
tail [选项] 文件

作用:tail 用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的前 10 行内容。

常用选项:

-n:指定显示的行数

-f:实时追踪该文档的所有更新

1
2
3
4
5
#输出重定向
>

#追加
>>

常见用法:

1
2
3
4
5
6
7
8
9
10
11
#列表的内容写入文件a.txt中(覆盖写)
ls-l >文件

#列表的内容追加到文件aa.txt的末尾
ls-al >>文件

#将文件1的内容覆盖到文件2
cat 文件1> 文件2

#内容追加
echo "内容">> 文件
1
ln -s [原文件或目录][软链接名]

功能:给原文件创建一个软链接

应用:

1
2
3
4
5
#在/home 目录下创建一个软连接 myroot,连接到 /root 目录
ln -s /root /home/myroot

#: 删除软连接 myroot
rm /home/myroot

注意:当我们使用 pwd 指令查看目录时,仍然看到的是软链接所在目录。

1
history

作用:查看已经执行过历史命令, 也可以执行历史指令

应用:

1
2
3
4
5
6
7
8
#案例1: 显示所有的历史命令
history

#案例2: 显示最近使用过的10个指令。
history 10

#案例3:执行历史编号为5的指令
!5

5.4 时间日期类

5.4.1date 指令–显示当前日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#显示当前时间 
date

#显示当前年份
date +%Y

#显示当前月份
date +%m

#显示当前是哪一天
date +%d

#自定义时间格式
date "+%Y-%m-%d %H:%M:%S"

5.4.2date 指令-设置日期

1
date -s  字符串时间

例如:

1
2
#设置系统当前时间 , 比如设置成 2025-4-16 13:14:10
date -s "2025-4-16 13:14:10"

还原到当前时间

1
hwclock -s

5.4.3 cal 指令

1
cal [选项] 

作用:

  • 若不加选项,只显示本月日历
  • 加上年份 ,则显示当年的全部日历

例如:

image-20250416132253225

5.5 搜索查找类

5.5.1find 指令

find 指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端.

语法:

1
find [路径] [选项] [表达式]

常用选项:

(1)按名称查找

-name:匹配文件名(区分大小写)

1
2
3
4
5
 # 查找 /home 下所有 .jpg 文件
find /home -name "*.jpg"

# 当前目录及子目录中查找file.txt
find . -name "file.txt"

-iname:不区分大小写的文件名匹配。

1
2
# 查找 README.md、Readme.MD 等
find . -iname "readme.md"

(2)按类型查找

-type :指定文件类型

  • f:普通文件
  • d:目录
  • l:符号链接
1
2
3
4
 # 查找 /var 下的名为 log 的目录
find /var -type d -name "log"
# 查找用户主目录下的空文件
find ~ -type f -empty

(3) 按时间过滤

-mtime:按修改时间(天数)

  • +3:3 天前
  • -3:最近 3 天内
1
2
find /var/log -mtime -1        # 查找 24 小时内修改过的文件
find /backup -mtime +30 # 查找 30 天前修改的文件

-mmin:按修改时间(分钟)

1
2
 # 查找最近 60 分钟内修改的文件
find . -mmin -60

(4)按大小过滤

-size:按文件大小

  • +10M:大于 10MB
  • -1G:小于 1GB
1
2
3
4
5
# 查找系统中大于 500MB 的文件
find / -size +500M

# 查找当前目录小于 10KB 的文件
find . -size -10k

(5) 按权限过滤

-perm:匹配权限模式

1
2
find . -perm 644              # 查找权限为 644 的文件
find /usr/bin -perm /u=x # 查找用户可执行的文件

(6)组合条件

-a:逻辑与

1
find . -name "*.log" -type f  # 查找所有 .log 文件(普通文件)

-o:逻辑或

1
find . $ -name "*.sh" -o -name "*.py" $  # 查找 .sh 或 .py 文件

!:逻辑非

1
find . ! -name "*.tmp"        # 排除 .tmp 文件

5.5.2locate 指令

locate 是 Linux 中用于快速查找文件的命令,它通过预建的数据库(而非实时遍历文件系统)实现高速搜索,适合快速定位已知文件。

基本用法:

1
locate [选项] <文件名/模式>
核心特性
  1. 基于数据库

    • locate 依赖 mlocate.db 数据库(由 updatedb 定期生成)。

    • 数据库更新:

      1
      sudo updatedb    # 手动更新数据库(默认每天自动更新)
    • 新建文件可能无法立即找到:需先更新数据库或等待自动更新。

  2. 搜索速度极快

    适合快速模糊匹配,但结果可能不是最新状态(取决于数据库更新频率)。

常用选项与示例

1. 基础搜索

  • 按文件名模糊匹配
1
2
locate .bashrc       # 查找所有路径中包含 ".bashrc" 的文件
locate *.conf # 查找所有后缀为 .conf 的文件

2. 精确匹配

  • -b:仅匹配文件名(不包含路径)。

    1
    locate -b "\nginx.conf"  # 精确查找文件名为 "nginx.conf" 的文件

  1. 忽略大小写
  • -i:不区分大小写。

    1
    locate -i "readme.md"    # 匹配 Readme.md、README.MD 等

4. 限制结果数量

  • -n <数字>:仅显示前 N 条结果。

    1
    locate -n 10 "*.log"     # 显示前 10 条 .log 文件的路径

5. 显示匹配模式

  • -l <数字>:控制每行显示的结果数。

    1
    locate -l 5 "*.jpg"     # 每行显示 5 个结果

6. 统计数据库信息

  • -S:显示数据库统计信息(文件数、索引大小等)。

    1
    locate -S
与 find 的对比
特性 locate find
速度 极快(基于预建数据库) 较慢(实时遍历文件系统)
实时性 依赖数据库更新(非实时) 实时
搜索条件 简单文件名匹配 支持复杂条件(类型、时间、权限等)
适用场景 快速模糊查找 精确条件或需要实时性的操作

5.5.3grep 指令和 管道符号 |

5.5.3.1 grep 基础用法

功能:在文件或输入流中匹配 文本模式(支持正则表达式)

基本语法:

1
grep [选项] "模式" [文件]

常用选项

选项 说明
-i 忽略大小写
-v 反向匹配(排除匹配项)
-n 显示匹配行的行号
-c 统计匹配行数(而非具体内容)
-r 递归搜索目录中的文件
-E 启用扩展正则表达式(等同于 egrep)
-A N 显示匹配行及其后 N 行
-B N 显示匹配行及其前 N 行
-C N 显示匹配行及其前后各 N 行
--color 高亮显示匹配内容

示例:

1.查找文件中包含 “error” 的行:

1
grep "error" /var/log/syslog

2.忽略大小写搜索 “warning”:

1
grep -i "warning" app.log

3.统计包含 “GET” 的请求行数

1
grep -c "GET" access.log

4.递归搜索目录中所有文件包含 “TODO” 的行

1
grep -rn "TODO" ~/projects/
5.5.3.2 管道符 | 的核心作用

功能:将 前一个命令的输出 作为 后一个命令的输入。

例子:

1、查找进程并过滤

1
ps aux | grep "nginx"

2、 统计日志中独立 IP 数量:

1
cat access.log | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c
5.5.3.3 grep 与管道的组合用法
场景 1:过滤其他命令的输出

列出当前目录下所有 .log 文件:

1
ls -l | grep "\.log"

监控日志实时输出并匹配关键字:

1
tail -f app.log | grep "error"

场景 2:多级过滤

查找包含 “user” 但排除 “test” 的行:

1
cat data.txt | grep "user" | grep -v "test"

场景 3:结合 find 搜索文件内容

查找所有 .conf 文件中包含 “timeout” 的行:

1
find /etc -name "*.conf" -exec grep -H "timeout" {} \;

或使用管道(需结合 xargs):

1
find /etc -name "*.conf" | xargs grep "timeout"

场景 4:提取关键信息

提取日志中的 HTTP 状态码:

1
cat access.log | grep -Eo " [0-9]{3} "

5.5.3.4 正则表达式进阶

grep 默认支持基础正则表达式(BRE),使用 -E 或 egrep 启用扩展正则表达式(ERE)。


常用正则模式

模式 说明
^start 匹配行首
end$ 匹配行尾
[a-z0-9] 匹配字母或数字
.* 匹配任意字符(含空)
\d 匹配数字(需 -P,PCRE)

示例

匹配以 “200” 结尾的行(HTTP 成功状态):

1
grep "200$" access.log

匹配包含 IPv4 地址的行:

1
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" log.txt

5.5.3.5 性能与注意事项

优化技巧

  • 减少管道层级:合并多个 grep 操作为一个正则表达式。
  • 避免不必要的输出:使用 -q 静默模式(仅检查是否存在匹配)。
  • 限制搜索范围:用 -m NUM 限制匹配次数。

5.6 压缩和解压类

5.6.1gzip/gunzip 指令

5.6.1.1 gzip 压缩文件

基本语法:

1
gzip [选项] <文件>

常用选项

选项 说明
-d 解压文件(等同于 gunzip)
-k 保留原始文件(默认压缩后会删除原文件)
-v 显示压缩进度和压缩率
-r 递归压缩目录下的所有文件(需结合 find)
-1 ~ -9 压缩级别(-1 最快,-9 压缩率最高,默认 -6)
-S .ext 指定压缩文件后缀(默认 .gz)

示例

压缩单个文件(原文件会被删除):

1
gzip file.log        # 生成 file.log.gz

保留原文件并压缩:

1
gzip -k file.log     # 生成 file.log.gz,保留原文件

指定压缩级别(高压缩率):

1
gzip -9 data.txt     # 以最高压缩级别压缩文件

递归压缩目录下的所有 .log 文件:

1
find /var/log -name "*.log" -exec gzip {} \;
5.6.1.2 gunzip 解压文件

基本语法:

1
gunzip [选项] <压缩文件>

常用选项

选项 说明
-k 保留压缩文件(默认解压后删除 .gz)
-v 显示解压进度
-c 解压到标准输出(不生成解压后的文件)

示例:

解压单个文件(原 .gz 文件会被删除):

1
gunzip file.log.gz     # 生成 file.log

保留压缩文件并解压:

1
gunzip -k file.log.gz  # 生成 file.log,保留 file.log.gz

解压到标准输出(例如查看内容):

1
gunzip -c file.gz      # 输出解压内容到屏幕,不生成文件
5.6.1.3 注意事项
  1. 默认删除原文件:

    • gzip 压缩后默认删除原文件,使用 -k 保留。

    • 也可通过重定向保留原文件:

      1
      gzip -c file.txt > file.txt.gz  # 保留原文件
  2. 不支持压缩目录:

    • gzip 只能压缩单个文件,需先用 tar 打包目录。
    • 错误用法:gzip dir/ → 会压缩目录下的每个文件,而非整个目录。
  3. 文件名后缀:

    • 默认压缩文件后缀为 .gz,解压时会自动去除。

    • 手动指定后缀:

      1
      gzip -S .z file.txt  # 生成 file.txt.z
  4. 大文件处理:

    • 压缩大文件时建议使用 -1(快速压缩)或 -9(高压缩率)。
    • 解压大文件可能占用较多内存。
  5. 权限问题:

    • 压缩/解压后的文件权限与原文件一致(除非使用 sudo)。

5.6.2 zip/unzip 指令

5.6.2.1 zip 压缩文件/目录

基本语法

1
zip [选项] <压缩包名.zip> <文件或目录列表>

常用选项

选项 说明
-r 递归压缩目录(必需)
-q 静默模式(不显示压缩过程)
-e 加密压缩(设置密码)
-x <文件> 排除指定文件/目录(支持通配符)
-i <文件> 仅包含指定文件/目录
-<级别> 压缩级别(0-9,-0 不压缩,-9 最高压缩)
-s <大小> 分卷压缩(如 -s 100m 分割为 100MB/卷)
-y 保留符号链接(默认不保留)

示例

压缩单个文件:

1
zip archive.zip file.txt      # 生成 archive.zip 包含 file.txt

压缩目录(递归):

1
zip -r project.zip /path/to/project/  # 压缩整个目录

排除特定文件:

1
zip -r backup.zip ~/docs -x "*.tmp"   # 排除所有 .tmp 文件

加密压缩(设置密码):

1
zip -e secure.zip secret.txt         # 提示输入密码

分卷压缩:

1
zip -s 100m -r split.zip large_dir/  # 生成 split.zip、split.z01 等分卷

5.6.2.2 unzip 解压文件

基本语法

1
unzip [选项] <压缩包名.zip>

常用选项

选项 说明
-d <目录> 解压到指定目录
-l 列出压缩包内容(不解压)
-o 覆盖现有文件(默认询问)
-q 静默解压(不显示输出)
-P <密码> 直接提供密码(不安全,建议避免在命令行使用)
-t 测试压缩包完整性
-n 不覆盖已存在的文件

示例

解压到当前目录:

1
unzip archive.zip

解压到指定目录:

1
unzip data.zip -d /target/path/

列出压缩包内容:

1
unzip -l archive.zip

解压加密 ZIP:

1
2
3
unzip -P mypassword secure.zip  # 直接提供密码(不安全)
# 或交互式输入密码:
unzip secure.zip # 提示输入密码

解压分卷 ZIP:

1
unzip split.zip                # 需所有分卷在同一目录
5.6.2.3 常见场景

场景 1:跨平台共享文件

1
zip -r report.zip report.docx images/  # Windows 用户可直接打开

场景 2:备份时排除临时文件

1
zip -r backup.zip /data -x "*cache*" "*.log"

场景 3:批量解压多个 ZIP

1
unzip "*.zip"                  # 解压当前目录下所有 ZIP 文件

场景 4:修复损坏的 ZIP 文件

1
2
zip -F broken.zip --out fixed.zip  # 尝试修复
unzip -t fixed.zip # 测试修复后文件

5.6.2.4 注意事项
  1. 中文文件名乱码:

    • ZIP 格式默认使用系统编码(可能导致跨平台乱码)。

    • 解压时指定编码:

      1
      unzip -O GBK win_file.zip    # 处理 Windows 中文文件名
  2. 权限保留:

    • ZIP 不保留 Linux 文件权限(如可执行权限),需用 tar 替代。
    • 使用 -y 保留符号链接,但 Windows 可能无法识别。
  3. 安全性:

    • 避免在命令行中直接使用 -P <密码>,密码可能被其他用户通过 ps 或历史记录获取。
    • 推荐交互式输入密码或使用加密工具(如 7zip)。
  4. 分卷压缩限制:

    • 分卷后的文件需保持原名顺序(如 vol.zip, vol.z01, vol.z02)。
    • 合并分卷:cat vol.z* > full.zip,再解压。

5.6.3tar 指令

tar 是 Linux 中用于归档文件的工具,可将多个文件/目录合并为单个文件(通常结合压缩工具如 gzip/bzip2/xz)。以下是其核心用法、场景示例及注意事项:

1. 基本语法

1
tar [选项] <操作模式> [文件或目录列表]

2. 核心操作模式

模式 说明
-c 创建归档文件
-x 解压归档文件
-t 查看归档内容
-r 追加文件到归档
-u 仅添加比归档中更新的文件

3. 常用选项

选项 说明
-f <文件名> 指定归档文件名(必需)
-v 显示操作过程(详细信息)
-z 使用 gzip 压缩(.tar.gz 或 .tgz)
-j 使用 bzip2 压缩(.tar.bz2)
-J 使用 xz 压缩(.tar.xz)
-C <目录> 切换目录(常用于解压到指定路径)
--exclude=<模式> 排除匹配模式的文件/目录
-p 保留文件权限和属性
-h 跟随符号链接(默认打包链接指向的文件)
--wildcards 支持通配符匹配

4. 常见场景示例

场景 1:创建归档

打包目录(不压缩):

1
tar -cvf backup.tar /path/to/dir/

打包并压缩为 .tar.gz:

1
tar -czvf archive.tar.gz /path/to/dir/

打包时排除文件:

1
tar -czvf project.tar.gz --exclude="*.tmp" ~/project/

场景 2:查看归档内容

列出归档内文件:

1
tar -tf archive.tar.gz

详细列表(显示权限、大小等):

1
tar -tvf backup.tar

场景 3:解压归档

解压到当前目录:

1
tar -xzvf archive.tar.gz

解压到指定目录:

1
tar -xzvf archive.tar.gz -C /target/path/

仅解压特定文件:

1
tar -xzvf archive.tar.gz "path/in/archive/file.txt"

场景 4:增量备份

首次全量备份:

1
tar -czvf full_backup.tar.gz -g snapshot.snar /data

后续增量备份(仅变化部分):

1
tar -czvf incr_backup.tar.gz -g snapshot.snar /data

场景 5:追加文件到归档

1
tar -rvf backup.tar new_file.txt    # 仅适用于未压缩的 .tar 文件

5. 压缩格式对比
格式 压缩工具 压缩速度 压缩率 典型用途
.tar 无 最快 无压缩 仅归档,不压缩
.tar.gz gzip 中等 中等 通用场景(日志、文本)
.tar.bz2 bzip2 慢 高 需要较高压缩率
.tar.xz xz 最慢 最高 长期存储或极限制空间环境

6. 注意事项
  1. 参数顺序:
    -f 必须紧跟文件名,否则会报错。

    1
    2
    3
    tar -czvf archive.tar.gz dir/    # 正确
    tar -czv -f archive.tar.gz dir/ # 正确(顺序灵活)
    tar -cvzf archive.tar.gz dir/ # 错误(`z` 必须在 `f` 前)
  2. 保留权限:
    解压时使用 -p 保留文件权限(如系统备份):

    1
    tar -xzpvf backup.tar.gz
  3. 处理绝对路径:

    • 避免使用绝对路径打包,否则解压时可能覆盖系统文件:

      1
      tar -czvf bad.tar.gz /etc/passwd   # 危险!解压时会覆盖 /etc/passwd
    • 推荐进入目录后打包:

      1
      cd /path/to/dir && tar -czvf ../backup.tar.gz .
  4. 分卷压缩:
    使用 split 命令分割大文件:

    1
    2
    3
    tar -cvzf - big_dir/ | split -b 2G - big_dir.tar.gz.part
    # 合并分卷:
    cat big_dir.tar.gz.part* | tar -xzvf -

7. 常见问题

Q1:如何解压非标准后缀的压缩包?

通过内容识别格式并手动指定选项:

1
2
file unknown_archive    # 查看文件类型(如 gzip 压缩)
tar -xzvf unknown_archive --format=posix # 强制解压

Q2:如何解决解压时 “time stamp in the future” 警告?

忽略时间戳校验:

1
tar -xzvf archive.tar.gz --warning=no-timestamp

Q3:如何处理含空格的文件名?

使用引号或转义符:

1
tar -czvf "files with spaces.tar.gz" "file 1.txt" "file 2.txt

6.组管理

在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。

  1. 所有者

    一般为文件的创建者, 谁创建了该文件,就自然的成为该文件的所有者。

  2. 所在组

  3. 其它组

1.查看现有组

  • 查看所有组:

    1
    cat /etc/group  # 显示所有组信息
    • 格式:组名:密码占位符:GID:组成员列表。
    • 示例:developers:x:1001:alice,bob 表示组名为 developers,GID 为 1001,包含用户 alice 和 bob。
  • 查看当前用户所属组:

    1
    2
    3
    groups      # 列出当前用户的所有组
    id # 显示用户UID、主组GID及附加组
    groups alice # 查看用户 `alice` 的所属组

2. 创建新组

  • 创建普通组:

    1
    sudo groupadd developers  # 创建组名 `developers`
    • 默认 GID 由系统分配,也可指定 GID:

      1
      sudo groupadd -g 2000 developers  # 指定GID为2000
  • 创建系统组(通常用于服务或系统进程):

    1
    sudo groupadd -r systemgroup  # 创建系统组,GID从保留范围分配

3. 将用户添加到组

  • 添加用户到附加组(保留原有组):

    1
    sudo usermod -aG developers alice  # 将用户 `alice` 追加到 `developers` 组
    • -aG 表示追加(Append)到附加组,避免覆盖原有组。
  • 修改用户的主组:

    1
    sudo usermod -g developers alice  # 将 `alice` 的主组改为 `developers`

4. 从组中移除用户

  • 手动编辑 /etc/group 文件:

    • 找到目标组行,删除用户名。
  • 使用 gpasswd 命令:

    1
    sudo gpasswd -d alice developers  # 将 `alice` 从 `developers` 组移除

5. 删除组

  • 删除空组

    1
    sudo groupdel developers  # 删除组 `developers`
  • 如果组是用户的主组

    • 需先修改用户的主组:

      1
      sudo usermod -g newgroup alice  # 将 `alice` 的主组改为 `newgroup`
    • 再删除原组。


6. 设置文件/目录的组权限

  • 修改文件所属组:

    1
    2
    sudo chgrp developers file.txt        # 将 `file.txt` 的组改为 `developers`
    sudo chown :developers directory/ # 修改目录的所属组
    • 或使用chown同时修改所有者和组:

      1
      sudo chown alice:developers file.txt  # 所有者改为 `alice`,组改为 `developers`
  • 设置目录的 SetGID 位:

    1
    sudo chmod g+s /shared_directory  # 新建文件继承父目录的组
    • 适用于协作目录,确保新文件自动属于同一组。

7. 组权限管理示例

  • 场景:团队项目目录 /project,组 developers 需要读写权限。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 创建组并添加用户
    sudo groupadd developers
    sudo usermod -aG developers alice
    sudo usermod -aG developers bob

    # 设置目录权限
    sudo chgrp developers /project
    sudo chmod 770 /project # 组内用户可读写执行
    sudo chmod g+s /project # 启用SetGID位

    # 验证权限
    ls -ld /project # 输出应包含 `drwxrws---`

8. 关键配置文件

  • **/etc/group**:存储组信息(名称、GID、成员列表)。
  • **/etc/gshadow**:存储组密码(极少使用)。
  • **/etc/passwd**:用户主组通过 GID 关联到此文件。

9. 常用命令总结

命令 作用
groupadd <组名> 创建新组
groupdel <组名> 删除组
usermod -aG <组> <用户> 将用户追加到附加组
chgrp <组> <文件> 修改文件/目录的所属组
chmod g+s <目录> 设置 SetGID 位,继承组权限
groups <用户> 查看用户所属组

7.权限管理

在 Linux 中,权限管理是控制用户和进程对文件/目录访问的核心机制

1. 权限基础

权限类型

  • **读 (r)**:查看文件内容或列出目录中的文件。
  • **写 (w)**:修改文件内容或在目录中创建/删除文件。
  • **执行 (x)**:运行程序文件或进入目录。

权限作用对象

  • **所有者 (u)**:文件/目录的创建者。
  • **所属组 (g)**:文件/目录关联的用户组。
  • **其他用户 (o)**:既不是所有者也不在所属组的用户。

2. 查看权限

使用 ls -l 查看权限:

1
2
ls -l file.txt
# 输出示例:-rwxr-xr-- 1 alice developers 1024 Jan 1 10:00 file.txt
  • 权限字段解释

    1
    -rwxr-xr--

    拆分为:

    • -:文件类型(- 普通文件,d 目录)。(第 1 个)
    • rwx:所有者 的读、写、执行权限。(2-4)
    • r-x:所属组 的读、执行权限。(5-7)
    • r--:其他用户的只读权限。(8-10)

3. 修改权限 (chmod)

符号表示法

1
chmod [ugoa][+-=][rwx] <文件/目录>
  • 示例

    1
    2
    3
    chmod u+x script.sh     # 给所有者添加执行权限
    chmod go-w file.txt # 移除组和其他用户的写权限
    chmod a=rwx dir/ # 所有人拥有全部权限(慎用!)

数字表示法

  • 权限用三位八进制数表示:所有者-组-其他用户。

    权限 二进制 十进制
    rwx 111 7
    rw- 110 6
    r– 100 4
    — 000 0
  • 示例:

    1
    2
    chmod 755 script.sh    # 所有者:rwx,组和其他用户:r-x
    chmod 644 file.txt # 所有者:rw-,组和其他用户:r--

4. 修改所有者/组 (chown/chgrp)

  • 修改所有者:

    1
    2
    sudo chown alice file.txt     # 将所有者改为 alice
    sudo chown alice:developers dir/ # 同时修改所有者和组
  • 修改所属组:

    1
    sudo chgrp developers file.txt

5. 特殊权限

SetUID (4)

  • 作用:允许用户以文件所有者的身份执行程序。

    1
    2
    chmod u+s /usr/bin/passwd   # 典型示例(修改密码需 root 权限)
    chmod 4755 script.sh # 数字表示法(4 表示 SetUID)

SetGID (2)

  • 作用:目录中新建文件继承父目录的所属组。

    1
    2
    chmod g+s /shared_dir      # 设置 SetGID
    chmod 2775 /shared_dir # 数字表示法(2 表示 SetGID)

粘滞位 (Sticky Bit, 1)

  • 作用:仅允许文件所有者和 root 删除目录中的文件(如/tmp)。

    1
    2
    chmod +t /public_dir
    chmod 1777 /public_dir # 数字表示法(1 表示粘滞位)

6. 默认权限 (umask)

  • umask 值:决定新建文件/目录的默认权限。

    • 文件默认权限:666 - umask。
    • 目录默认权限:777 - umask。
  • 查看当前 umask:

    1
    umask      # 输出示例:0022
  • 临时修改 umask:

    1
    umask 0027   # 新文件权限:640,新目录权限:750
  • 永久修改 umask:
    在用户配置文件(如 ~/.bashrc)中添加 umask 0022。


7. 权限管理场景

场景 1:共享团队目录

1
2
3
sudo mkdir /team
sudo chown admin:developers /team
sudo chmod 2770 /team # SetGID + 组可读写
  • 效果:
    • developers 组成员可读写。
    • 新文件自动属于 developers 组。

场景 2:保护敏感文件

1
chmod 600 ~/.ssh/id_rsa     # 仅所有者可读写

场景 3:允许用户运行脚本

1
chmod +x backup_script.sh   # 添加执行权限

8. 高级工具(ACL)

  • 设置访问控制列表

    (更细粒度权限):

    1
    2
    setfacl -m u:bob:rwx file.txt  # 允许用户 bob 读写执行
    getfacl file.txt # 查看 ACL 权限

9. 注意事项

  1. 避免过度开放权限:

    • 不要随意使用 chmod 777,可能引发安全隐患。
  2. 递归修改目录权限:

    1
    2
    chmod -R 755 /webroot     # 递归修改目录及子文件
    chown -R alice:dev /code # 递归修改所有者和组
  3. 系统关键文件

    • 修改系统文件权限需谨慎(如 /etc、/bin)。

10. 常用命令速查

命令 作用
chmod 755 file 设置权限为 rwxr-xr-x
chown user:group file 修改所有者和组
chgrp developers dir 修改所属组
umask 022 设置默认权限掩码
ls -l 查看详细权限

8.定时任务调度

一、cron 定时任务

1. 核心工具

  • **crontab**:管理用户级定时任务。
  • **/etc/cron.\*/**:系统级定时任务目录(如 cron.hourly、cron.daily)。

2. 用户级任务配置

编辑定时任务

1
crontab -e  # 编辑当前用户的 crontab 文件

任务格式

1
* * * * * <命令或脚本>
字段 含义 取值范围
1 分钟 0-59
2 小时 0-23
3 日期 1-31
4 月份 1-12 或 JAN-DEC
5 星期几 0-7 (0 和 7 均为周日,1 = 周一)
6 待执行命令 绝对路径命令或脚本

时间表达式示例

示例 说明
0 3 * * * 每天凌晨 3 点执行
15 14 1 * * 每月 1 日 14:15 执行
0 */6 * * * 每 6 小时执行一次
0 8-18/2 * * 1-5 工作日(周一到周五)8 点到 18 点间每 2 小时执行一次
@daily 每天午夜执行(等效于 0 0 * * *)
@reboot 系统启动时执行

示例任务

1
2
3
4
5
6
7
8
# 每天凌晨 2 点备份目录
0 2 * * * /usr/bin/rsync -a /data /backup/

# 每 10 分钟检查磁盘空间
*/10 * * * * /home/user/scripts/disk_check.sh

# 每周一 6:30 清理日志
30 6 * * 1 /bin/find /var/log -name "*.log" -mtime +7 -delete

3. 系统级任务配置

  • 目录结构:

    1
    2
    3
    4
    5
    6
    /etc/crontab          # 系统级 crontab 文件
    /etc/cron.d/ # 自定义系统任务片段
    /etc/cron.hourly/ # 每小时执行的脚本
    /etc/cron.daily/ # 每天执行的脚本
    /etc/cron.weekly/ # 每周执行的脚本
    /etc/cron.monthly/ # 每月执行的脚本
  • 文件格式:需在时间字段后指定用户身份

    1
    * * * * * <用户> <命令>

4. 管理任务

命令 说明
crontab -l 列出当前用户的定时任务
crontab -r 删除当前用户的所有任务
systemctl status cron 检查 cron 服务状态

二、at 一次性任务

1. 提交任务

1
2
3
4
at 14:30 2024-03-15   # 指定具体时间
at now + 2 hours # 2 小时后执行
at> /path/to/script.sh
at> <Ctrl+D> # 结束输入

2. 管理任务

命令 说明
atq 查看待执行的任务队列
atrm <任务ID> 删除指定任务

三、anacron(适用于非 24/7 运行的系统)

1. 配置文件

  • **/etc/anacrontab**:定义延迟执行的任务(如笔记本电脑唤醒后补执行)。

任务格式

1
<周期天数> <延迟分钟> <任务名> <命令>
  • 示例

    1
    1 5 daily_backup /usr/bin/backup.sh  # 每天执行,启动后延迟5分钟运行

四、最佳实践

  1. 使用绝对路径:
    cron 环境变量可能与 shell 不同,确保命令使用完整路径:

    1
    0 * * * * /usr/bin/python3 /scripts/monitor.py
  2. 重定向输出:
    记录任务执行日志或忽略输出:

    1
    2
    * * * * * /script.sh >> /var/log/cron.log 2>&1  # 保存输出
    * * * * * /script.sh >/dev/null 2>&1 # 丢弃输出
  3. 权限控制:

    • /etc/cron.allow 和 /etc/cron.deny 控制用户访问权限。
  4. 环境变量问题:
    在 crontab 中显式声明环境变量:

    1
    2
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

五、调试技巧

  • 手动触发测试:

    1
    run-parts --test /etc/cron.daily  # 测试脚本是否会执行(不实际运行)
  • 查看日志

    1
    tail -f /var/log/syslog | grep cron  # 查看 cron 执行记录

六、常见问题

Q1:任务未执行

  • 检查 cron 服务是否运行:systemctl status cron。
  • 检查脚本权限(是否可执行):chmod +x script.sh。
  • 检查路径和环境变量是否在 cron 中正确设置。

Q2:任务执行时间不准确

  • 系统时区设置:timedatectl。
  • 确保系统时间同步:ntpd 或 systemd-timesyncd。

9.磁盘分区、挂载

一、查看磁盘信息

首先确认系统中已识别的磁盘设备:

1
2
sudo fdisk -l    # 列出所有磁盘及分区信息
sudo lsblk # 以树状结构查看块设备(更直观)

输出示例:

1
2
3
4
5
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part /
sdb 8:16 0 100G 0 disk # 假设这是新增的磁盘

二、磁盘分区

假设要对 /dev/sdb(新磁盘)进行分区,可选工具 fdisk 或 parted。

方法 1:使用 fdisk

1
sudo fdisk /dev/sdb
  1. 输入 n 创建新分区。
  2. 选择分区类型(主分区 p 或扩展分区 e,默认选 p)。
  3. 设置分区大小(如直接回车表示使用全部空间)。
  4. 输入 w 保存并退出。

方法 2:使用 parted(适合大容量磁盘)

1
sudo parted /dev/sdb
1
2
3
(parted) mklabel gpt          # 创建GPT分区表(适用于2TB以上磁盘)
(parted) mkpart primary 0% 100% # 创建单个分区占用全部空间
(parted) quit

三、格式化分区

将分区格式化为文件系统(如 ext4 或 xfs):

1
2
3
4
# 假设分区为 /dev/sdb1
sudo mkfs.ext4 /dev/sdb1 # 格式化为 ext4
# 或
sudo mkfs.xfs /dev/sdb1 # 格式化为 XFS

四、挂载分区

1. 临时挂载(重启后失效)

1
2
sudo mkdir /mnt/data         # 创建挂载点目录
sudo mount /dev/sdb1 /mnt/data # 挂载分区

2. 永久挂载(编辑 /etc/fstab)

1
2
# 获取分区的 UUID(推荐使用 UUID 避免设备名变化)
sudo blkid /dev/sdb1

输出示例

1
/dev/sdb1: UUID="d3b8d8a1-..." TYPE="ext4"

编辑 /etc/fstab:

1
sudo vi /etc/fstab

添加一行:

1
UUID=d3b8d8a1-...  /mnt/data  ext4  defaults  0 0

保存后测试配置是否正确:

1
sudo mount -a    # 无报错则表示配置正确

五、验证挂载

1
2
df -hT /mnt/data  # 查看挂载情况
lsblk # 确认分区已挂载

六、常见问题及解决

1. 分区后未生效

1
sudo partprobe /dev/sdb  # 强制内核重新读取分区表

2. 挂载时提示权限被拒绝

1
2
3
sudo chmod 777 /mnt/data  # 临时开放权限(不推荐)
# 或修改挂载选项为更宽松权限:
UUID=... /mnt/data ext4 defaults,rw,relatime 0 0

3. 文件系统损坏

检查并修复文件系统(卸载后操作):

1
2
3
4
sudo umount /dev/sdb1
sudo fsck /dev/sdb1 # ext4 文件系统
# 或
sudo xfs_repair /dev/sdb1 # XFS 文件系统

七、关键命令总结

操作 命令示例
查看磁盘 lsblk、fdisk -l
创建分区 fdisk /dev/sdb → n → w
格式化分区 mkfs.ext4 /dev/sdb1
临时挂载 mount /dev/sdb1 /mnt/data
永久挂载 编辑 /etc/fstab,添加 UUID=... /mnt/data ext4 defaults 0 0
验证挂载 df -hT、`mount

八、注意事项

  1. 备份数据:分区和格式化会清除磁盘数据,操作前务必确认磁盘无重要数据。
  2. UUID 优势:使用 UUID 挂载可避免因设备名(如 /dev/sdb1 变为 /dev/sdc1)变化导致启动失败。
  3. 文件系统选择:
    • ext4:兼容性好,适合通用场景。
    • XFS:适合大文件和高并发写入(如数据库)。
  4. 虚拟化环境:如果是虚拟机,需先在虚拟化管理界面(如 VMware、VirtualBox)添加虚拟磁盘。

10.网络配置

一、基础网络配置

1. 查看网络接口信息

1
2
ip addr show      # 查看所有网络接口(推荐)
ifconfig # 传统命令(部分系统需安装 net-tools)

2. 临时配置 IP 地址(重启后失效)

1
2
3
sudo ip addr add 192.168.1.100/24 dev eth0   # 添加IP
sudo ip link set eth0 up # 启用接口
sudo ip route add default via 192.168.1.1 # 设置默认网关

3. 永久配置静态 IP(不同发行版差异较大)

  • Debian/Ubuntu(使用 netplan)
    编辑 /etc/netplan/*.yaml 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    network:
    version: 2
    renderer: networkd
    ethernets:
    eth0:
    addresses: [192.168.1.100/24]
    gateway4: 192.168.1.1
    nameservers:
    addresses: [8.8.8.8, 8.8.4.4]

    应用配置:

    1
    sudo netplan apply
  • CentOS/RHEL(使用 NetworkManager 或 ifcfg 文件)
    编辑 /etc/sysconfig/network-scripts/ifcfg-eth0:

    1
    2
    3
    4
    5
    6
    7
    8
    DEVICE=eth0
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=192.168.1.100
    NETMASK=255.255.255.0
    GATEWAY=192.168.1.1
    DNS1=8.8.8.8
    DNS2=8.8.4.4

    重启网络服务:

    1
    2
    3
    sudo systemctl restart NetworkManager
    # 或传统方式
    sudo systemctl restart network

二、DNS 配置

1. 修改 /etc/resolv.conf(临时生效)

1
2
nameserver 8.8.8.8
nameserver 8.8.4.4

⚠️ 注意:某些系统(如使用 NetworkManager)会覆盖此文件,建议通过工具配置。

2. 永久配置 DNS

  • 通过 NetworkManager(推荐)

    1
    2
    nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4"
    nmcli connection up eth0
  • Debian/Ubuntu(在 netplan 中配置,见上文)

  • CentOS(在 ifcfg-eth0 中配置 DNS1, DNS2)


三、网络服务管理

1. 重启网络服务

1
2
3
sudo systemctl restart NetworkManager   # 基于 NetworkManager
sudo systemctl restart networking # Debian 传统方式
sudo systemctl restart network # CentOS 传统方式

2. 启用/禁用网络接口

1
2
sudo ip link set eth0 down   # 禁用接口
sudo ip link set eth0 up # 启用接口

四、常用网络诊断工具

1
2
3
4
5
6
7
ping google.com           # 测试连通性
nslookup google.com # DNS解析测试
traceroute google.com # 跟踪路由路径
netstat -tuln # 查看监听的端口
ss -tuln # 更现代的替代命令(推荐)
ip route show # 查看路由表
journalctl -u NetworkManager # 查看网络服务日志

五、其他工具

  1. NetworkManager 命令行 (nmcli)

    1
    2
    3
    nmcli device status       # 查看设备状态
    nmcli connection show # 查看所有连接配置
    nmcli connection edit eth0 # 交互式配置
  2. 图形工具

    • nmtui(基于终端的图形工具)
    • 系统自带的网络管理 GUI(如 GNOME 设置中的网络选项)。

六、常见问题

  1. 网络接口未启用

    • 检查接口是否启用:ip link show eth0(状态 UP)。
    • 检查驱动是否加载:lsmod | grep eth0驱动名。
  2. DNS 解析失败

    • 检查 /etc/resolv.conf 或 NetworkManager 配置。
    • 测试 nslookup google.com 8.8.8.8 是否正常。
  3. 防火墙拦截

    • 检查 iptables 或 firewalld

      规则:

      1
      2
      sudo iptables -L -n -v   # 查看规则
      sudo systemctl stop firewalld # 临时关闭防火墙(测试用)

11.进程管理

一、查看进程信息

1. 基本命令:ps

1
2
3
4
ps aux            # 查看所有运行中的进程(详细信息)
ps -ef # 以完整格式列出进程
ps -u <用户名> # 查看指定用户的进程
ps -p <PID> # 查看特定PID的进程

输出字段说明:

  • USER:进程所有者
  • PID:进程 ID
  • %CPU/%MEM:CPU/内存占用率
  • COMMAND:启动进程的命令

2. 动态查看进程:top 和 htop

1
2
top               # 实时监控进程(按CPU排序)
htop # 增强版top(需安装,支持交互式操作)
  • 操作快捷键:
    • P:按 CPU 使用率排序
    • M:按内存使用率排序
    • k:终止进程
    • q:退出

二、控制进程

1. 终止进程:kill 和 killall

1
2
3
4
kill <PID>                  # 默认发送SIGTERM信号(正常终止)
kill -9 <PID> # 强制终止(SIGKILL信号)
killall <进程名> # 根据进程名终止所有同名进程
pkill <模式> # 根据名称模式终止进程(如 `pkill nginx`)

常用信号:

  • SIGTERM(15):请求进程正常终止(允许清理资源)。
  • SIGKILL(9):强制立即终止(无法被忽略或捕获)。
  • SIGHUP(1):重新加载配置(常用于重启守护进程)。

2. 调整进程优先级:nice 和 renice

1
2
nice -n 10 <命令>    # 启动时设置优先级(范围:-20最高,19最低)
renice -n 5 -p <PID> # 修改已运行进程的优先级

三、后台进程与作业控制

1. 后台运行与切换

1
2
3
4
<命令> &           # 启动命令到后台(如 `python app.py &`)
jobs # 查看当前终端的后台作业
fg %<作业号> # 将后台作业切换到前台(如 `fg %1`)
bg %<作业号> # 继续运行暂停的后台作业

2. 脱离终端运行:nohup 和 disown

1
2
nohup <命令> &    # 忽略挂断信号,进程在终端关闭后仍运行(输出重定向到nohup.out)
disown -h <PID> # 将已启动的进程从当前终端剥离

四、进程监控与资源分析

1. 查看进程资源占用

1
2
top -p <PID>      # 监控特定进程
pidstat -p <PID> # 统计进程的CPU、内存、IO等(需安装 `sysstat`)

2. 系统级资源监控工具

1
2
3
4
vmstat 1          # 查看CPU、内存、IO等系统级指标(每秒刷新)
iostat # 监控磁盘I/O
free -h # 查看内存使用情况
lsof -p <PID> # 列出进程打开的文件和网络连接

五、守护进程管理(Systemd)

1. 服务管理命令

1
2
3
4
5
6
systemctl start <服务名>     # 启动服务
systemctl stop <服务名> # 停止服务
systemctl restart <服务名> # 重启服务
systemctl status <服务名> # 查看服务状态
systemctl enable <服务名> # 设置开机自启
systemctl disable <服务名> # 禁用开机自启

2. 查看服务日志

1
2
journalctl -u <服务名>       # 查看指定服务的日志
journalctl -f -u <服务名> # 实时跟踪日志

六、常见问题排查

1. 如何查找并终止无响应进程?

1
2
ps aux | grep <关键词>    # 查找进程PID
kill -9 <PID> # 强制终止

2. 如何检测 CPU/内存占用最高的进程?

1
2
3
top                      # 进入后按 `P`(CPU)或 `M`(内存)排序
ps aux --sort=-%cpu | head -n 5 # 列出CPU占用前5的进程
ps aux --sort=-%mem | head -n 5 # 列出内存占用前5的进程

3. 如何处理僵尸进程(Zombie)?

  • 僵尸进程是已终止但未被父进程回收的进程,通常需等待父进程结束。

  • 若长期存在,可尝试终止其父进程:

    1
    kill -9 <父进程PID>

七、高级工具

  1. strace:跟踪进程的系统调用

    1
    strace -p <PID>       # 跟踪进程的系统调用
  2. cron:定时任务管理

    1
    2
    crontab -e            # 编辑当前用户的定时任务
    crontab -l # 列出定时任务
  3. systemd-analyze:分析系统启动时间

    1
    systemd-analyze blame  # 查看各服务的启动耗时

总结

  • 优先使用 systemctl 管理服务(现代 Linux 发行版)。
  • 终止进程时,优先尝试 SIGTERM(kill <PID>),避免直接使用 SIGKILL(kill -9)。
  • 长期运行的进程建议结合 nohup 或 systemd 托管。
  • 监控工具(如 htop、pidstat)是分析性能问题的利器。

12.RPM 与 YUM

一、RPM:底层包管理工具

1. RPM 的功能

  • 安装、卸载、升级 软件包。
  • 查询 包信息(版本、依赖、文件列表等)。
  • 验证 软件包完整性(检查文件是否被篡改)。

2. RPM 常用命令

命令 说明
rpm -ivh <包名>.rpm 安装软件包(i = 安装,v = 显示详情,h = 显示进度)
rpm -e <包名> 卸载软件包
rpm -Uvh <包名>.rpm 升级软件包(若未安装则执行安装)
rpm -qa 列出所有已安装的包
`rpm -qa grep <关键词>`
rpm -qi <包名> 查看包的详细信息(版本、安装时间等)
rpm -ql <包名> 列出包安装的所有文件路径
rpm -qf <文件路径> 查看文件属于哪个包
rpm -V <包名> 验证包文件是否被修改(无输出表示正常)

3. RPM 的局限性

  • 依赖需手动解决:安装时若缺少依赖包会直接报错,需自行下载安装。
  • 无法自动获取包:需手动从网络或本地获取 .rpm 文件。

二、YUM:高层包管理工具

1. YUM 的功能

  • 基于 RPM,自动解决依赖关系(从配置的仓库下载所需依赖包)。
  • 批量安装/升级 软件包。
  • 支持仓库管理(添加/删除仓库源)。

2. YUM 常用命令

命令 说明
yum install <包名> 安装软件包(自动解决依赖)
yum remove <包名> 卸载软件包及依赖
yum update <包名> 升级指定包(不指定包名则升级所有包)
yum check-update 检查可升级的包
yum search <关键词> 搜索仓库中的包
yum list 列出仓库中所有包(installed/available/updates)
yum info <包名> 查看包的详细信息
yum clean all 清理缓存(/var/cache/yum)
yum repolist 列出已启用的仓库
yum history 查看 YUM 操作历史(可撤销操作)
yum groupinstall "组名" 安装软件包组(如开发工具)

3. YUM 仓库配置

  • 仓库文件位于 /etc/yum.repos.d/,扩展名为 .repo。

  • 示例:添加 EPEL 仓库(Extra Packages for Enterprise Linux):

    1
    yum install epel-release

4. YUM 的优势

  • 依赖自动处理:无需手动下载依赖包。
  • 支持仓库管理:集中管理软件源,支持镜像加速。
  • 事务性操作:支持回滚(通过 yum history undo <事务ID>)。

三、RPM vs YUM 对比

特性 RPM YUM
依赖处理 需手动解决 自动解决
安装来源 本地 .rpm 文件 远程仓库或本地仓库
适用场景 单包操作、离线环境 多包操作、在线环境
复杂度 底层操作(需熟悉命令) 高层封装(更简单)

四、常见问题与解决方案

1. 依赖冲突或缺失

  • YUM 自动修复:

    1
    2
    yum clean all && yum autoremove
    yum install <包名> --skip-broken # 跳过冲突包
  • 手动下载依赖(RPM):
    使用 yum deplist <包名> 查看依赖,然后手动下载安装。

2. 软件包版本冲突

  • 指定版本安装:

    1
    yum install <包名>-<版本号>
  • 排除特定包:

    1
    yum update --exclude=<包名>

3. 仓库配置错误

  • 检查仓库文件语法:

    1
    yum repolist   # 验证仓库是否正常加载
  • 临时禁用仓库:

    1
    yum --disablerepo=<仓库名> install <包名>

五、高级用法

1. YUM 插件

  • 增强功能(如版本锁定、下载加速):

    1
    2
    yum install yum-plugin-versionlock   # 锁定包版本
    yum versionlock add <包名> # 禁止升级指定包

2. 使用 dnf(YUM 的替代品)

  • Fedora/CentOS 8+ 默认使用 dnf,语法与 yum 类似:

    1
    dnf install <包名>        # 更快的依赖解析和事务处理

3. 本地仓库创建

  • 将多个 .rpm 文件放入目录,生成仓库元数据:

    1
    createrepo /path/to/rpm_dir   # 生成仓库元数据
  • 添加本地仓库到 /etc/yum.repos.d/local.repo:

    1
    2
    3
    4
    5
    [local]
    name=Local Repository
    baseurl=file:///path/to/rpm_dir
    enabled=1
    gpgcheck=0

六、总结

  • 优先使用 YUM:适合日常安装、升级和依赖管理。
  • RPM 适用场景:离线环境安装本地包、查询包信息或调试依赖问题。
  • 保持仓库更新:定期运行 yum update 并清理缓存(yum clean all)。

13.shell 编程

📜 Shell 脚本基础

1. 脚本结构与执行

  • 文件头声明:指定解释器(如 #!/bin/bash)。

  • 注释:以 # 开头。

  • 执行方式

    1
    2
    3
    4
    5
    6
    # 方法1:直接运行解释器
    bash script.sh

    # 方法2:赋予执行权限后运行
    chmod +x script.sh
    ./script.sh

2. 变量与数据类型

  • 定义变量(无类型,默认字符串):

    1
    2
    3
    name="Alice"      # 赋值(等号两侧不能有空格)
    age=30
    files=$(ls) # 命令执行结果赋值给变量
  • 使用变量:

    bash

    复制

    1
    2
    echo $name        # 输出变量值
    echo "Age: ${age}" # 推荐用 {} 明确变量边界
  • 特殊变量:

    • $0:脚本名称
    • $1, $2, …:第 1、2 个参数
    • $#:参数个数
    • $@:所有参数(列表形式)
    • $?:上一条命令的退出状态(0 表示成功)
    • $$:当前进程的 PID

3. 输入与输出

  • 读取用户输入:

    bash

    复制

    1
    2
    read -p "Enter your name: " username
    echo "Hello, $username!"
  • 格式化输出:

    bash

    复制

    1
    printf "Name: %s, Age: %d\n" "$name" $age

🔄 流程控制

1. 条件判断

  • 基本语法:

    1
    2
    3
    4
    5
    6
    7
    if [ 条件 ]; then
    # 代码块
    elif [ 条件 ]; then
    # 代码块
    else
    # 代码块
    fi
  • 常用条件判断符:

    类型 符号 说明
    数值比较 -eq, -ne 等于、不等于
    -gt, -lt 大于、小于
    字符串比较 =, != 字符串相等、不等
    -z, -n 字符串为空、非空
    文件判断 -f, -d 是文件、是目录
    -e, -s 文件存在、文件非空
    -r, -w, -x 可读、可写、可执行
    1
    2
    3
    if [ $num -gt 10 ] && [ -f "file.txt" ]; then
    echo "条件满足"
    fi

2. 循环

  • for 循环:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 遍历列表
    for fruit in "apple" "banana" "cherry"; do
    echo "Fruit: $fruit"
    done

    # 遍历数字范围
    for i in {1..5}; do
    echo "Number: $i"
    done

    # 遍历命令输出结果(如文件列表)
    for file in $(ls *.txt); do
    echo "Processing $file"
    done
  • while 循环:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    count=0
    while [ $count -lt 5 ]; do
    echo "Count: $count"
    ((count++)) # 算术运算
    done

    # 无限循环
    while true; do
    echo "Running..."
    sleep 1
    done
  • until 循环(条件为假时执行):

    1
    2
    3
    4
    until [ $count -eq 5 ]; do
    echo "Count: $count"
    ((count++))
    done

3. 分支选择(case)

1
2
3
4
5
6
7
8
9
10
11
12
read -p "Enter a fruit: " fruit
case $fruit in
"apple")
echo "Apple pie"
;;
"banana")
echo "Banana bread"
;;
*)
echo "Unknown fruit"
;;
esac

📚 高级语法

1. 函数

  • 定义与调用:

    1
    2
    3
    4
    5
    6
    greet() {
    local message="Hello, $1!" # local 定义局部变量
    echo $message
    }

    greet "Alice" # 输出 "Hello, Alice!"
  • 返回值:

    • 使用 return 返回整数(0-255),通过 $? 获取。

    • 使用 echo 返回字符串,通过命令替换获取:

      1
      2
      3
      4
      add() {
      echo $(($1 + $2))
      }
      result=$(add 3 5) # result=8

2. 数组

  • 定义与操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fruits=("apple" "banana" "cherry")
    echo ${fruits[0]} # 输出第一个元素:apple
    echo ${fruits[@]} # 输出所有元素
    echo ${#fruits[@]} # 数组长度

    # 追加元素
    fruits+=("orange")

    # 遍历数组
    for fruit in "${fruits[@]}"; do
    echo $fruit
    done

3. 字符串处理

  • 截取与替换:

    1
    2
    3
    str="Hello World"
    echo ${str:0:5} # 截取前5个字符:Hello
    echo ${str//World/Alice} # 替换所有匹配项:Hello Alice
  • 分割字符串:

    1
    2
    IFS=',' read -ra parts <<< "one,two,three"
    echo ${parts[1]} # 输出:two

4. 算术运算

  • 使用 $(( )) 或 let:

    1
    2
    num=$((3 + 5))       # num=8
    let "num *= 2" # num=16

5. 正则表达式匹配

  • =~ 运算符:

    1
    2
    3
    4
    email="user@example.com"
    if [[ $email =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then
    echo "Valid email"
    fi

6. 进程管理

  • 后台运行:

    1
    2
    sleep 10 &          # 后台运行
    wait # 等待所有后台进程完成
  • 捕获信号:

    1
    trap 'echo "Exiting..."; exit' SIGINT  # 捕获 Ctrl+C

🛠️ 实用工具与技巧

1. 调试脚本

  • 显示执行过程

    1
    bash -x script.sh    # 打印每条命令及其参数
  • 调试特定部分

    1
    2
    3
    set -x               # 开启调试
    # 需要调试的代码
    set +x # 关闭调试

2. 处理文件

  • 逐行读取文件

    1
    2
    3
    while IFS= read -r line; do
    echo "Line: $line"
    done < "file.txt"

3. 错误处理

  • 立即退出(遇到错误终止)

    1
    set -e              # 任何命令失败则终止脚本
  • 忽略错误

    1
    command || true     # 即使失败也继续执行

🌰 实战示例

示例 1:备份脚本

1
2
3
4
5
6
7
8
#!/bin/bash
# 自动备份指定目录
backup_dir="/data"
backup_file="backup_$(date +%Y%m%d).tar.gz"
dest_dir="/backup"

tar -czf $dest_dir/$backup_file $backup_dir
echo "Backup completed: $backup_file"

示例 2:监控磁盘使用率

1
2
3
4
5
6
7
8
#!/bin/bash
# 检查磁盘使用率超过阈值时告警
threshold=90
usage=$(df / | awk 'NR==2 {print $5}' | tr -d '%')

if [ $usage -gt $threshold ]; then
echo "Warning: Disk usage is $usage%!" | mail -s "Disk Alert" admin@example.com
fi

自动备份指定目录到 .tar.gz 文件:

1
2
3
4
5
6
7
#!/bin/bash
# 备份脚本
backup_dir="/home/user/documents"
backup_file="backup_$(date +%Y%m%d).tar.gz"

tar -czf $backup_file $backup_dir
echo "Backup created: $backup_file"

14.日志管理

📂 日志文件位置

Linux 日志通常存储在 /var/log 目录下,常见日志文件包括:

  • 系统级日志:
    • /var/log/syslog 或 /var/log/messages:通用系统日志(取决于发行版)。
    • /var/log/auth.log 或 /var/log/secure:用户认证日志(如 SSH 登录)。
    • /var/log/kern.log:内核日志。
    • /var/log/boot.log:系统启动日志。
  • 服务级日志:
    • /var/log/nginx/access.log:Nginx 访问日志。
    • /var/log/mysql/error.log:MySQL 错误日志。
    • /var/log/cron:定时任务日志。
  • 内核与硬件日志:
    • dmesg:查看内核环形缓冲区日志(硬件/驱动问题)。

🔍 查看日志的常用命令

  1. tail 查看实时日志:

    1
    2
    tail -f /var/log/syslog          # 实时跟踪日志更新
    tail -n 100 /var/log/nginx/access.log # 查看最后100行
  2. grep 过滤关键信息:

    1
    2
    grep "error" /var/log/syslog      # 搜索包含 "error" 的行
    grep -i "failed" /var/log/auth.log # 忽略大小写搜索
  3. journalctl(Systemd 系统日志):

    1
    2
    3
    journalctl -u nginx.service       # 查看指定服务的日志
    journalctl --since "2024-03-01" --until "2024-03-02" # 按时间筛选
    journalctl -p err -b # 查看本次启动后的错误日志
  4. awk/sed 高级分析:

    1
    2
    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c  # 统计访问IP次数
    sed -n '/10:00:00/,/11:00:00/p' /var/log/syslog # 提取时间范围内的日志

🛠️ 日志管理工具

  1. logrotate 自动轮转日志
    通过配置 /etc/logrotate.conf 或 /etc/logrotate.d/ 下的文件,实现日志压缩、删除旧日志。

    • 示例配置(如 Nginx 日志轮转):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      /var/log/nginx/*.log {
      daily
      missingok
      rotate 30
      compress
      delaycompress
      notifempty
      sharedscripts
      postrotate
      /usr/bin/systemctl reload nginx
      endscript
      }
  2. rsyslog 集中式日志管理
    配置文件 /etc/rsyslog.conf 可定义日志的远程传输和存储规则。

  3. ELK Stack(高级方案)
    使用 Elasticsearch + Logstash + Kibana 实现日志收集、存储和可视化。


📝 日志分析实战示例

1. 统计 HTTP 状态码分布(Nginx 访问日志):

1
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

输出示例:

1
2
3
200 4521
404 23
500 5

2. 监控最近 1 小时的 SSH 登录失败尝试:

1
journalctl -u sshd --since "1 hour ago" | grep "Failed password"

3. 自动清理 30 天前的日志文件:

1
find /var/log -name "*.log" -type f -mtime +30 -exec rm -f {} \;

🔧 日志管理最佳实践

  1. 定期轮转日志:避免单个日志文件过大。
  2. 敏感信息脱敏:避免在日志中记录密码等敏感数据。
  3. 集中存储:使用 rsyslog 或 ELK 集中管理多台服务器的日志。
  4. 监控告警:结合工具(如 Prometheus + Grafana)设置日志异常告警。
  5. 权限控制:确保日志文件权限合理(如 640,仅管理员可读)。

💡 调试技巧

  • 快速定位错误:

    1
    journalctl -p 3 -xb           # 查看系统错误(优先级3及以上)
  • 跟踪进程日志:

    1
    strace -p <PID>                # 跟踪进程的系统调用

15.补充-防火墙

1. 使用 iptables(基础工具)

查看当前规则

1
2
sudo iptables -L -n -v  # 查看过滤表规则
sudo iptables -t nat -L # 查看 NAT 表规则

基本规则示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 允许所有本地回环流量
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接和关联流量
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 开放 SSH 端口(默认 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 开放 HTTP(80)和 HTTPS(443)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 拒绝其他所有入站流量
sudo iptables -A INPUT -j DROP

# 保存规则(需安装持久化工具,如 iptables-persistent)
sudo netfilter-persistent save

删除规则

1
2
sudo iptables -L --line-numbers  # 查看规则编号
sudo iptables -D INPUT <规则编号> # 删除指定规则

2. 使用 ufw(Ubuntu/Debian 简化工具)

启用与基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo ufw enable          # 启用防火墙
sudo ufw default deny # 默认拒绝所有入站,允许所有出站

# 开放端口或服务
sudo ufw allow ssh # 允许 SSH(等效于端口 22)
sudo ufw allow 80/tcp # 允许 HTTP
sudo ufw allow 443/tcp # 允许 HTTPS

# 拒绝特定端口
sudo ufw deny 3306/tcp # 阻止 MySQL 端口

# 删除规则
sudo ufw status numbered # 查看规则编号
sudo ufw delete <规则编号>

sudo ufw reload # 重新加载配置

3. 使用 firewalld(Red Hat/CentOS)

管理区域与端口

1
2
3
4
5
6
7
8
9
10
11
12
sudo systemctl start firewalld    # 启动服务
sudo firewall-cmd --state # 检查状态

# 开放服务或端口(--permanent 永久生效)
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 移除规则
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent

sudo firewall-cmd --reload # 重新加载配置
sudo firewall-cmd --list-all # 查看当前规则

4. 使用 nftables(替代 iptables 的新工具)

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
# 清空现有规则
sudo nft flush ruleset

# 创建简单规则链
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
sudo nft add rule inet filter input tcp dport { 22, 80, 443 } accept
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input drop

# 保存规则
sudo nft list ruleset > /etc/nftables.conf # 导出配置

5. 常见场景

允许 Docker 容器通信

1
2
3
# 允许 Docker 的默认网桥(docker0)流量
sudo iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o docker0 -j ACCEPT

限制 IP 访问

1
2
3
# 仅允许特定 IP 访问 SSH(如 192.168.1.100)
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

6. 故障排查

  • 检查服务监听:sudo netstat -tuln | grep <端口> 或 sudo ss -tuln

  • 查看防火墙日志:tail -f /var/log/syslog(Ubuntu)或 journalctl -u firewalld(CentOS)

  • 临时禁用防火墙:

    1
    2
    3
    sudo ufw disable          # ufw
    sudo systemctl stop firewalld # firewalld
    sudo iptables -F # iptables(清空规则,慎用!)

7. 注意事项

  1. 避免锁定自己:开放 SSH 端口后再启用防火墙。
  2. 规则顺序:规则从上到下匹配,优先级高的规则在前。
  3. 持久化:iptables 规则默认重启失效,需通过工具保存(如 iptables-persistent)。
[up主专用,视频内嵌代码贴在这]