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),使用 -Eegrep 启用扩展正则表达式(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,包含用户 alicebob
  • 查看当前用户所属组

    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.hourlycron.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
  • 确保系统时间同步:ntpdsystemd-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(新磁盘)进行分区,可选工具 fdiskparted

方法 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

三、格式化分区

将分区格式化为文件系统(如 ext4xfs):

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 文件系统

七、关键命令总结

操作 命令示例
查看磁盘 lsblkfdisk -l
创建分区 fdisk /dev/sdbnw
格式化分区 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. 防火墙拦截

    • 检查 iptablesfirewalld

      规则:

      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. 动态查看进程:tophtop

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

二、控制进程

1. 终止进程:killkillall

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

常用信号

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

2. 调整进程优先级:nicerenice

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. 脱离终端运行:nohupdisown

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 发行版)。
  • 终止进程时,优先尝试 SIGTERMkill <PID>),避免直接使用 SIGKILLkill -9)。
  • 长期运行的进程建议结合 nohupsystemd 托管。
  • 监控工具(如 htoppidstat)是分析性能问题的利器。

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. 集中存储:使用 rsyslogELK 集中管理多台服务器的日志。
  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主专用,视频内嵌代码贴在这]