Linux 常用命令与核心选项全解析:从基础操作到系统管理
概述
Linux 命令行是运维、开发人员操作系统的核心工具,但常用命令多达数十种,且每个命令包含多个功能选项,新手常因 “记混参数”“用错场景” 导致操作效率低甚至误操作。
本文按 “基础工具 → 文件管理 → 进程控制 → 磁盘与分区 → 用户与权限 → 软件管理 → 定时任务”7 大核心场景,系统梳理 Linux 高频命令。每个命令均包含 “功能定位 + 核心选项 + 实战示例 + 注意事项”,既覆盖日常操作需求,也补充容易踩坑的细节(如 rm -rf 的安全用法、userdel -r 的数据风险),帮你形成清晰的命令体系,兼顾 “记忆便捷性” 和 “实战安全性”。
一、基础工具命令:认识命令本质与系统信息
这类命令是 Linux 操作的 “入门钥匙”,帮你判断命令类型、查看帮助文档、管理命令历史,是后续所有操作的基础。
1. type:判断命令类型(内建 / 外部命令)
功能定位:区分命令是 “Shell 内建命令”(如 cd、echo)还是 “外部命令”(如 ls、cp),避免因命令类型不同导致的行为差异。
核心选项:
- -a:显示所有匹配的命令路径(包括内建命令和外部命令)。
实战示例:
# 1. 判断 echo 命令类型(内建+外部命令)
type echo
# 预期输出:echo is a shell builtin(说明是内建命令)
type -a echo
# 预期输出:
# echo is a shell builtin
# echo is /bin/echo(同时显示外部命令路径)
# 2. 判断 ls 命令类型(仅外部命令)
type ls
# 预期输出:ls is /bin/ls
2. echo:输出文本与环境变量
功能定位:打印字符串、环境变量,或通过转义字符控制输出格式(如换行、制表符)。
核心选项:
- -n:不换行输出(默认输出后会自动换行)。
- -e:启用转义字符解析(支持 \n 换行、\t 制表符等)。
实战示例:
# 1. 基本输出(默认换行)
echo "Hello Linux"
# 预期输出:Hello Linux(后接换行)
# 2. 不换行输出(-n)
echo -n "Enter your name: "
read name # 配合 read 命令实现“输入提示不换行”
# 预期效果:提示文字后光标紧跟,等待用户输入
# 3. 解析转义字符(-e)
echo -e "Name:\t$name\nAge:\t25" # \t 制表符,\n 换行
# 预期输出:
# Name: (用户输入的名字)
# Age: 25
3. man:查看命令帮助文档
功能定位:Linux 自带的 “说明书”,查看命令的详细用法、选项、示例,是解决问题的首要工具。
核心选项:
-k:按关键词模糊搜索相关命令(如搜索 “主机名” 相关命令)。
实战示例:
# 1. 查看 hostname 命令的完整帮助(进入 man 页面,按 q 退出)
man hostname
# 2. 模糊搜索“hostname”相关的所有命令(-k)
man -k hostname
# 预期输出:所有包含 hostname 关键词的命令(如 hostname、hostnamectl)
使用技巧:进入 man 页面后,按 /关键词 可搜索内容,按 n 查看下一个匹配结果,按 q 退出。
4. history:管理命令历史记录
功能定位:查看、保存、清除之前执行过的命令,避免重复输入复杂命令。
核心机制:
- 命令历史默认保存在用户主目录的 .bash_history 文件中;
- 会话期间的命令先存于内存,Shell 退出时才写入文件;
- 普通用户仅能查看自己的命令历史。
核心选项:
- -a:强制将当前会话的命令历史写入 .bash_history(无需退出 Shell)。
- -c:清空当前会话的命令历史(内存中的记录,文件需手动删除)。
实战示例:
# 1. 查看最近执行的 10 条命令(默认显示所有历史,加数字限制条数)
history 10
# 2. 强制保存历史记录到文件(-a)
history -a
# 场景:执行敏感操作前,先保存历史,避免意外丢失
# 3. 清空当前会话历史(-c)
history -c
# 注意:仅清空内存中的记录,文件中的历史需手动删除(rm ~/.bash_history)
实用技巧:按 Ctrl+R 可搜索历史命令(输入关键词,按 Ctrl+R 切换匹配结果),效率远超手动翻找。
5. alias:设置命令别名(简化复杂操作)
功能定位:为常用命令(尤其是带长选项的命令)设置简写,提升操作效率(如 alias ll='ls -l')。
核心特性:
- 临时别名:仅当前 Shell 会话有效,退出后失效;
- 永久别名:需写入 ~/.bashrc 或 /etc/bashrc(全局生效)。
实战示例:
# 1. 查看已有的别名(如系统默认的 ll 别名)
alias ll
# 预期输出:alias ll='ls -l'
# 2. 设置临时别名(当前会话有效)
alias rm='rm -i' # 删除文件时自动提示(避免误删)
alias dfh='df -h' # 简写 df 命令,按人类可读格式显示磁盘
# 3. 设置永久别名(写入 .bashrc)
echo "alias ll='ls -alF'" >> ~/.bashrc # 追加到用户配置文件
source ~/.bashrc # 立即生效(无需重启 Shell)
二、文件与目录管理命令:操作文件 / 文件夹的核心
这类命令是 Linux 最高频的操作,覆盖 “创建 / 查看 / 复制 / 删除 / 移动” 文件与目录,需重点掌握选项的安全用法(如 cp -i、rm -i)。
1. ls:列出目录内容
功能定位:查看目录下的文件 / 文件夹名称、权限、大小、修改时间等信息。
核心选项(高频组合):
选项 | 功能说明 | 常用组合 |
---|---|---|
-l | 长格式显示(权限、属主、大小、修改时间) | ls -l(简写 ll) |
-a | 显示隐藏文件(以 . 开头的文件) | ls -a |
-R | 递归显示子目录内容 | ls -lR(查看目录树) |
-t | 按修改时间排序(最新的在前) | ls -lt(查看最近修改的文件) |
-r | 倒序排序(配合 -t 实现 “oldest first”) | ls -ltr(查看最早修改的文件) |
-i | 显示文件的 inode 编号(文件系统中唯一标识) | ls -i(排查硬链接时用) |
-F | 给不同类型文件加后缀(/ 表示目录,* 表示可执行文件) | ls -lF(快速区分文件类型) |
实战示例:
# 1. 查看当前目录所有文件(含隐藏文件)的详细信息
ls -alF
# 输出包含:权限、硬链接数、属主、属组、大小、修改时间、文件名+类型后缀
# 2. 查看 /var/log 目录下最近修改的 5 个文件
ls -lt /var/log | head -n 6 # head -n 6 取前 6 行(含标题行)
# 3. 递归查看 /etc 目录下所有 .conf 配置文件
ls -lR /etc | grep "\.conf$"
2. cp:复制文件 / 目录
功能定位:复制文件或目录到目标路径,支持递归复制、覆盖提示、强制复制。
核心选项:
- -i:覆盖文件前提示(interactive,安全操作必备,避免误覆盖);
- -r/-R:递归复制目录(复制文件夹时必须加,否则报错);
- -f:强制复制(force,忽略不存在的文件,覆盖时不提示,慎用);
- -p:保留文件的属性(权限、修改时间、属主等,备份文件时常用)。
实战示例:
# 1. 复制单个文件(带覆盖提示,-i)
cp -i ~/document.txt /tmp/
# 若 /tmp/ 已存在 document.txt,会提示:cp: overwrite '/tmp/document.txt'? y/n
# 2. 递归复制目录(-r)
cp -r ~/projects/ /backup/ # 复制 projects 目录及所有子内容到 /backup/
# 安全写法:目标目录加 /,明确是“复制到该目录下”
cp -r ~/projects/ /backup/projects/ # 若目标目录不存在,会自动创建
# 3. 备份配置文件(保留属性,-p)
cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
# 复制后,备份文件的权限、修改时间与原文件一致
注意事项:复制目录时,目标路径末尾是否加 / 效果不同:
- cp -r dirA dirB:若 dirB 不存在,创建 dirB 并将 dirA 内容放入 dirB;
- cp -r dirA dirB/:若 dirB 已存在,将 dirA 及其内容放入 dirB 下。
3. rm:删除文件 / 目录
功能定位:删除文件或目录,是风险较高的命令,需严格掌握安全选项。
核心选项:
- -i:删除前提示(安全必备,避免误删);
- -r/-R:递归删除目录(删除文件夹时必须加);
- -f:强制删除(忽略不存在的文件,不提示,生产环境慎用)。
实战示例:
# 1. 删除单个文件(带提示,-i)
rm -i ~/old_file.txt
# 提示:rm: remove regular file 'old_file.txt'? y/n
# 2. 删除目录(递归+提示,-ri)
rm -ri ~/old_dir/
# 逐个提示是否删除目录下的文件,确认后递归删除
# 3. 强制删除(-f,仅在确认文件无用时使用)
rm -f /tmp/temp_file* # 删除 /tmp 下所有 temp_file 开头的临时文件
安全警告:
- 禁止直接使用 rm -rf /(删除根目录,系统崩溃);
- 生产环境中,建议给 rm 设置别名 alias rm='rm -i'(避免误操作);
- 重要文件删除前,建议先备份(如 mv file ~/trash/ 移到临时回收站)。
4. mkdir:创建目录
功能定位:创建空目录,支持一次性创建多级目录(无需手动逐级创建)。
核心选项:
- -p:递归创建多级目录(若路径中父目录不存在,自动创建)。
实战示例:
# 1. 创建单个目录
mkdir ~/docs
# 2. 递归创建多级目录(-p,常用)
mkdir -p ~/projects/linux/commands # 即使 projects、linux 不存在,也会自动创建
# 若不加 -p,会报错:mkdir: cannot create directory ‘projects/linux/commands’: No such file or directory
# 3. 同时创建多个目录
mkdir ~/docs/{note,report,backup} # 批量创建 note、report、backup 三个子目录
5. cat/tail:查看文件内容
功能定位:
- cat:查看小文件的完整内容(文件过大时会瞬间刷屏,不推荐);
- tail:查看文件末尾内容(默认最后 10 行),支持实时跟踪文件更新(如日志)。
cat 核心选项:
- -n:显示行号(包括空行);
- -b:显示行号(不包括空行)。
tail 核心选项:
- -n N/-N:查看最后 N 行(如 -n 5 或 -5 查看最后 5 行);
- -n +N/+N:从第 N 行开始查看至文件末尾;
- -f:实时跟踪文件更新(follow,常用于查看日志文件)。
实战示例:
# 1. 查看文件并显示行号(cat -n)
cat -n /etc/passwd # 查看用户配置文件,每行带编号
# 2. 查看文件最后 5 行(tail -5)
tail -5 /var/log/syslog # 查看系统日志的最新 5 条记录
# 3. 从第 10 行开始查看文件(tail +10)
tail +10 /etc/profile # 跳过前 9 行,查看第 10 行及以后内容
# 4. 实时跟踪日志(tail -f,运维高频)
tail -f /var/log/nginx/access.log # 实时查看 Nginx 访问日志,按 Ctrl+C 退出
三、进程控制命令:管理系统中的运行程序
这类命令用于查看、终止进程,或调整进程优先级,是解决 “程序卡死”“资源占用过高” 等问题的核心工具。
1. ps:查看进程状态
功能定位:列出系统中的进程信息(进程 ID、状态、占用资源等),支持多种格式输出以适配不同场景。
核心风格与选项:
Linux 中 ps 命令支持 3 种风格(选项格式不同),实战中常用组合如下:
命令组合 | 风格 | 功能说明 |
---|---|---|
ps -ef | Unix 风格 | 显示所有进程的完整信息(PID、PPID、UID、启动时间、命令等) |
ps -efl | Unix 风格 | 比 -ef 多显示进程优先级(NI)、CPU 占用率(% C)等细节 |
ps aux | BSD 风格 | 显示所有进程的用户、CPU / 内存占用率、状态(STAT)、启动时间等 |
ps --forest | GNU 风格 | 以树形结构显示进程(清晰展示父进程与子进程的关系,如查看服务的子进程) |
ps -p PID -o 字段 | 通用 | 查看指定进程(PID)的特定字段(如 PID、PPID、NI、命令) |
实战示例:
# 1. 查看所有进程的完整信息(常用)
ps -ef | grep nginx # 查看所有 nginx 相关进程
# 2. 以树形结构查看进程(展示父子关系)
ps --forest -ef | grep docker # 查看 docker 进程及其子进程的树形结构
# 3. 查看指定进程的特定信息(如 PID=1234 的进程)
ps -p 1234 -o pid,ppid,ni,cmd # 仅显示 PID、PPID(父进程 ID)、NI(优先级)、命令
进程状态(STAT 字段)解读:
- R:运行中(正在占用 CPU 或等待 CPU);
- S:睡眠中(等待事件完成,如 I/O 操作);
- D:不可中断睡眠(通常与磁盘 I/O 相关,无法用 kill 终止);
- Z:僵尸进程(进程已结束,但父进程未回收资源,需杀死父进程清理);
- T:暂停状态(被 Ctrl+Z 或 kill -STOP 暂停)。
2. kill/killall/pkill:终止进程
功能定位:向进程发送信号,实现 “终止”“暂停”“重启” 等操作,三者的区别在于 “目标指定方式” 不同。
命令 | 目标指定方式 | 核心特点 | 适用场景 |
---|---|---|---|
kill | 进程 ID(PID) | 需先通过 ps 等命令获取 PID,仅能针对单个或多个 PID 操作 | 终止已知 PID 的单个 / 少量进程 |
killall | 进程名(如 nginx) | 直接通过进程名终止所有匹配进程,支持通配符(如 killall nginx*) | 终止同名的多个进程 |
pkill | 进程名 / 属性(如用户) | 比 killall 更灵活,支持按进程名、用户、终端等属性过滤(如 pkill -u user1) | 按条件批量终止进程 |
核心信号(常用值与对应功能):
- 1(SIGHUP):重启进程(如重载配置文件,不终止进程);
- 9(SIGKILL):强制终止进程(无法被进程捕获,必终止);
- 15(SIGTERM):默认信号,请求进程正常退出(进程可自行清理资源)。
实战示例:
# 1. kill:通过 PID 终止进程(强制终止,-9)
ps -ef | grep nginx # 先获取 nginx 主进程 PID(如 1234)
kill -9 1234 # 强制终止 PID=1234 的进程
# 2. killall:通过进程名终止所有匹配进程
killall -9 nginx # 强制终止所有 nginx 进程(无需查 PID)
killall -1 nginx # 重启所有 nginx 进程(重载配置)
# 3. pkill:按条件终止进程(如终止用户 user1 的所有进程)
pkill -u user1 # 终止 user1 发起的所有进程
pkill -f "python app.py" # 按完整命令行匹配(终止运行 "python app.py" 的进程)
注意事项:
- 优先使用 15(默认)或 1 信号,避免直接用 9(强制终止可能导致数据丢失,如数据库进程);
- killall 在不同系统(如 CentOS、Ubuntu)的行为可能有差异,批量操作前建议先用 killall -l 进程名 查看匹配的进程。
3. nice/renice:调整进程优先级
功能定位:Linux 进程调度优先级由 “nice 值” 控制,值越小优先级越高(获取 CPU 资源的概率越大),nice 用于启动时设置优先级,renice 用于调整已运行进程的优先级。
核心规则:
- nice 值范围:-20(最高优先级)~ 19(最低优先级);
- 普通用户:仅能设置 0~19 的 nice 值(降低自身进程优先级),无法设置负数值;
- root 用户:可设置任意 nice 值(包括负数值,提升进程优先级)。
实战示例:
# 1. nice:启动进程时设置优先级(nice 值 5,优先级较低)
nice -n 5 ./data-processing.sh # 以 nice=5 启动脚本(适合非紧急任务)
nice --10 ./web-server.sh # 以 nice=-10 启动服务(仅 root 可用,高优先级)
# 2. renice:调整已运行进程的优先级(将 PID=1234 的进程 nice 值改为 10)
renice -n 10 -p 1234 # -p 指定 PID
renice -n -5 -u user1 # 调整 user1 所有进程的 nice 值为 -5(仅 root 可用)
适用场景:
- 后台数据备份、日志分析等非紧急任务:设置较高 nice 值(如 10),避免占用过多 CPU;
- Web 服务、数据库等核心进程:设置较低 nice 值(如 -5),确保优先获取 CPU 资源。
4. jobs/fg/bg:管理后台任务
功能定位:在 Shell 会话中,将进程放入 “后台” 运行(不阻塞命令行),或从后台调回 “前台”,适用于长时间运行的任务(如脚本、下载)。
核心概念:
- 前台任务:占用当前命令行,需等待任务结束才能输入新命令;
- 后台任务:在后台运行,不阻塞命令行,但仍依赖当前 Shell 会话(会话关闭,任务终止);
- 任务 ID(% N):Shell 为后台任务分配的编号(如 %1 表示第一个后台任务),区别于系统 PID。
实战示例:
# 1. 将任务放入后台(命令后加 &)
./long-task.sh & # 启动脚本并放入后台,输出任务 ID 和 PID(如 [1] 1234)
# 2. jobs:查看后台任务状态
jobs # 显示所有后台任务(RUNNING:运行中,STOPPED:暂停)
jobs -l # 额外显示任务的 PID
# 预期输出:
# [1]+ Running ./long-task.sh &
# 3. fg:将后台任务调回前台
fg %1 # 将任务 1 调回前台(若只有一个后台任务,可直接用 fg)
# 注:调回前台后,按 Ctrl+C 可终止任务,按 Ctrl+Z 可暂停任务
# 4. bg:将暂停的后台任务恢复运行
Ctrl+Z # 暂停当前前台任务(如运行中的 ./long-task.sh)
jobs # 查看暂停的任务(状态为 STOPPED)
bg %1 # 将暂停的任务 1 恢复为后台运行
注意事项:
- 后台任务依赖当前 Shell 会话,若需 “断开会话后仍运行”,需用 nohup 或 screen(如 nohup ./long-task.sh &);
- 暂停的任务(STOPPED)需用 bg 恢复,或用 fg 调回前台后继续运行,直接关闭 Shell 会终止任务。
5. coproc:创建协同进程(高级)
功能定位:创建一个 “后台协同进程”,并与当前 Shell 建立管道通信(可双向传递数据),适用于需要与后台进程交互的场景(如实时处理数据)。
实战示例:
# 1. 基本用法:创建压缩文件的协同进程
coproc ZIP_PROC { zip -r backup.zip ./docs; } # 后台压缩 docs 目录,进程名为 ZIP_PROC
# 查看进程状态(coproc 会创建子 Shell 运行任务)
ps -ef | grep zip
# 2. 带括号的格式(支持复杂命令)
coproc (tar -czf - ./logs | gzip -d > logs.tar) # 先压缩再解压,演示管道通信
注意事项:
- coproc 是 Bash 4.0+ 新增功能,低版本 Bash 不支持;
- 协同进程的输出可通过 $COPROC[0](标准输出)和 $COPROC[1](标准输入)访问,适合高级脚本开发,日常运维用得较少。
四、磁盘与分区管理命令:查看磁盘状态与管理存储
这类命令用于 “查看磁盘占用”“挂载 / 卸载分区”“创建文件系统”“管理 LVM(逻辑卷)”,是服务器存储运维的核心工具。
1. df:查看磁盘空间使用情况
功能定位:显示文件系统的磁盘空间占用(总容量、已用、可用、挂载点),常用于检查磁盘是否满了。
核心选项:
- -h:按 “人类可读格式” 显示(如 KB、MB、GB,基于 1024 计算);
- -H:按 “人类可读格式” 显示(基于 1000 计算,与 Windows 一致);
- -t:仅显示指定文件系统类型的分区(如 ext4、xfs);
- -T:显示文件系统类型(如 ext4、tmpfs)。
实战示例:
# 1. 查看所有分区的磁盘占用(人类可读格式,-h)
df -h
# 预期输出(关键列):
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 20G 27G 43% /
# /dev/sdb1 100G 10G 85G 11% /data
# 2. 仅查看 ext4 和 xfs 类型的分区(-t)
df -h -t ext4 -t xfs
# 3. 查看 /data 分区的详细信息(含文件系统类型,-T)
df -hT /data
注意事项:
- df 显示的 “已用空间” 可能包含系统预留空间(默认 5%,仅 root 可使用),普通用户看到的 “可用空间” 会比实际小;
- 若某个分区的 Use% 接近 100%,需及时清理(如删除日志、临时文件),避免系统无法写入数据。
2. du:查看文件 / 目录占用空间
功能定位:显示单个文件或目录的磁盘占用大小(与 df 不同,df 看分区整体,du 看具体文件 / 目录)。
核心选项:
- -s:仅显示总大小(summary,不显示子目录 / 文件的明细);
- -h:按人类可读格式显示;
- -a:显示所有文件(包括子目录下的单个文件,默认仅显示目录);
- --max-depth=N:限制递归深度(如 --max-depth=1 仅显示当前目录下的一级目录 / 文件)。
实战示例:
# 1. 查看当前目录总占用空间(-sh)
du -sh
# 预期输出:2.5G .
# 2. 查看当前目录下所有一级目录的占用(--max-depth=1)
du -sh --max-depth=1 *
# 预期输出:
# 1.2G docs
# 800M logs
# 500M tmp
# 3. 查看单个文件的大小(-h)
du -h /var/log/syslog
# 预期输出:1.2M /var/log/syslog
# 4. 按大小排序,找出当前目录下最大的 5 个文件/目录
du -sh * | sort -hr | head -n 5 # sort -hr:按人类可读格式倒序排序
实用技巧:结合 find 命令查找大文件(如查找 /home 下大于 100MB 的文件):
find /home -type f -size +100M -exec du -sh {} \;
3. mount/umount:挂载 / 卸载文件系统
功能定位:
- mount:将磁盘分区、U 盘、ISO 文件等 “挂载” 到 Linux 目录树中(只有挂载后才能访问);
- umount:将已挂载的文件系统 “卸载”(卸载前需确保无进程访问该目录,否则报错)。
mount 核心选项:
- -t:指定文件系统类型(如 ext4、xfs、ntfs-3g(Windows 分区)、iso9660(ISO 文件));
- -o:指定挂载选项(如 ro(只读)、rw(读写,默认)、noexec(禁止执行该目录下的程序));
- -a:按 /etc/fstab 文件的配置,挂载所有未挂载的分区(系统启动时自动执行)。
实战示例:
# 1. 挂载磁盘分区(/dev/sdb1 挂载到 /mnt/data,ext4 格式,只读)
mount -t ext4 -o ro /dev/sdb1 /mnt/data
# 验证挂载:查看 /mnt/data 目录下的内容,或用 df -h 查看
# 2. 挂载 ISO 文件(loop 设备,模拟光盘)
mount -t iso9660 -o loop /tmp/ubuntu.iso /mnt/iso
# 注:-o loop 用于挂载“普通文件”为块设备
# 3. 永久挂载(写入 /etc/fstab,系统重启后自动挂载)
# 步骤1:查看分区的 UUID(避免设备名变化导致挂载失败)
blkid /dev/sdb1 # 输出 UUID="xxxx-xxxx-xxxx-xxxx"
# 步骤2:编辑 /etc/fstab,添加一行(格式:UUID=xxx 挂载点 类型 选项 0 0)
echo 'UUID=xxxx-xxxx-xxxx-xxxx /mnt/data ext4 defaults 0 0' >> /etc/fstab
# 步骤3:测试挂载(无需重启)
mount -a
# 4. umount:卸载文件系统(指定设备或挂载点)
umount /dev/sdb1 # 通过设备卸载
umount /mnt/data # 通过挂载点卸载(推荐,更明确)
umount 常见问题与解决:
- 报错 umount: /mnt/data: target is busy.(目标忙):
- 查看哪个进程在访问该目录:fuser -m /mnt/data(显示占用进程的 PID);
- 终止进程:kill -9 PID;
- 再次卸载:umount /mnt/data。
4. fdisk/gdisk/parted:分区管理
功能定位:在磁盘上创建、删除、调整分区,三者支持的分区表格式不同,需根据磁盘大小和需求选择:
命令 | 支持分区表格式 | 最大磁盘支持 | 核心特点 | 适用场景 |
---|---|---|---|---|
fdisk | MBR | 2TB | 经典工具,操作简单,支持大多数 Linux 系统 | 2TB 以下磁盘,传统 MBR 分区 |
gdisk | GPT | 无限制(支持 18EB) | 支持 GPT 分区表,操作逻辑与 fdisk 类似,适合大磁盘 | 2TB 以上磁盘,GPT 分区 |
parted | MBR/GPT | 无限制 | 支持两种分区表,命令更接近 “自然语言”,可交互式或非交互式操作,功能更全面 | 需灵活切换分区表格式的场景 |
实战示例(以 fdisk 为例,创建 MBR 分区):
# 1. 查看系统中的磁盘(确认目标磁盘,如 /dev/sdb)
lsblk # 列出所有块设备(磁盘、分区)
fdisk -l /dev/sdb # 查看 /dev/sdb 磁盘的详细信息(是否已有分区)
# 2. 进入 fdisk 交互式界面(操作 /dev/sdb,需 root 权限)
fdisk /dev/sdb
# 3. 核心操作(fdisk 交互命令)
# - n:创建新分区(按提示选择“主分区/扩展分区”“分区号”“起始扇区”“大小”)
# - p:查看当前分区表(确认分区是否创建成功)
# - d:删除分区(谨慎使用,需指定分区号)
# - w:保存修改并退出(必须执行,否则所有操作无效)
# - q:放弃修改并退出
# 示例流程(创建一个 50GB 的主分区):
# 输入 n → 选择 p(主分区)→ 分区号 1 → 起始扇区默认(按 Enter)→ 输入 +50G(分区大小)→ 输入 p 查看 → 输入 w 保存退出
注意事项:
- 分区操作会清除磁盘上的所有数据,操作前必须备份重要数据;
- 对已挂载的磁盘,需先卸载所有分区(umount /dev/sdb*),再进行分区操作;
- 分区完成后,需用 mkfs 命令创建文件系统(如 mkfs -t ext4 /dev/sdb1),才能挂载使用。
5. lvm 相关命令:逻辑卷管理(高级存储)
功能定位:LVM(Logical Volume Manager,逻辑卷管理)是 Linux 中灵活的存储管理方案,可将多个物理磁盘 / 分区(PV)整合为卷组(VG),再从卷组中划分逻辑卷(LV),支持 “动态扩容 / 缩容”“跨磁盘整合”,解决传统分区 “大小固定、无法调整” 的问题。
核心概念:
- PV(Physical Volume,物理卷):底层存储单元(如 /dev/sdb1、/dev/sdc1),需先初始化才能加入 LVM;
- VG(Volume Group,卷组):将多个 PV 整合为一个 “存储池”,可动态添加 / 移除 PV;
- LV(Logical Volume,逻辑卷):从 VG 中划分的 “虚拟分区”,可直接格式化并挂载使用,支持动态调整大小。
常用 LVM 命令组合(按流程):
操作流程 | 命令组合 | 核心作用 |
---|---|---|
1. 创建 PV | pvcreate /dev/sdb1 /dev/sdc1 | 将物理分区初始化为 PV,纳入 LVM 管理 |
2. 创建 VG | vgcreate vg00 /dev/sdb1 /dev/sdc1 | 将 PV 整合为卷组 vg00,形成存储池 |
3. 创建 LV | lvcreate -L 20G -n lv_data vg00 | 从 vg00 中划分 20GB 的逻辑卷,命名为 lv_data(路径:/dev/vg00/lv_data) |
4. 格式化与挂载 LV | mkfs -t ext4 /dev/vg00/lv_data && mount /dev/vg00/lv_data /data | 格式化 LV 为 ext4 格式,挂载到 /data 目录 |
5. 扩展 LV(扩容) | lvextend -L 30G /dev/vg00/lv_data && resize2fs /dev/vg00/lv_data | 先扩展 LV 大小到 30GB,再调整文件系统大小(ext4 用 resize2fs,xfs 用 xfs_growfs) |
6. 查看 LVM 状态 | pvdisplay/vgdisplay/lvdisplay | 分别查看 PV、VG、LV 的详细信息(大小、状态、关联关系) |
实战示例(完整 LVM 创建流程):
# 1. 初始化物理卷(PV)
pvcreate /dev/sdb1 /dev/sdc1 # 将 /dev/sdb1 和 /dev/sdc1 初始化为 PV
pvdisplay # 验证 PV 创建结果(查看 PV 大小、状态)
# 2. 创建卷组(VG)
vgcreate vg00 /dev/sdb1 /dev/sdc1 # 卷组命名为 vg00,包含两个 PV
vgdisplay vg00 # 查看 vg00 的总容量、剩余容量
# 3. 创建逻辑卷(LV)
lvcreate -L 20G -n lv_data vg00 # 划分 20GB 逻辑卷 lv_data
lvdisplay /dev/vg00/lv_data # 查看 lv_data 的路径、大小
# 4. 格式化并挂载 LV(日常使用)
mkfs -t ext4 /dev/vg00/lv_data # 格式化为 ext4 文件系统
mkdir /data # 创建挂载点
mount /dev/vg00/lv_data /data # 挂载 LV 到 /data
echo '/dev/vg00/lv_data /data ext4 defaults 0 0' >> /etc/fstab # 永久挂载
# 5. 扩展 LV(后续扩容需求)
# 步骤1:先扩展 LV 大小(从 20GB 到 30GB)
lvextend -L 30G /dev/vg00/lv_data
# 步骤2:调整文件系统大小(ext4 用 resize2fs,xfs 用 xfs_growfs)
resize2fs /dev/vg00/lv_data
# 验证扩容结果
df -h /data # 查看 /data 分区大小是否变为 30GB
注意事项:
- 缩容 LV 需先卸载分区并检查文件系统(e2fsck -f /dev/vg00/lv_data),风险较高,建议优先通过扩容解决空间问题;
- XFS 文件系统仅支持扩容,不支持缩容,若需缩容需备份数据后重新创建 LV;
- 扩展 LV 后必须执行 “文件系统调整命令”(如 resize2fs),否则文件系统无法识别新增空间。
6. 其他磁盘工具命令
命令 | 功能定位 | 实战示例 |
---|---|---|
lsblk | 以树形结构列出所有块设备(磁盘、分区、LV),直观展示存储设备关系 | lsblk # 查看所有设备的层级关系(如 /dev/sda 包含 /dev/sda1、/dev/sda2) |
mkfs | 创建文件系统(格式化分区 / LV),支持 ext4、xfs、vfat 等格式 | mkfs -t xfs /dev/vg00/lv_data # 格式化 LV 为 xfs 格式 |
fsck | 检查并修复文件系统错误(如断电导致的磁盘损坏),需卸载后执行 | umount /data && fsck -a -t ext4 /dev/vg00/lv_data # 自动修复 ext4 错误 |
blkid | 查看块设备的 UUID 和文件系统类型(用于 /etc/fstab 永久挂载,避免设备名变化) | blkid /dev/sdb1 # 查看 /dev/sdb1 的 UUID(如 UUID="a1b2c3d4-1234-5678-90ab-cdef01234567") |
五、用户与权限管理命令:控制访问与安全
Linux 是多用户系统,用户与权限管理是系统安全的核心。这类命令用于 “创建 / 删除用户”“管理用户组”“修改文件权限”,避免未授权访问。
1. 用户管理:useradd/userdel/usermod/passwd
(1)useradd:创建用户
核心选项:
- -m:创建用户时自动创建主目录(/home/用户名),否则需手动创建;
- -d:指定自定义主目录(如 -d /opt/user1);
- -s:指定用户的默认登录 Shell(如 -s /bin/bash,/sbin/nologin 表示禁止登录);
- -G:将用户加入指定附加组(如 -G sudo 赋予 sudo 权限);
- -D:查看或修改 useradd 的默认配置(如默认 Shell、主目录路径)。
实战示例:
# 1. 创建普通用户(带主目录,默认 Shell)
useradd -m user1 # 自动创建 /home/user1 目录,默认 Shell 为 /bin/bash
passwd user1 # 为 user1 设置密码(需输入两次,密码不可见)
# 2. 创建禁止登录的系统用户(用于运行服务)
useradd -s /sbin/nologin -M nginx # -M 不创建主目录,-s 指定禁止登录 Shell
# 场景:用于 Nginx 服务进程,避免用户直接登录系统
# 3. 查看 useradd 默认配置
useradd -D
# 预期输出:默认主目录(/home)、默认 Shell(/bin/bash)、默认组(100)等
(2)userdel:删除用户
核心选项:
- -r:删除用户时同时删除主目录(/home/用户名)和邮件目录(/var/spool/mail/用户名),谨慎使用。
实战示例:
# 1. 仅删除用户(保留主目录,安全操作)
userdel user1
# 2. 彻底删除用户及主目录(-r,需确认主目录无重要数据)
userdel -r user1
# 警告:若主目录包含其他用户依赖的文件,删除后会导致数据丢失!
(3)usermod:修改用户属性
核心选项:
- -c:修改用户备注信息(如姓名、部门);
- -s:修改默认登录 Shell(如 -s /bin/zsh);
- -g:修改用户的主组(需先存在该组);
- -aG:将用户追加到附加组(不覆盖原有附加组,如 -aG sudo user1 赋予 sudo 权限);
- -L/-U:锁定 / 解锁用户(锁定后无法登录,如 -L user1)。
实战示例:
# 1. 赋予用户 sudo 权限(加入 sudo 附加组)
usermod -aG sudo user1
# 验证:切换到 user1,执行 sudo ls,看是否需要输入密码(配置 sudoers 可免密)
# 2. 锁定用户(禁止登录)
usermod -L user1
# 验证:su - user1 会提示“密码错误”(实际密码未变,仅锁定账户)
# 3. 解锁用户
usermod -U user1
(4)passwd:修改用户密码
核心选项:
- -e:强制用户下次登录时修改密码(常用于初始密码发放,确保用户自行修改);
- -l/-u:锁定 / 解锁用户密码(与 usermod -L 类似,但仅影响密码登录)。
实战示例:
# 1. 管理员修改其他用户密码(无需输入旧密码)
passwd user1 # 输入新密码两次(密码强度需符合系统要求,如长度≥8位、含大小写)
# 2. 强制用户下次登录修改密码(-e)
passwd -e user1
# 效果:user1 下次登录时,会提示“您的密码已过期,请设置新密码”
2. 组管理:groupadd/groupmod/groupdel
功能定位:Linux 中用户组分为 “主组”(用户默认所属组,创建用户时自动创建)和 “附加组”(用户额外加入的组,用于共享权限),组管理命令用于维护这些组。
实战示例:
# 1. 创建新组(如开发组 dev)
groupadd dev
# 2. 修改组名(将 dev 改为 develop)
groupmod -n develop dev
# 3. 修改组的 GID(组唯一标识,如将 GID 改为 1005)
groupmod -g 1005 develop
# 4. 删除组(需确保组内无用户,否则需先调整用户组)
groupdel develop
# 若报错“groupdel: cannot remove the primary group of user 'user1'”,需先将 user1 的主组改为其他组(usermod -g users user1)
3. 权限管理:chmod/chown/chgrp/setfacl
Linux 文件权限分为 “所有者(u)”“所属组(g)”“其他用户(o)” 三类,每类用户有 “读(r=4)、写(w=2)、执行(x=1)” 三种权限,权限管理命令用于调整这些规则。
(1)chmod:修改文件 / 目录权限
权限表示方式:
- 数字格式:用三位数字表示(如 755 → 所有者 rwx(4+2+1)、所属组 rx(4+1)、其他 rx(4+1));
- 符号格式:用 u/g/o/a(所有者 / 所属组 / 其他 / 所有)+ +/-/=(添加 / 移除 / 设置)+ r/w/x 表示(如 chmod u+x file 给所有者添加执行权限)。
实战示例:
# 1. 数字格式修改权限(常用)
chmod 755 script.sh # 所有者 rwx,所属组 rx,其他 rx(脚本文件常用权限)
chmod 644 config.conf # 所有者 rw,所属组 r,其他 r(配置文件常用权限)
chmod 700 ~/private/ # 仅所有者可读写执行,其他用户无权限(私有目录)
# 2. 符号格式修改权限(灵活)
chmod u+x script.sh # 给所有者添加执行权限
chmod g-w config.conf # 移除所属组的写权限
chmod o=r config.conf # 给其他用户设置仅读权限
chmod a+x script.sh # 给所有用户添加执行权限(a=all)
# 3. 递归修改目录权限(-R)
chmod -R 755 /opt/app/ # 递归修改 /opt/app 目录及所有子文件的权限为 755
(2)chown:修改文件 / 目录的所有者与所属组
核心格式:chown [所有者]:[所属组]] 文件/目录,: 可替换为 .,若仅修改所属组,可省略所有者(如 chown :dev file)。
实战示例:
# 1. 仅修改所有者
chown user1 file.txt # 将 file.txt 的所有者改为 user1
# 2. 仅修改所属组
chown :dev file.txt # 将 file.txt 的所属组改为 dev
# 3. 同时修改所有者和所属组
chown user1:dev file.txt # 所有者改为 user1,所属组改为 dev
# 4. 递归修改目录(-R,常用于权限交接)
chown -R user1:dev /opt/project/ # 递归修改项目目录的所有者和所属组
(3)chgrp:仅修改所属组(简化版 chown)
功能定位:专门用于修改文件 / 目录的所属组,语法比 chown :组 更直观。
实战示例:
chgrp dev file.txt # 将 file.txt 的所属组改为 dev
chgrp -R dev /opt/project/ # 递归修改目录所属组
(4)setfacl/getfacl:设置 ACL 权限(精细控制)
功能定位:传统权限仅支持 “所有者、所属组、其他” 三类用户,ACL(Access Control List)可对 “单个用户、多个组” 设置独立权限(如给 user2 单独设置写权限,无需加入所属组),是复杂场景下的权限解决方案。
核心选项(setfacl):
- -m:添加 / 修改 ACL 规则(如 -m u:user2:rw file 给 user2 设置 rw 权限);
- -x:删除指定 ACL 规则(如 -x u:user2 file 删除 user2 的 ACL 权限);
- -d:设置目录的默认 ACL(目录下新建文件自动继承该权限,如 -d g:dev:rw dir);
- -R:递归应用 ACL 规则到目录及子文件。
实战示例:
# 1. 给单个用户设置 ACL 权限
setfacl -m u:user2:rw file.txt # 给 user2 单独设置 rw 权限(即使 user2 不在所属组)
getfacl file.txt # 查看 ACL 权限(验证是否生效)
# 2. 给组设置 ACL 权限
setfacl -m g:test:r file.txt # 给 test 组设置 r 权限
# 3. 设置目录默认 ACL(新建文件自动继承)
setfacl -d -m g:dev:rw /opt/shared/ # 共享目录 /opt/shared 下新建的文件,自动给 dev 组 rw 权限
# 4. 递归删除 ACL 权限
setfacl -R -x u:user2 /opt/shared/ # 递归删除 user2 在 /opt/shared 下的所有 ACL 权限
六、软件包管理命令:dpkg 与 apt(Debian/Ubuntu 系列)
Linux 软件包管理分为 “Debian 系”(.deb 包,如 Ubuntu、Debian)和 “RPM 系”(.rpm 包,如 CentOS、RHEL),本文聚焦 Debian 系最常用的 dpkg(底层工具)和 apt(高层工具),覆盖 “安装、卸载、更新、搜索” 软件全流程。
1. dpkg:底层 DEB 包管理工具
功能定位:直接操作 .deb 包文件的底层工具,负责 “安装、删除、查询” 单个 DEB 包,但不自动处理依赖关系(需手动解决依赖问题),适合离线安装场景。
核心选项:
选项 | 功能说明 |
---|---|
-i | 安装 DEB 包文件(如 dpkg -i package.deb) |
-L | 列出已安装包的所有文件路径(如 dpkg -L nginx 查看 nginx 安装的文件) |
--search | 查找指定文件属于哪个已安装包(如 dpkg --search /usr/sbin/nginx) |
-r | 移除已安装包(保留配置文件,如 dpkg -r nginx) |
-P | 彻底移除已安装包(删除配置文件,如 dpkg -P nginx,等价于 apt purge) |
-l | 列出所有已安装包的状态(如 dpkg -l | grep nginx 查看 nginx 安装状态) |
实战示例:
# 1. 离线安装 DEB 包(需提前下载 .deb 文件)
dpkg -i ~/downloads/nginx_1.24.0-1ubuntu1_amd64.deb
# 若报错“依赖关系未满足”,需先执行 apt -f install 修复依赖
# 2. 查看 nginx 包安装的所有文件路径
dpkg -L nginx
# 预期输出:/usr/sbin/nginx(二进制文件)、/etc/nginx(配置目录)、/var/log/nginx(日志目录)等
# 3. 查找 /usr/bin/ls 属于哪个包(验证系统工具归属)
dpkg --search /usr/bin/ls
# 预期输出:coreutils: /usr/bin/ls(说明 ls 属于 coreutils 包)
# 4. 彻底卸载 nginx(删除配置文件)
dpkg -P nginx
注意事项:
- dpkg -i 安装包时若提示 “依赖缺失”,需执行 apt -f install 自动修复依赖(apt 会补装缺失的依赖包);
- 优先使用 apt 工具(而非直接用 dpkg),避免手动处理依赖的繁琐。
2. apt:高层软件包管理工具(推荐)
功能定位:apt 是 Debian 系 Linux 中最常用的高层工具,整合了 apt-get(安装 / 更新)、apt-cache(搜索 / 查询)的功能,支持 “自动处理依赖”“从软件源更新包索引”,操作更简洁、交互更友好,是日常软件管理的首选。
核心命令与场景:
操作需求 | 命令示例 | 功能说明 |
---|---|---|
1. 更新软件源索引 | apt update | 从 /etc/apt/sources.list 配置的软件源,同步最新的包版本信息(不更新软件) |
2. 升级已安装软件 | apt upgrade | 升级所有已安装软件到最新版本(不删除旧包,不安装新依赖包) |
3. 完整升级(含依赖调整) | apt full-upgrade | 升级软件时,允许删除旧包、安装新依赖包(适合跨版本升级,如 Ubuntu 22.04→24.04) |
4. 安装软件包 | apt install nginx | 安装 nginx 及其所有依赖包,支持批量安装(如 apt install nginx mysql) |
5. 卸载软件包(保留配置) | apt remove nginx | 卸载 nginx,但保留 /etc/nginx 等配置文件(后续重装可复用配置) |
6. 彻底卸载软件包 | apt purge nginx | 卸载 nginx 并删除所有配置文件(完全清理,无残留) |
7. 搜索软件包 | apt search "web server" | 按关键词搜索软件包(如搜索 “web server” 相关的 nginx、apache) |
8. 查看软件包详情 | apt show nginx | 显示 nginx 包的版本、依赖、描述、安装大小等详细信息 |
9. 清理无用依赖 | apt autoremove | 自动删除 “已安装但不再被需要的依赖包”(如软件卸载后残留的依赖) |
10. 清理下载的包文件 | apt autoclean | 清理 /var/cache/apt/archives 中过时的 .deb 包文件(保留最新版本) |
实战示例(常用流程):
# 1. 日常更新系统(先更新索引,再升级软件,最后清理无用依赖)
sudo apt update -y # -y 自动确认,避免手动输入 y
sudo apt upgrade -y
sudo apt autoremove -y
# 2. 安装并配置 nginx(完整流程)
sudo apt install nginx -y # 安装 nginx
sudo systemctl start nginx # 启动 nginx 服务
apt show nginx # 查看 nginx 安装详情(如版本、依赖)
# 3. 搜索并安装 MySQL(按关键词搜索)
apt search mysql-server # 搜索 MySQL 服务器相关包
sudo apt install mysql-server -y # 安装 MySQL 服务
# 4. 彻底卸载 MySQL(清理配置和依赖)
sudo apt purge mysql-server -y
sudo apt autoremove -y # 清理 MySQL 残留的依赖包
实用技巧:
- 安装特定版本的软件:apt install nginx=1.24.0-1ubuntu1(需先通过 apt show nginx 查看可用版本);
- 禁止软件自动升级:apt-mark hold nginx(锁定 nginx 版本,避免 apt upgrade 误升级),解锁用 apt-mark unhold nginx。
七、定时任务命令:at 与 crontab(自动化操作)
Linux 定时任务用于 “按指定时间自动执行命令 / 脚本”,分为 “一次性任务”(at)和 “周期性任务”(crontab),是运维自动化的核心工具(如定时备份、日志清理)。
1. at:执行一次性定时任务
功能定位:安排 “仅执行一次” 的任务(如 “今天 18:00 执行备份脚本”“明天凌晨 2 点重启服务”),任务执行后自动清除,不重复。
核心选项:
- -f:指定要执行的脚本文件(如 at -f backup.sh 18:00);
- -M:禁止任务执行时发送邮件通知(默认会将输出发送到当前用户邮箱);
- -t:按 “YYYYMMDDHHMM” 格式指定时间(如 at -t 202406010200 -f restart.sh 表示 2024 年 6 月 1 日 2 点执行)。
时间格式支持:
- 绝对时间:18:00(今天 18 点)、2024-06-01 18:00(指定日期时间);
- 相对时间:now + 1 hour(1 小时后)、now + 30 minutes(30 分钟后)、tomorrow 2:00(明天 2 点)。
实战示例:
# 1. 1 小时后执行备份脚本(交互式输入任务)
at now + 1 hour
# 进入 at 编辑界面,输入要执行的命令:
# /home/user1/scripts/backup.sh
# 按 Ctrl+D 保存退出(会提示任务 ID,如 job 1 at 2024-05-30 17:30)
# 2. 指定时间执行脚本(通过 -f 读取脚本文件)
at -f /home/user1/scripts/backup.sh 2024-06-01 02:00
# 场景:明天凌晨 2 点执行备份,避免占用白天资源
# 3. 查看等待执行的 at 任务
atq # 显示任务 ID、执行时间、用户(如 1 Thu May 30 17:30:00 2024 a user1)
# 4. 删除等待执行的 at 任务(按任务 ID)
atrm 1 # 删除任务 ID 为 1 的 at 任务
注意事项:
- at 任务依赖 atd 服务,需确保服务已启动(systemctl start atd,设置开机启动 systemctl enable atd);
- 任务执行的输出默认发送到用户邮箱(可通过 mail 命令查看),若无需通知,加 -M 选项。
2. crontab:执行周期性定时任务
功能定位:安排 “周期性重复” 的任务(如 “每天凌晨 3 点备份”“每周日 22 点清理日志”“每小时检查服务状态”),是运维中最常用的定时任务工具,依赖 cron 服务。
核心概念:
- crontab 文件:每个用户有独立的 crontab 文件(存储在 /var/spool/cron/crontabs/ 下),记录周期性任务;
- 时间表达式:由 5 个字段组成,代表 “分 时 日 月 周”,字段间用空格分隔,支持通配符(* 所有值、/ 步长、- 范围、, 多个值)。
时间表达式格式:
字段位置 | 含义 | 取值范围 | 特殊符号说明 |
---|---|---|---|
1 | 分钟 | 0-59 | */5 表示每 5 分钟,10-20 表示 10-20 分钟,10,20 表示 10 和 20 分钟 |
2 | 小时 | 0-23 | */2 表示每 2 小时,3-5 表示 3-5 点 |
3 | 日 | 1-31 | 1,15 表示每月 1 号和 15 号 |
4 | 月 | 1-12 或 Jan-Dec | */3 表示每 3 个月 |
5 | 周 | 0-7 或 Sun-Sat(0 和 7 均为周日) | 0,6 表示每周日和周六 |
常用时间表达式示例:
时间需求 | 时间表达式 | 说明 |
---|---|---|
每天凌晨 3 点 | 0 3 * * * | 分钟 0,小时 3,日 / 月 / 周任意 |
每 5 分钟执行一次 | _/5 _ * * * | 分钟每 5 步,其他字段任意 |
每周一到周五 18:30 | 30 18 * * 1-5 | 分钟 30,小时 18,周 1-5(周一到周五) |
每月 1 号和 15 号 22 点 | 0 22 1,15 * * | 分钟 0,小时 22,日 1 和 15,月 / 周任意 |
crontab 核心命令:
命令 | 功能说明 |
---|---|
crontab -l | 列出当前用户的所有定时任务(查看已配置的任务) |
crontab -e | 编辑当前用户的定时任务(打开 vim 编辑器,添加 / 修改任务) |
crontab -r | 删除当前用户的所有定时任务(谨慎使用,无确认步骤) |
crontab -u 用户名 -l | 查看指定用户的定时任务(仅 root 可用,如 crontab -u user1 -l) |
实战示例(配置定时备份任务):
# 1. 编辑当前用户的定时任务(crontab -e)
crontab -e
# 进入 vim 编辑器,添加以下内容(每天凌晨 3 点执行备份脚本,输出日志到 /var/log/backup.log):
0 3 * * * /home/user1/scripts/backup.sh >> /var/log/backup.log 2>&1
# 说明:
# >> /var/log/backup.log:将标准输出(stdout)追加到日志文件
# 2>&1:将标准错误(stderr)重定向到标准输出,确保错误信息也写入日志
# 2. 查看已配置的定时任务
crontab -l
# 预期输出:0 3 * * * /home/user1/scripts/backup.sh >> /var/log/backup.log 2>&1
# 3. 查看 cron 服务状态(确保任务能正常执行)
systemctl status cron
# 若服务未启动,执行:systemctl start cron && systemctl enable cron(设置开机启动)
# 4. 排查任务执行情况(查看日志)
tail -f /var/log/backup.log # 实时查看备份日志
grep CRON /var/log/syslog # 查看 cron 服务的系统日志(确认任务是否触发)
注意事项:
- 定时任务的环境变量与当前 Shell 不同(如 PATH 可能不包含自定义路径),脚本中建议使用绝对路径(如 /usr/bin/mysqldump 而非 mysqldump);
- 避免任务执行时间重叠(如备份任务需 1 小时,不要设置为每 30 分钟执行一次);
- 敏感任务(如数据库备份)建议添加 “执行结果通知”(如任务结束后发送邮件到管理员邮箱)。
八、其他高频工具命令:补充日常操作场景
除上述核心分类外,以下命令覆盖 “文本处理、时间管理、临时文件、权限提升” 等高频场景,是提升操作效率的关键。
1. 文本处理:grep/sort/tar/zip/unzip
(1)grep:搜索文本内容
功能定位:在文件或命令输出中搜索匹配的字符串,支持正则表达式,是 “日志排查、配置查找” 的核心工具。
核心选项:
- -n:显示匹配行的行号;
- -v:反向匹配(显示不包含关键词的行);
- -c:统计匹配行的数量;
- -e:指定多个搜索条件(如 -e user1 -e user2 搜索包含 user1 或 user2 的行);
- -E:启用扩展正则表达式(无需转义 | () 等符号,等价于 egrep);
- -r:递归搜索目录下的所有文件(如 grep -r "error" /var/log/)。
实战示例:
# 1. 搜索 /etc/passwd 中包含 user1 的行,并显示行号
grep -n user1 /etc/passwd
# 2. 统计 /var/log/syslog 中包含 ERROR 的行数
grep -c "ERROR" /var/log/syslog
# 3. 搜索当前目录及子目录中,包含 "nginx" 的 .conf 文件
grep -r "nginx" --include="*.conf" ./
# 4. 用扩展正则表达式,搜索包含 user1 或 user2 的行
grep -E "user1|user2" /etc/passwd
(2)sort:排序文本内容
功能定位:对文本文件或命令输出按 “字母、数字、字段” 排序,支持自定义分隔符和排序规则,常用于日志分析、数据统计场景。
核心选项:
-n:按 “数字大小” 排序(默认按字母顺序,如 10 会排在 2 前面,-n 可修正);
-r:倒序排序(从大到小 / 从 Z 到 A);
-t:指定字段分隔符(如 -t ':' 用冒号分隔字段,常用于 /etc/passwd 等配置文件);
-k:指定排序字段(配合 -t 使用,如 -k 3 表示按第 3 个字段排序);
-u:去重(仅保留排序后重复行的第一行)。
实战示例:
# 1. 按数字大小排序(解决字母排序的数字错位问题)
# 原始文件 numbers.txt 内容:10 2 25 5
sort numbers.txt # 默认字母排序:10 2 25 5
sort -n numbers.txt # 数字排序:2 5 10 25
sort -nr numbers.txt # 数字倒序:25 10 5 2
# 2. 按字段排序(以 /etc/passwd 为例,按 UID 排序)
# /etc/passwd 格式:用户名:密码:UID:GID:备注:主目录:Shell
sort -t ':' -k 3 -n /etc/passwd # -t ':' 分隔字段,-k 3 按第 3 字段(UID),-n 数字排序
# 3. 结合其他命令排序(查看当前目录文件大小,按大小倒序)
du -sh * | sort -hr # du -sh * 显示文件大小,sort -hr 按人类可读格式倒序(h 支持 KB/MB/GB)
(3)tar:打包与压缩 / 解压(Linux 标准工具)
功能定位:tar 是 Linux 中最常用的 “打包 + 压缩” 工具,支持 .tar(仅打包)、.tar.gz(打包 + gzip 压缩)、.tar.bz2(打包 + bzip2 压缩)等格式,几乎支持所有压缩场景,尤其适合目录打包。
核心选项(记忆口诀:“c 创 x 解 t 查看,v 详细 f 指定,z gzip j bzip2”):
选项 | 功能说明 |
---|---|
-c | 创建打包文件(create,用于压缩场景) |
-x | 提取打包文件(extract,用于解压场景) |
-t | 查看打包文件中的内容(list,不解压即可查看文件列表) |
-v | 显示详细操作过程(verbose,如压缩 / 解压的文件名) |
-f | 指定打包文件路径(file,必须放在选项最后,如 -f backup.tar.gz) |
-z | 用 gzip 压缩 / 解压(对应 .tar.gz 格式,压缩率中等,速度快) |
-j | 用 bzip2 压缩 / 解压(对应 .tar.bz2 格式,压缩率高,速度慢) |
-C | 解压到指定目录(如 -C /opt 表示解压到 /opt 目录,目录需提前存在) |
实战示例(高频场景):
# 1. 压缩目录(打包+gzip 压缩,最常用)
tar -czvf backup.tar.gz /home/user1/docs # 压缩 docs 目录为 backup.tar.gz,显示详细过程
# 选项解析:c(创建)、z(gzip)、v(详细)、f(指定文件)
# 2. 解压文件(解压到当前目录)
tar -xzvf backup.tar.gz # 解压 .tar.gz 文件,显示详细过程
# 3. 解压到指定目录(-C)
tar -xzvf backup.tar.gz -C /opt/backup # 解压到 /opt/backup 目录(需先创建该目录)
# 4. 查看压缩包内容(不解压)
tar -tzvf backup.tar.gz # 查看 backup.tar.gz 中的所有文件/目录
# 5. 打包不压缩(仅打包,用于迁移文件)
tar -cvf data.tar /home/user1/data # 仅打包为 data.tar,不压缩
(4)zip/unzip:ZIP 格式压缩 / 解压(跨平台兼容)
功能定位:处理 ZIP 格式的压缩文件,兼容 Windows 系统(Windows 默认支持 ZIP 格式),适合跨系统传输文件,但压缩率低于 tar.gz。
核心选项:
- zip -r:递归压缩目录(压缩文件夹时必须加,否则仅压缩目录名,不包含内容);
- unzip -d:指定解压目录(如 -d /opt/unzip 表示解压到该目录);
- unzip -l:查看 ZIP 包中的内容(不解压)。
实战示例:
# 1. 压缩目录(递归压缩)
zip -r docs.zip /home/user1/docs # 压缩 docs 目录为 docs.zip
# 2. 解压到当前目录
unzip docs.zip
# 3. 解压到指定目录(-d)
unzip docs.zip -d /opt/docs # 解压到 /opt/docs 目录
# 4. 查看 ZIP 包内容
unzip -l docs.zip
2. 时间与日期:date
功能定位:显示或设置系统时间,支持自定义时间格式(如显示时间戳、指定日期格式),常用于脚本中记录时间(如备份文件名含日期)。
核心用法:
- 显示当前时间:直接输入 date;
- 自定义格式:用 +格式符 指定输出格式(常用格式符:%Y 年、%m 月、%d 日、%H 时、%M 分、%S 秒、%s 时间戳);
- 显示指定日期:用 -d 指定日期(如 -d "2024-06-01" 显示 2024 年 6 月 1 日的时间);
- 设置系统时间:date -s "2024-05-30 16:30:00"(需 root 权限,设置后建议同步硬件时间:hwclock -w)。
实战示例:
# 1. 显示当前时间(默认格式)
date
# 预期输出:Thu May 30 16:30:00 CST 2024
# 2. 自定义时间格式(常用于脚本命名,如 backup_20240530_1630.tar.gz)
date +"%Y%m%d_%H%M%S" # 输出:20240530_163000
date +"%F %T" # 输出:2024-05-30 16:30:00(%F 等价于 %Y-%m-%d,%T 等价于 %H:%M:%S)
# 3. 显示时间戳(从 1970-01-01 00:00:00 UTC 到当前的秒数)
date +%s # 输出:1717067400(示例值)
# 4. 显示指定日期的时间(如 3 天后的时间)
date -d "+3 days" +"%F %T" # 输出 3 天后的日期时间
date -d "2024-06-01" +"%A" # 输出 2024-06-01 是星期几(%A 显示完整星期名,如 Saturday)
3. 临时文件与输入:mktemp/read/tee
(1)mktemp:创建临时文件 / 目录
功能定位:安全创建临时文件或目录(自动生成唯一文件名,避免命名冲突),常用于脚本中存储临时数据(临时文件默认存放在 /tmp 目录)。
核心选项:
- -t:在 /tmp 目录创建临时文件(文件名含前缀和随机字符,如 tmp.XXXXXX);
- -d:创建临时目录(而非文件)。
实战示例:
# 1. 创建临时文件(当前目录,前缀为 test.,后接 6 个随机字符)
mktemp test.XXXXXX
# 预期输出:test.VJHi7Y(随机字符每次不同)
# 2. 在 /tmp 目录创建临时文件(-t)
mktemp -t test.XXXXXX
# 预期输出:/tmp/test.kOSRbP(路径固定在 /tmp)
# 3. 创建临时目录(-d)
mktemp -d temp_dir.XXXXXX
# 预期输出:temp_dir.1P7njo(临时目录,可存放多个临时文件)
# 4. 脚本中使用(创建临时文件,写入数据后自动删除)
temp_file=$(mktemp -t data.XXXXXX)
echo "临时数据" > $temp_file
cat $temp_file
rm -f $temp_file # 脚本结束后删除临时文件
(2)read:读取用户输入
功能定位:在脚本中读取用户输入的内容,并赋值给变量,支持设置超时时间、输入长度限制、隐藏输入(如密码)。
核心选项:
- -p:显示输入提示(如 -p "请输入姓名:");
- -t:设置输入超时时间(单位:秒,超时后自动退出);
- -n:限制输入字符数(如 -n 1 仅读取 1 个字符,适合 Y/N 确认);
- -s:隐藏输入内容(不显示输入的字符,适合输入密码)。
实战示例:
# 1. 基础用法(读取姓名并输出)
read -p "请输入您的姓名:" name
echo "您好,$name!"
# 2. 超时输入(5 秒内未输入则退出)
read -t 5 -p "请在 5 秒内输入您的年龄:" age
if [ -z "$age" ]; then # 判断变量是否为空(超时未输入)
echo -e "\n输入超时!"
else
echo "您的年龄是 $age 岁。"
fi
# 3. 隐藏输入(输入密码)
read -s -p "请输入密码:" pass
echo -e "\n密码已接收(不会显示)。"
# 4. 单字符确认(Y/N 选择)
read -n 1 -p "是否继续执行(Y/N)?" answer
echo # 换行(避免输入后光标紧跟提示)
if [ "$answer" = "Y" ] || [ "$answer" = "y" ]; then
echo "继续执行..."
else
echo "取消执行。"
fi
(3)tee:读取输入并写入文件(同时输出到屏幕)
功能定位:将标准输入(如命令输出、用户输入)同时 “写入文件” 和 “输出到屏幕”(类似 “三通管”),常用于 “记录命令输出” 且 “实时查看结果” 的场景,支持追加写入。
核心选项:
- -a:追加写入文件(默认覆盖文件内容)。
实战示例:
# 1. 将命令输出同时写入文件和显示到屏幕
date | tee current_time.txt # 显示当前时间,同时写入 current_time.txt
# 2. 追加写入文件(-a)
echo "新的一行内容" | tee -a current_time.txt # 追加到文件末尾,不覆盖原有内容
# 3. 配合 sudo 写入有权限的文件(避免用 echo "内容" > /etc/file 权限不足的问题)
echo "export PATH=\$PATH:/opt/bin" | sudo tee -a /etc/profile
# 场景:普通用户需修改 /etc/profile(root 权限文件),用 tee 配合 sudo 实现
4. 系统信息与工具:env/printenv/set/unset/basename
(1)env/printenv/set:查看环境变量
功能定位:环境变量是 Linux 中存储系统配置、用户偏好的变量(如 PATH 存储命令路径、HOME 存储用户主目录),这三个命令用于查看或管理环境变量,区别如下:
命令 | 核心功能 | 适用场景 |
---|---|---|
env | 查看所有全局环境变量,或在指定环境中执行命令(如 env PATH=/opt/bin cmd) | 查看全局变量、临时修改环境执行命令 |
printenv | 查看所有全局环境变量,或指定单个变量(无需加 $,如 printenv HOME) | 查看单个全局变量(更简洁) |
set | 查看当前 Shell 的所有变量(包括全局变量、局部变量、用户自定义变量),并显示函数 | 查看 Shell 会话中的所有变量 |
实战示例:
# 1. 查看所有全局环境变量
env
printenv
# 2. 查看单个环境变量(如 HOME、PATH)
printenv HOME # 输出:/home/user1
printenv PATH # 输出:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 3. 查看当前 Shell 的所有变量(包括局部变量)
set | grep "MY_VAR" # 查找用户自定义的局部变量 MY_VAR
# 4. 用 env 临时修改环境执行命令(如临时添加 /opt/bin 到 PATH)
env PATH=$PATH:/opt/bin my_cmd # 执行 my_cmd 时,优先从 /opt/bin 找命令
(2)export/unset:设置 / 删除环境变量
功能定位:
- export:将 “局部变量” 提升为 “全局环境变量”(子进程可继承该变量);
- unset:删除已定义的变量(包括全局变量和局部变量)。
实战示例:
# 1. 定义局部变量(仅当前 Shell 会话有效,子进程无法访问)
MY_VAR="hello"
echo $MY_VAR # 输出:hello
bash # 进入子 Shell
echo $MY_VAR # 输出空(子进程无法访问局部变量)
exit # 退出子 Shell
# 2. 导出为全局变量(子进程可访问)
export MY_VAR="hello" # 导出局部变量为全局变量
bash
echo $MY_VAR # 输出:hello(子进程可访问)
exit
# 3. 永久设置环境变量(写入配置文件)
# 方式1:仅当前用户有效(写入 ~/.bashrc)
echo 'export MY_VAR="hello"' >> ~/.bashrc
source ~/.bashrc # 立即生效
# 方式2:所有用户有效(写入 /etc/profile,需 root 权限)
sudo echo 'export MY_VAR="hello"' >> /etc/profile
source /etc/profile
# 4. 删除环境变量
unset MY_VAR # 删除 MY_VAR 变量
echo $MY_VAR # 输出空(变量已删除)
(3)basename:提取文件名或目录名
功能定位:从文件路径或目录路径中提取 “最后一部分”(如从 /home/user1/docs/file.txt 提取 file.txt,从 /home/user1/docs 提取 docs),常用于脚本中处理文件路径。
实战示例:
# 1. 提取文件名(从完整路径)
basename /home/user1/docs/file.txt # 输出:file.txt
# 2. 提取目录名(从完整路径)
basename /home/user1/docs # 输出:docs
basename /home/user1/docs/ # 输出:docs(末尾加 / 不影响结果)
# 3. 脚本中实用场景(提取压缩包名,作为解压目录名)
# 假设下载的压缩包路径为 /tmp/backup_20240530.zip
zip_path="/tmp/backup_20240530.zip"
# 提取压缩包名(去掉 .zip 后缀)
dir_name=$(basename "$zip_path" .zip) # 第二个参数为“后缀”,用于移除
echo $dir_name # 输出:backup_20240530
# 解压到以压缩包名命名的目录
unzip "$zip_path" -d "/opt/backup/$dir_name"
5. 用户信息查询:finger/chfn/chage
(1)finger:查看用户详细信息
功能定位:直观显示系统用户的 “登录状态、主目录、登录 Shell、最近登录时间” 等信息,比 cat /etc/passwd 更易读,适合快速了解用户当前状态。
实战示例:
# 1. 查看所有已登录用户的信息
finger
# 预期输出(关键信息):
# Login Name Tty Idle Login Time Office Office Phone Host
# user1 User One pts/0 10m May 30 14:30 - - 192.168.1.100
# 2. 查看指定用户的详细信息(如 user1)
finger user1
# 预期输出(补充信息):
# Directory: /home/user1 Shell: /bin/bash
# On since Thu May 30 14:30 (CST) on pts/0 from 192.168.1.100
# No mail.
# No Plan.
(2)chfn:修改用户备注信息
功能定位:修改 /etc/passwd 文件中用户的 “备注字段”(第 5 个字段),可存储用户的 “真实姓名、部门、联系电话” 等信息,这些信息会被 finger 命令读取,便于团队内识别用户身份。
实战示例:
# 1. 交互式修改当前用户的备注信息
chfn
# 进入交互界面,按提示输入信息(示例):
# Changing finger information for user1.
# Name [User One]: Zhang San # 真实姓名
# Office []: Tech Department # 部门
# Office Phone []: 13800138000 # 联系电话
# Home Phone []: - # 可不填
# 确认后,信息会写入 /etc/passwd 的备注字段
# 2. 查看修改结果(用 finger 验证)
finger user1
# 预期输出中“Name”字段变为“Zhang San”,“Office”字段变为“Tech Department”
(3)chage:管理用户密码有效期
功能定位:控制用户密码的 “过期时间、密码最小修改间隔、密码最大有效期、密码过期提醒天数”,是系统安全管理的重要工具(避免用户使用永久不变的弱密码)。
核心选项(常用):
- -l:列出指定用户的密码有效期配置(如 chage -l user1);
- -E:设置用户账户过期时间(格式 YYYY-MM-DD,过期后无法登录);
- -M:设置密码最大有效期(天数,如 -M 90 表示密码每 90 天需修改);
- -W:设置密码过期前提醒天数(如 -W 7 表示过期前 7 天开始提醒)。
实战示例:
# 1. 查看 user1 的密码有效期配置
chage -l user1
# 预期输出(关键配置):
# Last password change : May 30, 2024
# Password expires : Aug 28, 2024 (90 天后过期)
# Password inactive : never
# Account expires : never
# Minimum number of days between password change : 0
# Maximum number of days between password change : 90
# Number of days of warning before password expires : 7
# 2. 设置 user1 密码每 60 天过期,过期前 10 天提醒
sudo chage -M 60 -W 10 user1
# 3. 设置 user1 账户 2024-12-31 过期(过期后无法登录)
sudo chage -E 2024-12-31 user1
九、总结:Linux 命令学习与使用指南
Linux 命令体系看似庞大,但并非无规律可循。通过本文的分类梳理,可发现所有命令均围绕 “系统管理的核心需求” 展开 —— 从基础的 “命令识别与帮助”,到 “文件 / 进程 / 磁盘 / 用户” 的管理,再到 “软件安装与定时任务” 的自动化操作,形成了完整的运维闭环。
1. 命令学习核心原则
- 按场景归类记忆:不要孤立记 “某个命令的某个选项”,而是结合 “我要做什么”(如 “备份文件”→ tar/zip,“终止进程”→ kill/pkill),场景化记忆更易形成肌肉记忆。
- 优先掌握高频组合:每个命令的选项众多,但日常用得上的往往只有 2-3 个(如 ls -alF、cp -ri、tar -czvf),先熟练高频组合,再逐步拓展冷门选项。
- 重视 “安全选项”:涉及删除、修改的命令(如 rm、userdel、lvreduce),优先使用带提示的选项(-i),避免因误操作导致数据丢失;执行批量命令前,先用 ls/echo 验证目标(如 echo rm -rf /tmp/* 先查看要删除的文件)。
2. 实战效率提升技巧
- 善用命令历史与补全:按 Ctrl+R 搜索历史命令,按 Tab 键自动补全命令 / 路径(按两次 Tab 显示所有候选),减少重复输入;
- 设置别名简化操作:将复杂命令(如 ls -alF、df -h、git status)设置为别名(如 alias ll='ls -alF'),写入 ~/.bashrc 实现永久生效;
- 结合管道与重定向:用 | 连接多个命令(如 ps -ef | grep nginx、du -sh * | sort -hr),用 >/>> 重定向输出到文件(如 command > log.txt),提升数据处理效率。
3. 问题排查思路
遇到命令报错时,按以下步骤快速定位问题:
- 查看错误提示:Linux 命令的错误信息通常会明确指出原因(如 “Permission denied”→ 权限不足,“No such file or directory”→ 路径错误);
- 检查基础条件:执行命令前确认 “路径是否正确”“权限是否足够”“依赖是否满足”(如 dpkg -i 报错时,用 apt -f install 修复依赖);
- 查阅帮助文档:用 man 命令 或 命令 --help 确认选项用法(如忘记 tar 选项时,man tar 查看 “压缩 / 解压” 相关章节);
- 搜索错误信息:若错误不明确,复制完整错误信息到搜索引擎(如 “umount target is busy”),通常能找到成熟的解决方案。
通过本文的系统梳理,相信你已掌握 Linux 日常操作的核心命令体系。后续可结合具体场景(如 Web 服务部署、数据库运维、Shell 脚本开发)进一步深化,在实践中逐步提升命令熟练度与问题解决能力。