linux笔记

linux笔记
安安linux 指令大全
1Linux 目录结构
- linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。
- 在 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 常用的三种模式
正常模式
以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来 移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、粘贴』来处理你的文件数据
插入模式
按下 i, I, o, O, a, A, r, R 等任何一个字母之后才会进入编辑模式, 一般来说按 i 即可
命令行模式
输入 ==esc== 再输入 ==:== 在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的动作则是在此模式中达成的
2.3 各种模式的相互切换
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 键盘图
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 | # 切换到关机模式 |
还可以使用 systemctl 命令来设置和切换启动级别。
1 | # 查看当前默认启动级别 |
5.1.3 找回 root 密码
(1)找回 root 密码需要切换到单用户模式下。
如何进入到单用户模式呢?这就要拼手速了。
在开机时出现该界面时按下方向键,此界面只存在 5 秒,如果错过就得重新开机了。然后选择第一条语句 按下 c 键进入。
将光标移到 UTF-8 这里
在后面加入 init =/bin/sh 指令 ,再输入 ctr+x
1 | init=/bin/sh |
然后再输入 mount -o remount, rw / ,然后回车
1 | mount -o remount,rw / |
然后输入 passwd 设置新密码
再输入 touch /.autorelabel 回车
1 | touch /.autorelabel |
最后再输入 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 moremore 指令是一个基于 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 | #显示当前时间 |
5.4.2date 指令-设置日期
1 | date -s 字符串时间 |
例如:
1 | #设置系统当前时间 , 比如设置成 2025-4-16 13:14:10 |
还原到当前时间
1 | hwclock -s |
5.4.3 cal 指令
1 | cal [选项] |
作用:
- 若不加选项,只显示本月日历
- 加上年份 ,则显示当年的全部日历
例如:
5.5 搜索查找类
5.5.1find 指令
find 指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端.
语法:
1 | find [路径] [选项] [表达式] |
常用选项:
(1)按名称查找
-name:匹配文件名(区分大小写)
1 | # 查找 /home 下所有 .jpg 文件 |
-iname:不区分大小写的文件名匹配。
1 | # 查找 README.md、Readme.MD 等 |
(2)按类型查找
-type :指定文件类型
- f:普通文件
- d:目录
- l:符号链接
1 | # 查找 /var 下的名为 log 的目录 |
(3) 按时间过滤
-mtime:按修改时间(天数)
- +3:3 天前
- -3:最近 3 天内
1 | find /var/log -mtime -1 # 查找 24 小时内修改过的文件 |
-mmin:按修改时间(分钟)
1 | # 查找最近 60 分钟内修改的文件 |
(4)按大小过滤
-size:按文件大小
- +10M:大于 10MB
- -1G:小于 1GB
1 | # 查找系统中大于 500MB 的文件 |
(5) 按权限过滤
-perm:匹配权限模式
1 | find . -perm 644 # 查找权限为 644 的文件 |
(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 [选项] <文件名/模式> |
核心特性
基于数据库
locate依赖mlocate.db数据库(由updatedb定期生成)。数据库更新:
1
sudo updatedb # 手动更新数据库(默认每天自动更新)
新建文件可能无法立即找到:需先更新数据库或等待自动更新。
搜索速度极快
适合快速模糊匹配,但结果可能不是最新状态(取决于数据库更新频率)。
常用选项与示例
1. 基础搜索
- 按文件名模糊匹配
1 | locate .bashrc # 查找所有路径中包含 ".bashrc" 的文件 |
2. 精确匹配
-b:仅匹配文件名(不包含路径)。1
locate -b "\nginx.conf" # 精确查找文件名为 "nginx.conf" 的文件
- 忽略大小写
-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 注意事项
默认删除原文件:
gzip压缩后默认删除原文件,使用-k保留。也可通过重定向保留原文件:
1
gzip -c file.txt > file.txt.gz # 保留原文件
不支持压缩目录:
gzip只能压缩单个文件,需先用tar打包目录。- 错误用法:
gzip dir/→ 会压缩目录下的每个文件,而非整个目录。
文件名后缀:
默认压缩文件后缀为
.gz,解压时会自动去除。手动指定后缀:
1
gzip -S .z file.txt # 生成 file.txt.z
大文件处理:
- 压缩大文件时建议使用
-1(快速压缩)或-9(高压缩率)。 - 解压大文件可能占用较多内存。
- 压缩大文件时建议使用
权限问题:
- 压缩/解压后的文件权限与原文件一致(除非使用
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 | unzip -P mypassword 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 | zip -F broken.zip --out fixed.zip # 尝试修复 |
5.6.2.4 注意事项
中文文件名乱码:
ZIP 格式默认使用系统编码(可能导致跨平台乱码)。
解压时指定编码:
1
unzip -O GBK win_file.zip # 处理 Windows 中文文件名
权限保留:
- ZIP 不保留 Linux 文件权限(如可执行权限),需用
tar替代。 - 使用
-y保留符号链接,但 Windows 可能无法识别。
- ZIP 不保留 Linux 文件权限(如可执行权限),需用
安全性:
- 避免在命令行中直接使用
-P <密码>,密码可能被其他用户通过ps或历史记录获取。 - 推荐交互式输入密码或使用加密工具(如 7zip)。
- 避免在命令行中直接使用
分卷压缩限制:
- 分卷后的文件需保持原名顺序(如
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. 注意事项
参数顺序:
-f必须紧跟文件名,否则会报错。1
2
3tar -czvf archive.tar.gz dir/ # 正确
tar -czv -f archive.tar.gz dir/ # 正确(顺序灵活)
tar -cvzf archive.tar.gz dir/ # 错误(`z` 必须在 `f` 前)保留权限:
解压时使用-p保留文件权限(如系统备份):1
tar -xzpvf backup.tar.gz
处理绝对路径:
避免使用绝对路径打包,否则解压时可能覆盖系统文件:
1
tar -czvf bad.tar.gz /etc/passwd # 危险!解压时会覆盖 /etc/passwd
推荐进入目录后打包:
1
cd /path/to/dir && tar -czvf ../backup.tar.gz .
分卷压缩:
使用split命令分割大文件:1
2
3tar -cvzf - big_dir/ | split -b 2G - big_dir.tar.gz.part
# 合并分卷:
cat big_dir.tar.gz.part* | tar -xzvf -
7. 常见问题
Q1:如何解压非标准后缀的压缩包?
通过内容识别格式并手动指定选项:
1 | file unknown_archive # 查看文件类型(如 gzip 压缩) |
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.查看现有组
查看所有组:
1
cat /etc/group # 显示所有组信息
- 格式:
组名:密码占位符:GID:组成员列表。 - 示例:
developers:x:1001:alice,bob表示组名为developers,GID 为1001,包含用户alice和bob。
- 格式:
查看当前用户所属组:
1
2
3groups # 列出当前用户的所有组
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
2sudo 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 | ls -l 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
3chmod 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
2chmod 755 script.sh # 所有者:rwx,组和其他用户:r-x
chmod 644 file.txt # 所有者:rw-,组和其他用户:r--
4. 修改所有者/组 (chown/chgrp)
修改所有者:
1
2sudo chown alice file.txt # 将所有者改为 alice
sudo chown alice:developers dir/ # 同时修改所有者和组修改所属组:
1
sudo chgrp developers file.txt
5. 特殊权限
SetUID (4)
作用:允许用户以文件所有者的身份执行程序。
1
2chmod u+s /usr/bin/passwd # 典型示例(修改密码需 root 权限)
chmod 4755 script.sh # 数字表示法(4 表示 SetUID)
SetGID (2)
作用:目录中新建文件继承父目录的所属组。
1
2chmod g+s /shared_dir # 设置 SetGID
chmod 2775 /shared_dir # 数字表示法(2 表示 SetGID)
粘滞位 (Sticky Bit, 1)
作用:仅允许文件所有者和 root 删除目录中的文件(如/tmp)。
1
2chmod +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 | sudo mkdir /team |
- 效果:
developers组成员可读写。- 新文件自动属于
developers组。
场景 2:保护敏感文件
1 | chmod 600 ~/.ssh/id_rsa # 仅所有者可读写 |
场景 3:允许用户运行脚本
1 | chmod +x backup_script.sh # 添加执行权限 |
8. 高级工具(ACL)
设置访问控制列表
(更细粒度权限):
1
2setfacl -m u:bob:rwx file.txt # 允许用户 bob 读写执行
getfacl file.txt # 查看 ACL 权限
9. 注意事项
避免过度开放权限:
- 不要随意使用
chmod 777,可能引发安全隐患。
- 不要随意使用
递归修改目录权限:
1
2chmod -R 755 /webroot # 递归修改目录及子文件
chown -R alice:dev /code # 递归修改所有者和组系统关键文件
- 修改系统文件权限需谨慎(如
/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. 系统级任务配置
目录结构:
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 | at 14:30 2024-03-15 # 指定具体时间 |
2. 管理任务
| 命令 | 说明 |
|---|---|
atq |
查看待执行的任务队列 |
atrm <任务ID> |
删除指定任务 |
三、anacron(适用于非 24/7 运行的系统)
1. 配置文件
- **
/etc/anacrontab**:定义延迟执行的任务(如笔记本电脑唤醒后补执行)。
任务格式
1 | <周期天数> <延迟分钟> <任务名> <命令> |
示例
1
1 5 daily_backup /usr/bin/backup.sh # 每天执行,启动后延迟5分钟运行
四、最佳实践
使用绝对路径:
cron 环境变量可能与 shell 不同,确保命令使用完整路径:1
0 * * * * /usr/bin/python3 /scripts/monitor.py
重定向输出:
记录任务执行日志或忽略输出:1
2* * * * * /script.sh >> /var/log/cron.log 2>&1 # 保存输出
* * * * * /script.sh >/dev/null 2>&1 # 丢弃输出权限控制:
/etc/cron.allow和/etc/cron.deny控制用户访问权限。
环境变量问题:
在 crontab 中显式声明环境变量:1
2SHELL=/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 | sudo fdisk -l # 列出所有磁盘及分区信息 |
输出示例:
1 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT |
二、磁盘分区
假设要对 /dev/sdb(新磁盘)进行分区,可选工具 fdisk 或 parted。
方法 1:使用 fdisk
1 | sudo fdisk /dev/sdb |
- 输入
n创建新分区。 - 选择分区类型(主分区
p或扩展分区e,默认选p)。 - 设置分区大小(如直接回车表示使用全部空间)。
- 输入
w保存并退出。
方法 2:使用 parted(适合大容量磁盘)
1 | sudo parted /dev/sdb |
1 | (parted) mklabel gpt # 创建GPT分区表(适用于2TB以上磁盘) |
三、格式化分区
将分区格式化为文件系统(如 ext4 或 xfs):
1 | # 假设分区为 /dev/sdb1 |
四、挂载分区
1. 临时挂载(重启后失效)
1 | sudo mkdir /mnt/data # 创建挂载点目录 |
2. 永久挂载(编辑 /etc/fstab)
1 | # 获取分区的 UUID(推荐使用 UUID 避免设备名变化) |
输出示例
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 | df -hT /mnt/data # 查看挂载情况 |
六、常见问题及解决
1. 分区后未生效
1 | sudo partprobe /dev/sdb # 强制内核重新读取分区表 |
2. 挂载时提示权限被拒绝
1 | sudo chmod 777 /mnt/data # 临时开放权限(不推荐) |
3. 文件系统损坏
检查并修复文件系统(卸载后操作):
1 | sudo umount /dev/sdb1 |
七、关键命令总结
| 操作 | 命令示例 |
|---|---|
| 查看磁盘 | 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 |
八、注意事项
- 备份数据:分区和格式化会清除磁盘数据,操作前务必确认磁盘无重要数据。
- UUID 优势:使用 UUID 挂载可避免因设备名(如
/dev/sdb1变为/dev/sdc1)变化导致启动失败。 - 文件系统选择:
- ext4:兼容性好,适合通用场景。
- XFS:适合大文件和高并发写入(如数据库)。
- 虚拟化环境:如果是虚拟机,需先在虚拟化管理界面(如 VMware、VirtualBox)添加虚拟磁盘。
10.网络配置
一、基础网络配置
1. 查看网络接口信息
1 | ip addr show # 查看所有网络接口(推荐) |
2. 临时配置 IP 地址(重启后失效)
1 | sudo ip addr add 192.168.1.100/24 dev eth0 # 添加IP |
3. 永久配置静态 IP(不同发行版差异较大)
Debian/Ubuntu(使用
netplan)
编辑/etc/netplan/*.yaml文件:1
2
3
4
5
6
7
8
9network:
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
8DEVICE=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
3sudo systemctl restart NetworkManager
# 或传统方式
sudo systemctl restart network
二、DNS 配置
1. 修改 /etc/resolv.conf(临时生效)
1 | nameserver 8.8.8.8 |
⚠️ 注意:某些系统(如使用 NetworkManager)会覆盖此文件,建议通过工具配置。
2. 永久配置 DNS
通过 NetworkManager(推荐)
1
2nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4"
nmcli connection up eth0Debian/Ubuntu(在 netplan 中配置,见上文)
CentOS(在
ifcfg-eth0中配置DNS1,DNS2)
三、网络服务管理
1. 重启网络服务
1 | sudo systemctl restart NetworkManager # 基于 NetworkManager |
2. 启用/禁用网络接口
1 | sudo ip link set eth0 down # 禁用接口 |
四、常用网络诊断工具
1 | ping google.com # 测试连通性 |
五、其他工具
NetworkManager 命令行 (
nmcli)1
2
3nmcli device status # 查看设备状态
nmcli connection show # 查看所有连接配置
nmcli connection edit eth0 # 交互式配置图形工具
nmtui(基于终端的图形工具)- 系统自带的网络管理 GUI(如 GNOME 设置中的网络选项)。
六、常见问题
网络接口未启用
- 检查接口是否启用:
ip link show eth0(状态UP)。 - 检查驱动是否加载:
lsmod | grep eth0驱动名。
- 检查接口是否启用:
DNS 解析失败
- 检查
/etc/resolv.conf或 NetworkManager 配置。 - 测试
nslookup google.com 8.8.8.8是否正常。
- 检查
防火墙拦截
检查
iptables或firewalld规则:
1
2sudo iptables -L -n -v # 查看规则
sudo systemctl stop firewalld # 临时关闭防火墙(测试用)
11.进程管理
一、查看进程信息
1. 基本命令:ps
1 | ps aux # 查看所有运行中的进程(详细信息) |
输出字段说明:
USER:进程所有者PID:进程 ID%CPU/%MEM:CPU/内存占用率COMMAND:启动进程的命令
2. 动态查看进程:top 和 htop
1 | top # 实时监控进程(按CPU排序) |
- 操作快捷键:
P:按 CPU 使用率排序M:按内存使用率排序k:终止进程q:退出
二、控制进程
1. 终止进程:kill 和 killall
1 | kill <PID> # 默认发送SIGTERM信号(正常终止) |
常用信号:
SIGTERM(15):请求进程正常终止(允许清理资源)。SIGKILL(9):强制立即终止(无法被忽略或捕获)。SIGHUP(1):重新加载配置(常用于重启守护进程)。
2. 调整进程优先级:nice 和 renice
1 | nice -n 10 <命令> # 启动时设置优先级(范围:-20最高,19最低) |
三、后台进程与作业控制
1. 后台运行与切换
1 | <命令> & # 启动命令到后台(如 `python app.py &`) |
2. 脱离终端运行:nohup 和 disown
1 | nohup <命令> & # 忽略挂断信号,进程在终端关闭后仍运行(输出重定向到nohup.out) |
四、进程监控与资源分析
1. 查看进程资源占用
1 | top -p <PID> # 监控特定进程 |
2. 系统级资源监控工具
1 | vmstat 1 # 查看CPU、内存、IO等系统级指标(每秒刷新) |
五、守护进程管理(Systemd)
1. 服务管理命令
1 | systemctl start <服务名> # 启动服务 |
2. 查看服务日志
1 | journalctl -u <服务名> # 查看指定服务的日志 |
六、常见问题排查
1. 如何查找并终止无响应进程?
1 | ps aux | grep <关键词> # 查找进程PID |
2. 如何检测 CPU/内存占用最高的进程?
1 | top # 进入后按 `P`(CPU)或 `M`(内存)排序 |
3. 如何处理僵尸进程(Zombie)?
僵尸进程是已终止但未被父进程回收的进程,通常需等待父进程结束。
若长期存在,可尝试终止其父进程:
1
kill -9 <父进程PID>
七、高级工具
strace:跟踪进程的系统调用1
strace -p <PID> # 跟踪进程的系统调用
cron:定时任务管理1
2crontab -e # 编辑当前用户的定时任务
crontab -l # 列出定时任务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
2yum 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
2yum 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
3name="Alice" # 赋值(等号两侧不能有空格)
age=30
files=$(ls) # 命令执行结果赋值给变量使用变量:
bash
复制
1
2echo $name # 输出变量值
echo "Age: ${age}" # 推荐用 {} 明确变量边界特殊变量:
$0:脚本名称$1,$2, …:第 1、2 个参数$#:参数个数$@:所有参数(列表形式)$?:上一条命令的退出状态(0 表示成功)$$:当前进程的 PID
3. 输入与输出
读取用户输入:
bash
复制
1
2read -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
7if [ 条件 ]; then
# 代码块
elif [ 条件 ]; then
# 代码块
else
# 代码块
fi常用条件判断符:
类型 符号 说明 数值比较 -eq,-ne等于、不等于 -gt,-lt大于、小于 字符串比较 =,!=字符串相等、不等 -z,-n字符串为空、非空 文件判断 -f,-d是文件、是目录 -e,-s文件存在、文件非空 -r,-w,-x可读、可写、可执行 1
2
3if [ $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"
donewhile循环:1
2
3
4
5
6
7
8
9
10
11count=0
while [ $count -lt 5 ]; do
echo "Count: $count"
((count++)) # 算术运算
done
# 无限循环
while true; do
echo "Running..."
sleep 1
doneuntil循环(条件为假时执行):1
2
3
4until [ $count -eq 5 ]; do
echo "Count: $count"
((count++))
done
3. 分支选择(case)
1 | read -p "Enter a fruit: " fruit |
📚 高级语法
1. 函数
定义与调用:
1
2
3
4
5
6greet() {
local message="Hello, $1!" # local 定义局部变量
echo $message
}
greet "Alice" # 输出 "Hello, Alice!"返回值:
使用
return返回整数(0-255),通过$?获取。使用
echo返回字符串,通过命令替换获取:1
2
3
4add() {
echo $(($1 + $2))
}
result=$(add 3 5) # result=8
2. 数组
定义与操作:
1
2
3
4
5
6
7
8
9
10
11
12fruits=("apple" "banana" "cherry")
echo ${fruits[0]} # 输出第一个元素:apple
echo ${fruits[@]} # 输出所有元素
echo ${#fruits[@]} # 数组长度
# 追加元素
fruits+=("orange")
# 遍历数组
for fruit in "${fruits[@]}"; do
echo $fruit
done
3. 字符串处理
截取与替换:
1
2
3str="Hello World"
echo ${str:0:5} # 截取前5个字符:Hello
echo ${str//World/Alice} # 替换所有匹配项:Hello Alice分割字符串:
1
2IFS=',' read -ra parts <<< "one,two,three"
echo ${parts[1]} # 输出:two
4. 算术运算
使用
$(( ))或let:1
2num=$((3 + 5)) # num=8
let "num *= 2" # num=16
5. 正则表达式匹配
=~运算符:1
2
3
4email="user@example.com"
if [[ $email =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then
echo "Valid email"
fi
6. 进程管理
后台运行:
1
2sleep 10 & # 后台运行
wait # 等待所有后台进程完成捕获信号:
1
trap 'echo "Exiting..."; exit' SIGINT # 捕获 Ctrl+C
🛠️ 实用工具与技巧
1. 调试脚本
显示执行过程
1
bash -x script.sh # 打印每条命令及其参数
调试特定部分
1
2
3set -x # 开启调试
# 需要调试的代码
set +x # 关闭调试
2. 处理文件
逐行读取文件
1
2
3while IFS= read -r line; do
echo "Line: $line"
done < "file.txt"
3. 错误处理
立即退出(遇到错误终止)
1
set -e # 任何命令失败则终止脚本
忽略错误
1
command || true # 即使失败也继续执行
🌰 实战示例
示例 1:备份脚本
1 |
|
示例 2:监控磁盘使用率
1 |
|
自动备份指定目录到 .tar.gz 文件:
1 |
|
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:查看内核环形缓冲区日志(硬件/驱动问题)。
🔍 查看日志的常用命令
tail查看实时日志:1
2tail -f /var/log/syslog # 实时跟踪日志更新
tail -n 100 /var/log/nginx/access.log # 查看最后100行grep过滤关键信息:1
2grep "error" /var/log/syslog # 搜索包含 "error" 的行
grep -i "failed" /var/log/auth.log # 忽略大小写搜索journalctl(Systemd 系统日志):1
2
3journalctl -u nginx.service # 查看指定服务的日志
journalctl --since "2024-03-01" --until "2024-03-02" # 按时间筛选
journalctl -p err -b # 查看本次启动后的错误日志awk/sed高级分析:1
2awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c # 统计访问IP次数
sed -n '/10:00:00/,/11:00:00/p' /var/log/syslog # 提取时间范围内的日志
🛠️ 日志管理工具
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
}
rsyslog集中式日志管理
配置文件/etc/rsyslog.conf可定义日志的远程传输和存储规则。ELK Stack(高级方案)
使用 Elasticsearch + Logstash + Kibana 实现日志收集、存储和可视化。
📝 日志分析实战示例
1. 统计 HTTP 状态码分布(Nginx 访问日志):
1 | awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr |
输出示例:
1 | 200 4521 |
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 {} \; |
🔧 日志管理最佳实践
- 定期轮转日志:避免单个日志文件过大。
- 敏感信息脱敏:避免在日志中记录密码等敏感数据。
- 集中存储:使用
rsyslog或ELK集中管理多台服务器的日志。 - 监控告警:结合工具(如 Prometheus + Grafana)设置日志异常告警。
- 权限控制:确保日志文件权限合理(如
640,仅管理员可读)。
💡 调试技巧
快速定位错误:
1
journalctl -p 3 -xb # 查看系统错误(优先级3及以上)
跟踪进程日志:
1
strace -p <PID> # 跟踪进程的系统调用
15.补充-防火墙
1. 使用 iptables(基础工具)
查看当前规则
1 | sudo iptables -L -n -v # 查看过滤表规则 |
基本规则示例
1 | # 允许所有本地回环流量 |
删除规则
1 | sudo iptables -L --line-numbers # 查看规则编号 |
2. 使用 ufw(Ubuntu/Debian 简化工具)
启用与基本配置
1 | sudo ufw enable # 启用防火墙 |
3. 使用 firewalld(Red Hat/CentOS)
管理区域与端口
1 | sudo systemctl start firewalld # 启动服务 |
4. 使用 nftables(替代 iptables 的新工具)
配置示例
1 | # 清空现有规则 |
5. 常见场景
允许 Docker 容器通信
1 | # 允许 Docker 的默认网桥(docker0)流量 |
限制 IP 访问
1 | # 仅允许特定 IP 访问 SSH(如 192.168.1.100) |
6. 故障排查
检查服务监听:
sudo netstat -tuln | grep <端口>或sudo ss -tuln查看防火墙日志:
tail -f /var/log/syslog(Ubuntu)或journalctl -u firewalld(CentOS)临时禁用防火墙:
1
2
3sudo ufw disable # ufw
sudo systemctl stop firewalld # firewalld
sudo iptables -F # iptables(清空规则,慎用!)
7. 注意事项
- 避免锁定自己:开放 SSH 端口后再启用防火墙。
- 规则顺序:规则从上到下匹配,优先级高的规则在前。
- 持久化:
iptables规则默认重启失效,需通过工具保存(如iptables-persistent)。











