运维必会的60个Linux命令,我整理了这份速查手册17认证网

正规官方授权
更专业・更权威

运维必会的60个Linux命令,我整理了这份速查手册

一、概述

背景介绍

干了十年运维,从最早的物理机房值班到现在的云原生架构,Linux命令始终是我吃饭的家伙。这些年带过不少新人,发现很多人对命令的理解停留在”能用就行”的阶段,遇到复杂场景就抓瞎。

这篇文章不是简单的命令罗列,而是我多年踩坑后总结的实战经验。每个命令我都会讲清楚:什么场景用、怎么用更高效、容易踩什么坑。

技术特点

2025年的Linux运维和五年前已经大不一样了:

  1. 现代化工具崛起:ripgrep、fd、bat这些Rust写的工具已经成为主流,性能碾压传统工具
  2. 容器化环境普及:很多命令需要考虑在容器内执行的场景
  3. 自动化要求更高:命令不仅要会敲,还要会写进脚本、集成到CI/CD
  4. 安全合规更严格:很多操作需要审计,命令的安全用法越来越重要

适用场景

这份手册适合以下场景:

  • 日常服务器运维和故障排查
  • 生产环境问题定位和性能调优
  • 自动化脚本开发
  • 容器和K8s环境调试
  • 安全审计和合规检查

环境要求

本文示例基于以下环境测试:

# 操作系统
Ubuntu 24.04 LTS / Rocky Linux 9.3 / Debian 12

# 内核版本
Linux 6.5+

# Shell
Bash 5.2+ / Zsh 5.9+

# 现代工具版本
ripgrep 14.1+
fd 9.0+
bat 0.24+
eza 0.18+ (exa的活跃维护分支)
dust 1.0+

二、详细步骤

准备工作:现代工具安装

在开始之前,强烈建议安装这些现代替代工具。我现在的服务器都会预装这套工具链:

# Ubuntu/Debian
sudo apt update
sudo apt install -y ripgrep fd-find bat eza

# Rocky Linux/RHEL
sudo dnf install -y ripgrep fd-find bat eza

# 通用方式 - 使用cargo安装最新版
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
cargo install ripgrep fd-find bat eza dust

# 创建别名(fd-find在Debian系安装后叫fdfind)
echo'alias fd=fdfind' >> ~/.bashrc
echo'alias cat=bat' >> ~/.bashrc
echo'alias ls=eza' >> ~/.bashrc

核心配置:Shell环境优化

# ~/.bashrc 或 ~/.zshrc 添加以下内容

# 历史命令优化
export HISTSIZE=50000
export HISTFILESIZE=100000
export HISTCONTROL=ignoreboth:erasedups
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
shopt -s histappend

# 安全别名
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 效率别名
alias ll='eza -alh --git --icons'
alias la='eza -a --icons'
alias lt='eza --tree --level=2 --icons'
alias grep='rg'
alias find='fd'
alias cat='bat --paging=never'
alias du='dust'
alias df='df -h'
alias free='free -h'
alias ps='ps auxf'
alias top='htop'

# 快速导航
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

# 网络相关
alias ports='ss -tulanp'
alias myip='curl -s ifconfig.me'
alias ping='ping -c 5'

三、示例代码和配置

第一类:文件操作命令(10个)

1. ls / eza – 文件列表查看

传统的ls用了这么多年,但eza真的香。它默认带颜色、支持Git状态、有图标显示。

# 基础用法
ls -la                    # 传统方式
eza -la --icons --git     # 现代方式,显示Git状态

# 高级参数
eza -la --sort=modified   # 按修改时间排序
eza -la --sort=size       # 按大小排序
eza --tree --level=3      # 树形展示,3层深度
eza -la --group           # 显示文件所属组

# 实战案例:找出最近修改的10个文件
eza -la --sort=modified | head -11

# 实战案例:按大小排序找大文件
eza -la --sort=size --reverse | head -20

# 常见错误
# 错误:ls -la | grep xxx  效率低
# 正确:直接用eza的过滤功能或配合fd使用

我的踩坑经验:很多新人喜欢 ls -la | grep xxx,这个写法低效还容易出错。如果要找文件,直接用fd;如果要看特定类型的文件,用eza的–only-dirs或–only-files参数。

2. cd – 目录切换

cd看似简单,但有些技巧很多人不知道:

# 基础用法
cd /var/log
cd ~              # 回到家目录
cd -              # 回到上一个目录(这个很多人不知道)

# 高级技巧
cd !$             # 进入上条命令的最后一个参数目录
pushd /var/log    # 进入目录并压栈
popd              # 弹出栈顶目录

# 实战案例:在两个目录间频繁切换
cd /var/log
cd /etc/nginx
cd -              # 快速切回/var/log
cd -              # 再切回/etc/nginx

# 使用目录栈管理多个目录
pushd /var/log
pushd /etc/nginx
pushd /home/app
dirs -v           # 查看目录栈
cd ~2             # 直接跳转到栈中第2个目录

3. cp – 文件复制

# 基础用法
cp file1 file2
cp -r dir1 dir2          # 递归复制目录

# 高级参数
cp -a source dest         # 保留所有属性(归档模式)
cp -p source dest         # 保留权限和时间戳
cp -u source dest         # 只复制更新的文件
cp -v source dest         # 显示复制过程
cp --backup=numbered      # 自动备份已存在的文件

# 实战案例:生产环境备份配置文件
cp -av /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d_%H%M%S)

# 实战案例:增量同步目录
cp -ruv /source/dir/ /backup/dir/

# 常见错误
# 错误:cp -r dir1 dir2/  当dir2存在时会复制到dir2内部
# 正确:先确认目标路径,或使用rsync

这里有个坑:cp -r dir1 dir2 和 cp -r dir1 dir2/ 的行为是不同的。如果dir2已存在,后者会把dir1复制到dir2里面。生产环境建议用rsync代替cp做目录复制。

4. mv – 文件移动和重命名

# 基础用法
mv file1 file2           # 重命名
mv file1 /path/to/dir/   # 移动

# 高级参数
mv -i source dest         # 覆盖前确认
mv -n source dest         # 不覆盖已存在文件
mv -v source dest         # 显示移动过程
mv -b source dest         # 覆盖前备份

# 实战案例:批量重命名(配合rename命令)
# 将所有.log文件改为.log.bak
rename 's/\.log$/.log.bak/' *.log

# 实战案例:安全移动大量文件
mv -v /source/files/* /dest/ 2>&1 | tee mv.log

# 常见错误
# 在跨文件系统移动时,mv实际上是cp+rm
# 大文件移动要注意磁盘空间

5. rm – 文件删除

# 基础用法
rm file
rm -r dir                 # 递归删除目录
rm -f file               # 强制删除

# 安全实践(重要!)
rm -i file               # 删除前确认
rm -I *.log              # 删除超过3个文件时确认一次

# 实战案例:安全删除日志文件
# 先预览要删除的文件
find /var/log -name "*.log" -mtime +30 -print
# 确认无误后删除
find /var/log -name "*.log" -mtime +30 -delete

# 更安全的做法:移动到回收站目录
mkdir -p ~/.trash
alias rm='mv -t ~/.trash'

# 常见错误
# 千万不要:rm -rf /path /to/dir  多了个空格就GG了
# 正确写法:rm -rf /path/to/dir
# 更安全:使用变量时加引号 rm -rf "${TARGET_DIR}"

关于rm的血泪教训:我见过太多因为rm -rf翻车的案例。现在我的服务器都会配置safe-rm或者trash-cli。宁可多敲几个命令,也不要删错了找领导哭。

6. mkdir – 创建目录

# 基础用法
mkdir dirname
mkdir -p path/to/deep/dir   # 递归创建

# 高级参数
mkdir -m 755 dirname        # 创建时指定权限
mkdir -v dirname            # 显示创建过程

# 实战案例:创建标准项目目录结构
mkdir -pv /app/{bin,conf,data,logs,tmp}

# 实战案例:按日期创建日志目录
mkdir -p /var/log/app/$(date +%Y)/$(date +%m)/$(date +%d)

7. find / fd – 文件查找

传统find功能强大但语法复杂,fd简洁很多:

# find基础用法
find /path -name "*.log"
find /path -type f -size +100M
find /path -mtime -7          # 7天内修改的文件

# fd基础用法(推荐)
fd "\.log$" /path             # 正则匹配
fd -e log /path               # 按扩展名
fd -t f -S +100M /path        # 大于100M的文件
fd --changed-within 7d /path  # 7天内修改的

# 高级参数
fd -H -I pattern              # 包括隐藏文件和忽略的文件
fd -x command {}              # 对结果执行命令
fd -0 | xargs -0 command      # 安全处理特殊文件名

# 实战案例:找出大于1G的文件
fd -t f -S +1G / 2>/dev/null

# 实战案例:找出7天内修改的配置文件
fd -e conf -e cfg --changed-within 7d /etc

# 实战案例:批量处理找到的文件
fd -e log --changed-before 30d -x gzip {}

# 实战案例:find的exec用法(fd不支持时的替代)
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
# 更高效的写法
find /var/log -name "*.log" -mtime +30 -print0 | xargs -0 rm -f

8. ln – 创建链接

# 软链接(最常用)
ln -s /path/to/target /path/to/link

# 硬链接
ln /path/to/target /path/to/link

# 高级参数
ln -sf target link            # 强制覆盖已存在的链接
ln -v target link             # 显示创建过程
ln -r target link             # 创建相对路径链接

# 实战案例:管理多版本软件
ln -sf /opt/java/jdk-21 /opt/java/current
export JAVA_HOME=/opt/java/current

# 实战案例:日志文件软链接
ln -s /var/log/nginx/access.log /home/admin/logs/nginx-access.log

# 常见错误
# 软链接的目标路径要写绝对路径,否则移动后会失效
# 检查链接是否有效:ls -la link 或 test -e link

9. tar – 归档压缩

# 基础用法
tar -cvf archive.tar files/           # 打包
tar -xvf archive.tar                  # 解包
tar -czvf archive.tar.gz files/       # 打包+gzip压缩
tar -xzvf archive.tar.gz              # 解压gzip

# 高级参数
tar -cjvf archive.tar.bz2 files/      # bzip2压缩
tar --zstd -cvf archive.tar.zst files/ # zstd压缩(2025推荐)
tar -tvf archive.tar                   # 查看归档内容
tar -xvf archive.tar -C /dest/        # 指定解压目录
tar --exclude='*.log' -cvf a.tar dir/ # 排除特定文件

# 实战案例:备份时排除不需要的目录
tar --exclude='node_modules' --exclude='.git' \
    -czvf backup.tar.gz /app/project/

# 实战案例:增量备份
tar -g snapshot.snar -czvf backup-$(date +%Y%m%d).tar.gz /data/

# 实战案例:通过SSH传输
tar -czvf - /source/dir | ssh user@remote 'tar -xzvf - -C /dest/'

# 常见错误
# 解压时不指定-C会解压到当前目录,可能覆盖同名文件
# 大文件建议用pv查看进度:tar -cf - dir | pv | gzip > file.tar.gz

关于压缩算法的选择:2025年了,如果没有兼容性要求,强烈推荐zstd。压缩率接近bzip2,但速度快很多。我们生产环境的备份已经全面切换到zstd了。

10. rsync – 高效文件同步

这是我用得最多的文件操作命令,没有之一:

# 基础用法
rsync -av source/ dest/               # 归档模式同步

# 高级参数
rsync -avz source/ dest/              # 压缩传输
rsync -avz --delete source/ dest/     # 删除目标多余文件
rsync -avz --progress source/ dest/   # 显示进度
rsync -avz -e ssh source/ user@host:dest/  # SSH传输
rsync -avz --bwlimit=10000 src/ dst/  # 限速10MB/s

# 实战案例:增量备份
rsync -avz --delete --backup --backup-dir=/backup/$(date +%Y%m%d) \
    /data/ /backup/current/

# 实战案例:排除特定目录
rsync -avz --exclude='*.log' --exclude='tmp/' \
    --exclude-from='exclude.txt'source/ dest/

# 实战案例:断点续传大文件
rsync -avz --partial --progress large_file.tar.gz user@host:/dest/

# 实战案例:限制并发和带宽(生产环境必备)
rsync -avz --bwlimit=50000 --rsh="ssh -o Compression=no"source/ dest/

# 常见错误
# source/ 和 source 是不同的!
# source/  -> 复制source目录下的内容
# source   -> 复制source目录本身

rsync的斜杠问题是最常见的坑。我见过很多人因为漏写或多写斜杠,导致同步结果和预期不一致。记住:带斜杠是”复制内容”,不带是”复制目录本身”。


第二类:文本处理命令(10个)

11. cat / bat – 查看文件内容

# cat基础用法
cat file
cat -n file               # 显示行号
cat file1 file2 > merged  # 合并文件

# bat用法(推荐)
bat file                  # 带语法高亮和行号
bat -l python script      # 指定语言
bat -A file               # 显示不可见字符
bat --paging=never file   # 不分页
bat -r 10:20 file         # 只显示10-20行

# 实战案例:快速查看日志最后部分
bat --paging=never -r -100: /var/log/syslog

# 实战案例:对比两个文件
bat -d file1 file2        # diff模式

# 常见错误
# 不要用cat查看大文件,会卡死终端
# 大文件用less或tail

12. less / more – 分页查看

# 基础用法
less file
more file                 # 只能向下翻页

# less常用快捷键
# Space/PageDown - 下一页
# b/PageUp - 上一页
# g - 跳到开头
# G - 跳到结尾
# /pattern - 向下搜索
# ?pattern - 向上搜索
# n - 下一个匹配
# N - 上一个匹配
# q - 退出

# 高级用法
less +F file              # 类似tail -f,Ctrl+C停止,F继续
less -N file              # 显示行号
less -S file              # 不换行,左右滚动查看

# 实战案例:实时查看日志
less +F /var/log/nginx/access.log

less +F是我最喜欢的用法,比tail -f更灵活。可以随时Ctrl+C暂停,然后用/搜索,再按F继续实时查看。

13. head / tail – 查看文件头尾

# 基础用法
head file                 # 默认前10行
tail file                 # 默认后10行

# 高级参数
head -n 50 file           # 前50行
tail -n 100 file          # 后100行
tail -f file              # 实时跟踪
tail -F file              # 实时跟踪,文件轮转后自动重新打开
head -c 1000 file         # 前1000字节

# 实战案例:实时监控多个日志
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

# 实战案例:查看日志中间部分(100-200行)
sed -n '100,200p' file
# 或者
head -n 200 file | tail -n 100

# 实战案例:带时间戳的tail
tail -f file | whileread line; doecho"$(date '+%H:%M:%S') $line"; done

生产环境用tail -F而不是tail -f。区别是-F在文件被轮转后会自动重新打开新文件,这在日志轮转场景很重要。

14. grep / ripgrep – 文本搜索

这是运维最高频使用的命令之一:

# grep基础用法
grep "pattern" file
grep -r "pattern" dir/    # 递归搜索
grep -i "pattern" file    # 忽略大小写
grep -v "pattern" file    # 反向匹配

# ripgrep用法(强烈推荐)
rg "pattern" file
rg "pattern" dir/         # 默认递归,自动忽略.gitignore
rg -i "pattern"           # 忽略大小写
rg -v "pattern"           # 反向匹配
rg -l "pattern"           # 只显示文件名
rg -c "pattern"           # 统计匹配次数

# 高级参数
rg -A 3 -B 3 "error"      # 显示前后3行上下文
rg -C 5 "exception"       # 显示前后5行
rg -w "word"              # 全词匹配
rg -e "pat1" -e "pat2"    # 多模式匹配
rg --type py "import"     # 只搜索Python文件
rg -g "*.log""error"     # 只搜索.log文件
rg -g "!*.min.js""func"# 排除.min.js文件

# 实战案例:搜索日志中的错误
rg -i "error|exception|failed" /var/log/app/

# 实战案例:搜索并统计
rg -c "500" /var/log/nginx/access.log

# 实战案例:搜索特定时间段的日志
rg "2025-01-06 1[0-2]:" /var/log/app.log

# 实战案例:搜索并替换(需要sed配合)
rg -l "old_string" | xargs sed -i 's/old_string/new_string/g'

# 常见错误
# grep -r 在大目录很慢,rg快几十倍
# 记得用引号包裹特殊字符的pattern

ripgrep是我目前用过最快的文本搜索工具,在大型代码仓库里比grep快几十倍。而且它默认尊重.gitignore,不会搜索node_modules这种垃圾目录。

15. sed – 流编辑器

# 基础用法
sed 's/old/new/' file           # 替换第一个匹配
sed 's/old/new/g' file          # 替换所有匹配
sed -i 's/old/new/g' file       # 直接修改文件

# 高级参数
sed -i.bak 's/old/new/g' file   # 修改前备份
sed -n '10,20p' file            # 打印10-20行
sed '/pattern/d' file           # 删除匹配行
sed '/^#/d' file                # 删除注释行
sed '/^$/d' file                # 删除空行

# 实战案例:批量替换配置
sed -i 's/localhost/192.168.1.100/g' /etc/app/*.conf

# 实战案例:在特定行后插入内容
sed -i '/\[server\]/a server_name = production' config.ini

# 实战案例:提取日志中的IP地址
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' access.log

# 实战案例:删除配置文件中的注释和空行
sed '/^#/d;/^$/d' config.conf

# 常见错误
# Mac的sed需要 sed -i '' 's/old/new/g' file
# 生产环境修改前先备份!用 sed -i.bak

16. awk – 文本处理

awk是运维的瑞士军刀,必须熟练掌握:

# 基础用法
awk '{print $1}' file           # 打印第一列
awk -F: '{print $1}' /etc/passwd  # 指定分隔符
awk 'NR==10' file               # 打印第10行

# 高级用法
awk '{sum+=$1} END {print sum}' file    # 求和
awk '{sum+=$1} END {print sum/NR}'      # 求平均
awk 'length($0)>80' file                # 找超长行
awk '!seen[$0]++' file                  # 去重

# 实战案例:统计Nginx日志中各状态码数量
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# 实战案例:计算日志中请求总量和平均响应时间
awk '{count++; sum+=$NF} END {print "Total:", count, "Avg:", sum/count}' access.log

# 实战案例:找出响应时间超过1秒的请求
awk '$NF > 1 {print $0}' access.log

# 实战案例:按IP统计请求数
awk '{ip[$1]++} END {for(i in ip) print i, ip[i]}' access.log | sort -k2 -rn | head -10

# 实战案例:提取特定时间段的日志
awk '/2025-01-06 10:/,/2025-01-06 11:/' app.log

# 常见错误
# 记住awk的列从$1开始,$0是整行
# 注意引号嵌套问题

17. sort – 排序

# 基础用法
sort file
sort -r file              # 逆序
sort -n file              # 数值排序

# 高级参数
sort -k2 file             # 按第2列排序
sort -k2 -n file          # 第2列数值排序
sort -t: -k3 -n file      # 指定分隔符
sort -u file              # 去重
sort -h file              # 人类可读的大小排序(K, M, G)

# 实战案例:按大小排序du输出
du -sh /* 2>/dev/null | sort -h

# 实战案例:按第3列数值倒序
sort -t',' -k3 -rn data.csv

# 实战案例:多列排序
sort -k1,1 -k2,2n file    # 先按第1列字符串,再按第2列数值

18. uniq – 去重统计

# 基础用法(必须先sort)
sort file | uniq
sort file | uniq -c       # 统计出现次数
sort file | uniq -d       # 只显示重复行
sort file | uniq -u       # 只显示不重复行

# 实战案例:统计日志中各IP访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20

# 实战案例:找出重复的行
sort file | uniq -d

# 实战案例:统计错误类型
grep -i error app.log | awk '{print $5}' | sort | uniq -c | sort -rn

19. wc – 统计

# 基础用法
wc file                   # 行数、单词数、字节数
wc -l file                # 只统计行数
wc -w file                # 只统计单词数
wc -c file                # 只统计字节数

# 实战案例:统计代码行数
fd -e py | xargs wc -l | tail -1

# 实战案例:统计目录下文件数
ls -1 | wc -l

# 实战案例:统计日志条目数
wc -l /var/log/nginx/access.log

20. cut – 列切割

# 基础用法
cut -d: -f1 /etc/passwd   # 以:分隔取第1列
cut -d, -f1,3 file.csv    # 取第1和第3列
cut -c1-10 file           # 取每行前10个字符

# 实战案例:提取CSV特定列
cut -d, -f2,5,7 data.csv

# 实战案例:提取日志中的时间
cut -d' ' -f1,2 access.log

# 常见错误
# cut不支持正则作为分隔符,复杂场景用awk

第三类:系统监控命令(10个)

21. top / htop / btop – 进程监控

# top基础用法
top
top -u username           # 只看特定用户进程
top -p PID1,PID2          # 只看特定进程

# top常用快捷键
# P - 按CPU排序
# M - 按内存排序
# k - 杀进程
# q - 退出

# htop(推荐)
htop                      # 交互式,更直观
htop -u username          # 特定用户

# btop(2025年新宠)
btop                      # 最美观,功能最全

# 实战案例:监控特定进程
top -p $(pgrep -d',' nginx)

# 实战案例:批处理模式(用于脚本)
top -b -n 1 | head -20

btop是2025年我最推荐的系统监控工具,颜值高、信息全,一个工具顶替top+htop+iotop+nethogs。

22. free – 内存查看

# 基础用法
free -h                   # 人类可读格式
free -m                   # 以MB显示
free -g                   # 以GB显示

# 高级参数
free -hs 2                # 每2秒刷新一次
free -w                   # 宽输出,分离buffers和cache

# 实战案例:监控内存变化
watch -n 1 free -h

# 常见错误
# 看available而不是free,Linux会用内存做cache
# available才是真正可用的内存

关于Linux内存,很多新人看到free很低就慌了,其实要看available。Linux会积极使用空闲内存做文件缓存,这是好事不是问题。

23. vmstat – 虚拟内存统计

# 基础用法
vmstat                    # 单次
vmstat 2 10               # 每2秒一次,共10次

# 输出解读
# r - 运行队列进程数
# b - 阻塞进程数
# swpd - 虚拟内存使用量
# free - 空闲内存
# si/so - swap换入换出
# bi/bo - 块设备读写
# us/sy/id/wa - CPU使用率

# 实战案例:持续监控
vmstat 5 | tee vmstat.log

# 重点关注
# si/so > 0 说明在使用swap,可能内存不足
# wa > 20 说明IO等待严重
# r > CPU核心数 说明CPU过载

24. iostat – IO统计

# 基础用法
iostat
iostat -x                 # 扩展信息
iostat -xz 2 10           # 每2秒刷新,忽略无活动设备

# 输出解读
# %util - 设备繁忙程度,接近100%说明IO瓶颈
# await - IO平均等待时间,毫秒
# r/s, w/s - 每秒读写次数
# rkB/s, wkB/s - 每秒读写量

# 实战案例:监控磁盘IO
iostat -xm 2 | awk '/sda/{print strftime("%H:%M:%S"), $0}'

# 重点关注
# %util > 80% 说明磁盘繁忙
# await > 10ms 需要关注
# svctm 接近 await 说明没有排队

25. sar – 系统活动报告

# 基础用法(需要安装sysstat)
sar                       # 当天CPU使用情况
sar -r                    # 内存使用
sar -b                    # IO情况
sar -n DEV                # 网络情况

# 高级参数
sar -u 2 10               # CPU,每2秒刷新10次
sar -r 2 10               # 内存
sar -q 2 10               # 负载
sar -f /var/log/sa/sa06   # 查看历史数据(6号)

# 实战案例:查看历史CPU使用情况
sar -u -f /var/log/sa/sa$(date -d "yesterday" +%d)

# 实战案例:导出报告
sar -A > sar_report.txt

sar是事后分析的神器。系统默认每10分钟采集一次数据,当出问题时可以回溯历史数据,这在故障分析时非常有用。

26. uptime / w – 系统运行时间和负载

# 基础用法
uptime
w                         # 同时显示登录用户

# 输出解读
# load average: 1分钟, 5分钟, 15分钟 平均负载
# 负载 < CPU核心数 是健康的
# 负载 > CPU核心数 * 2 需要关注

# 实战案例:快速脚本获取负载
uptime | awk -F'average:''{print $2}'

# 判断负载是否过高
CORES=$(nproc)
LOAD=$(uptime | awk -F'average:''{print $2}' | cut -d, -f1)
# 比较 LOAD 和 CORES

27. dmesg – 内核日志

# 基础用法
dmesg
dmesg -T                  # 显示人类可读的时间戳
dmesg -w                  # 实时跟踪

# 高级参数
dmesg -l err,warn         # 只看错误和警告
dmesg -H                  # 分页显示
dmesg --since "1 hour ago"

# 实战案例:查看最近的错误
dmesg -T -l err | tail -20

# 实战案例:查看OOM killer记录
dmesg -T | grep -i "out of memory"

# 实战案例:查看磁盘错误
dmesg -T | grep -i "error\|fail" | grep -i "sd\|nvme"

dmesg是定位硬件问题的第一站。内存故障、磁盘坏道、网卡问题,都会在这里留下痕迹。

28. journalctl – systemd日志

# 基础用法
journalctl                # 所有日志
journalctl -u nginx       # 特定服务
journalctl -f             # 实时跟踪

# 高级参数
journalctl --since "1 hour ago"
journalctl --since "2025-01-06 10:00:00"
journalctl -p err         # 只看错误级别
journalctl -b             # 本次启动的日志
journalctl -b -1          # 上次启动的日志
journalctl --disk-usage   # 日志占用空间
journalctl --vacuum-size=500M  # 清理日志到500M

# 实战案例:查看服务启动失败原因
journalctl -u nginx --since "today" -p err

# 实战案例:导出日志
journalctl -u nginx --since "1 day ago" > nginx.log

# 实战案例:JSON格式输出
journalctl -u nginx -o json-pretty | head -100

29. lsof – 列出打开的文件

# 基础用法
lsof                      # 所有打开的文件
lsof -u username          # 特定用户打开的文件
lsof -p PID               # 特定进程打开的文件
lsof -i :80               # 监听80端口的进程

# 高级参数
lsof -i tcp               # 所有TCP连接
lsof -i tcp:80            # TCP 80端口
lsof +D /path/dir         # 目录下被打开的文件
lsof -c nginx             # nginx进程打开的文件

# 实战案例:查看删除后仍被占用的文件
lsof | grep deleted

# 实战案例:查看进程打开的网络连接
lsof -i -a -p $(pgrep nginx) | head -20

# 实战案例:查找占用端口的进程
lsof -i :8080

# 常见问题
# 磁盘满了但找不到大文件?可能是deleted文件
lsof | grep deleted | awk '{print $2,$7,$9}' | sort -k2 -rn | head

有个经典问题:明明删了日志文件,但磁盘空间没释放。这是因为有进程还在写这个文件。用 lsof | grep deleted 就能找出来。

30. strace – 系统调用跟踪

# 基础用法
strace command            # 跟踪命令的系统调用
strace -p PID             # 跟踪运行中的进程

# 高级参数
strace -f command         # 跟踪子进程
strace -e trace=file      # 只跟踪文件操作
strace -e trace=network   # 只跟踪网络操作
strace -c command         # 统计系统调用
strace -t command         # 显示时间戳
strace -T command         # 显示每个调用耗时
strace -o output.txt      # 输出到文件

# 实战案例:找出程序在读什么文件
strace -e open,openat -f command 2>&1 | grep -v ENOENT

# 实战案例:分析程序卡住的原因
strace -p $(pgrep -f "stuck_process")

# 实战案例:统计系统调用分布
strace -c -f ./myapp

# 常见错误
# strace会显著影响性能,生产环境谨慎使用
# 建议用-p跟踪特定进程而不是所有进程

strace是调试黑盒程序的利器。程序卡住不知道在干什么?strace一下就知道它在等什么系统调用。


第四类:网络诊断命令(10个)

31. ip – 网络配置

# 查看IP地址
ip addr
ip a                      # 简写

# 查看路由表
ip route
ip r

# 查看网络接口
ip link

# 高级参数
ip addr show eth0         # 特定接口
ip -s link                # 显示统计信息
ip neigh                  # ARP表
ip -c a                   # 彩色输出

# 配置操作(临时)
ip addr add 192.168.1.100/24 dev eth0
ip addr del 192.168.1.100/24 dev eth0
ip link set eth0 up/down
ip route add default via 192.168.1.1

# 实战案例:查看网络流量统计
ip -s link show eth0

# 实战案例:检查接口状态
ip link show | grep -E "state UP|state DOWN"

别再用ifconfig了,2025年应该全面使用ip命令。ifconfig在很多精简系统里已经不预装了。

32. ss – 网络连接查看

# 基础用法
ss -tuln                  # TCP/UDP监听端口
ss -tunap                 # 包含进程信息

# 高级参数
ss -s                     # 统计摘要
ss -o                     # 显示计时器
ss state established      # 只看建立的连接
ss dst 192.168.1.100      # 目标地址过滤
ss sport = :80            # 源端口过滤

# 实战案例:查看谁连接了我的80端口
ss -tn state established '( dport = :80 )'

# 实战案例:统计各状态连接数
ss -ant | awk '{print $1}' | sort | uniq -c

# 实战案例:查看TIME_WAIT连接数
ss -ant | grep TIME-WAIT | wc -l

# 实战案例:找出连接数最多的IP
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head

ss比netstat快太多了,尤其是连接数很多的时候。netstat在几万连接的服务器上要跑好几秒,ss瞬间出结果。

33. netstat – 网络统计(传统)

# 基础用法
netstat -tuln             # TCP/UDP监听
netstat -tunap            # 包含进程

# 统计信息
netstat -s                # 协议统计
netstat -i                # 接口统计
netstat -r                # 路由表

# 实战案例:统计TCP连接状态
netstat -ant | awk '/^tcp/{print $6}' | sort | uniq -c

# 注意:优先使用ss,netstat已过时

34. ping – 连通性测试

# 基础用法
ping host
ping -c 5 host            # 发送5个包

# 高级参数
ping -i 0.2 host          # 间隔0.2秒
ping -s 1000 host         # 包大小1000字节
ping -t 10 host           # TTL设为10
ping -W 2 host            # 超时2秒

# 实战案例:测试MTU
ping -M do -s 1472 host   # 1472 + 28 = 1500 (标准MTU)

# 实战案例:快速检测主机存活
for ip in 192.168.1.{1..254}; do
    ping -c 1 -W 1 $ip &>/dev/null && echo"$ip is up"
done

# 或者用fping(更快)
fping -a -g 192.168.1.0/24 2>/dev/null

35. traceroute / mtr – 路由追踪

# traceroute基础用法
traceroute host
traceroute -n host        # 不解析主机名(更快)
traceroute -T host        # 使用TCP(绕过ICMP阻断)

# mtr(推荐,交互式)
mtr host
mtr -n host               # 不解析
mtr -r -c 100 host        # 报告模式,发100个包
mtr --tcp host            # TCP模式

# 实战案例:排查网络延迟
mtr -r -c 50 -n target_host > mtr_report.txt

# 实战案例:检测丢包节点
mtr -r -c 100 target_host | awk '$3 > 0'

mtr是traceroute的增强版,持续发包并显示每跳的丢包率和延迟,排查网络问题必备。

36. curl – HTTP请求

# 基础用法
curl http://example.com
curl -o file.html http://example.com
curl -O http://example.com/file.zip

# 高级参数
curl -v url               # 详细输出
curl -I url               # 只看响应头
curl -X POST -d "data" url  # POST请求
curl -H "Content-Type: application/json" url
curl -u user:pass url     # 认证
curl -k url               # 忽略SSL证书
curl -L url               # 跟随重定向
curl -w "%{time_total}\n" -o /dev/null -s url  # 测量响应时间

# 实战案例:测试API接口
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"name":"test"}' \
  http://api.example.com/users

# 实战案例:测量各阶段耗时
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
  -o /dev/null -s http://example.com

# 实战案例:下载带进度条
curl -# -O http://example.com/large_file.zip

# 实战案例:测试WebSocket
curl --include \
  --no-buffer \
  --header "Connection: Upgrade" \
  --header "Upgrade: websocket" \
  http://example.com/socket

37. wget – 文件下载

# 基础用法
wget url
wget -O filename url      # 指定文件名
wget -c url               # 断点续传

# 高级参数
wget -q url               # 安静模式
wget -b url               # 后台下载
wget --limit-rate=1m url  # 限速1MB/s
wget -r -np -l 2 url      # 递归下载2层
wget --mirror url         # 镜像站点

# 实战案例:下载整个目录
wget -r -np -nH --cut-dirs=2 http://example.com/files/

# 实战案例:带认证下载
wget --user=admin --password=secret url

# 实战案例:后台下载大文件
nohup wget -c http://example.com/large.iso > /dev/null 2>&1 &

38. dig / nslookup – DNS查询

# dig基础用法(推荐)
dig example.com
dig example.com A         # A记录
dig example.com MX        # 邮件记录
dig example.com NS        # NS记录

# 高级参数
dig +short example.com    # 简洁输出
dig @8.8.8.8 example.com  # 指定DNS服务器
dig +trace example.com    # 跟踪查询过程
dig -x 8.8.8.8            # 反向解析

# nslookup(简单场景)
nslookup example.com
nslookup example.com 8.8.8.8

# 实战案例:检查DNS解析
dig +short example.com @8.8.8.8
dig +short example.com @223.5.5.5

# 实战案例:检查DNS传播
for dns in 8.8.8.8 8.8.4.4 223.5.5.5 114.114.114.114; do
    echo"=== $dns ==="
    dig +short example.com @$dns
done

# 实战案例:测量DNS解析时间
dig example.com | grep "Query time"

39. tcpdump – 网络抓包

# 基础用法
tcpdump -i eth0
tcpdump -i any            # 所有接口

# 高级参数
tcpdump -n                # 不解析主机名
tcpdump -nn               # 不解析主机名和端口
tcpdump -w file.pcap      # 保存到文件
tcpdump -r file.pcap      # 读取文件
tcpdump -c 100            # 只抓100个包
tcpdump -s 0              # 抓完整包内容

# 过滤表达式
tcpdump host 192.168.1.100
tcpdump port 80
tcpdump src host 192.168.1.100
tcpdump dst port 443
tcpdump 'tcp[tcpflags] & tcp-syn != 0'# SYN包

# 实战案例:抓取HTTP流量
tcpdump -i eth0 -nn -A -s0 'tcp port 80'

# 实战案例:抓取特定主机间流量
tcpdump -i eth0 -nn host 192.168.1.100 and port 3306 -w mysql.pcap

# 实战案例:分析慢查询
tcpdump -i eth0 -nn port 3306 -c 1000 -w slow.pcap
# 然后用Wireshark分析

# 常见错误
# 生产环境抓包要限制数量(-c)和大小,否则磁盘会爆

tcpdump是网络问题终极排查工具。怀疑丢包、怀疑数据不对、怀疑防火墙拦截,抓个包一目了然。

40. iptables / nftables – 防火墙

# iptables查看规则
iptables -L -n -v
iptables -L -n -v -t nat  # NAT表

# 常用操作
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -D INPUT 3       # 删除第3条规则
iptables -F               # 清空规则

# 保存规则
iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules

# nftables(2025年推荐)
nft list ruleset
nft add rule inet filter input tcp dport 80 accept

# 实战案例:限制SSH暴力破解
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

# 实战案例:查看连接跟踪
cat /proc/net/nf_conntrack | wc -l

iptables虽然在向nftables过渡,但大多数生产系统还是iptables。两个都要会。


第五类:进程管理命令(10个)

41. ps – 进程查看

# 基础用法
ps aux                    # BSD风格,最常用
ps -ef                    # UNIX风格

# 高级参数
ps auxf                   # 树形显示
ps -o pid,ppid,user,%cpu,%mem,comm  # 自定义列
ps -C nginx               # 按命令名过滤
ps -u www-data            # 按用户过滤
ps -p 1234                # 按PID

# 实战案例:查看内存占用最高的进程
ps aux --sort=-%mem | head -10

# 实战案例:查看CPU占用最高的进程
ps aux --sort=-%cpu | head -10

# 实战案例:查看特定进程详情
ps -fp $(pgrep nginx)

# 实战案例:统计进程数
ps -e --no-headers | wc -l

42. kill / pkill / killall – 进程终止

# kill基础用法
kill PID                  # 发送SIGTERM
kill -9 PID               # 强制终止
kill -l                   # 列出信号

# 常用信号
# SIGTERM (15) - 优雅终止
# SIGKILL (9)  - 强制终止
# SIGHUP (1)   - 重新加载配置
# SIGUSR1/2    - 用户自定义

# pkill(按名称杀进程)
pkill nginx               # 杀所有nginx进程
pkill -u www-data         # 杀用户所有进程
pkill -9 -f "python.*script"# 按完整命令行匹配

# killall
killall nginx             # 杀所有nginx进程
killall -u www-data       # 杀用户所有进程

# 实战案例:优雅重启nginx
kill -HUP $(cat /var/run/nginx.pid)

# 实战案例:杀掉僵尸进程的父进程
ps aux | grep Z | awk '{print $2}' | xargs -I{} ps -p {} -o ppid= | xargs kill

# 常见错误
# 不要动不动就kill -9,先发SIGTERM让进程优雅退出
# kill -9无法清理临时文件和释放资源

强调一下:kill -9是最后手段。正常应该先发SIGTERM,等几秒不退出再-9。很多进程需要时间做清理工作。

43. pgrep – 进程查找

# 基础用法
pgrep nginx               # 返回PID
pgrep -l nginx            # 带进程名
pgrep -a nginx            # 带完整命令

# 高级参数
pgrep -u root nginx       # 限定用户
pgrep -f "python script"# 匹配完整命令行
pgrep -c nginx            # 统计数量
pgrep -P 1                # 父进程为1的所有进程
pgrep -n nginx            # 最新的nginx进程
pgrep -o nginx            # 最老的nginx进程

# 实战案例:监控进程是否存在
if pgrep nginx > /dev/null; then
    echo"nginx is running"
else
    echo"nginx is not running"
fi

# 实战案例:配合其他命令使用
top -p $(pgrep -d, nginx)
strace -p $(pgrep -n java)

44. nohup / & – 后台运行

# 基础用法
nohup command &
nohup command > output.log 2>&1 &

# 查看后台任务
jobs -l

# 前后台切换
command &                 # 后台运行
Ctrl+Z                    # 暂停当前任务
bg                        # 放到后台继续
fg                        # 调回前台

# 实战案例:后台运行并记录日志
nohup python /opt/app/worker.py > /var/log/worker.log 2>&1 &
echo $! > /var/run/worker.pid

# 实战案例:使用disown
./long_running_command &
disown                    # 从shell脱离

# 更好的选择:使用systemd或supervisor

生产环境不建议用nohup,应该用systemd或supervisor管理进程。nohup容易失控,出了问题不好排查。

45. systemctl – 服务管理

# 基础用法
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx    # 重新加载配置
systemctl status nginx

# 开机自启
systemctl enable nginx
systemctl disable nginx
systemctl is-enabled nginx

# 查看服务
systemctl list-units --type=service
systemctl list-units --type=service --state=running
systemctl list-unit-files --type=service

# 高级用法
systemctl daemon-reload   # 重新加载unit文件
systemctl mask nginx      # 彻底禁用
systemctl unmask nginx
systemctl edit nginx      # 编辑服务配置

# 实战案例:查看失败的服务
systemctl --failed

# 实战案例:查看服务依赖
systemctl list-dependencies nginx

# 实战案例:创建自定义服务
cat > /etc/systemd/system/myapp.service << 'EOF'
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=app
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now myapp

46. nice / renice – 进程优先级

# 基础用法
nice -n 10 command        # 降低优先级运行
nice -n -5 command        # 提高优先级(需root)

# 修改运行中的进程
renice 10 -p PID          # 调整特定进程
renice 10 -u username     # 调整用户所有进程

# 实战案例:低优先级运行备份
nice -n 19 tar -czvf backup.tar.gz /data/

# 实战案例:提高关键进程优先级
renice -10 -p $(pgrep -f "critical_app")

# 优先级范围:-20 (最高) 到 19 (最低)
# 默认值:0

47. timeout – 超时控制

# 基础用法
timeout 5s command        # 5秒超时
timeout 1m command        # 1分钟超时
timeout 1h command        # 1小时超时

# 高级参数
timeout -k 10s 60s command# 60秒后发TERM,再10秒后发KILL
timeout --signal=KILL 30s command# 直接发KILL信号

# 实战案例:防止脚本卡住
timeout 300 ./build.sh || echo"Build timed out"

# 实战案例:批量操作超时控制
for host in $(cat hosts.txt); do
    timeout 5 ssh $host"hostname" || echo"$host: timeout"
done

48. watch – 定期执行

# 基础用法
watch command             # 每2秒执行一次
watch -n 1 command        # 每1秒执行一次

# 高级参数
watch -d command          # 高亮变化部分
watch -g command          # 输出变化时退出
watch -t command          # 不显示标题

# 实战案例:监控进程状态
watch -n 1 'ps aux | grep nginx'

# 实战案例:监控磁盘IO
watch -n 1 'iostat -x 1 2 | tail -10'

# 实战案例:监控网络连接数
watch -n 1 'ss -s'

# 实战案例:监控日志增长
watch -n 1 'tail -5 /var/log/app.log'

49. screen / tmux – 终端复用

# screen基础用法
screen                    # 新建会话
screen -S name            # 命名会话
screen -ls                # 列出会话
screen -r name            # 恢复会话
screen -d -r name         # 强制恢复
Ctrl+A, D                 # 分离会话

# tmux基础用法(推荐)
tmux                      # 新建会话
tmux new -s name          # 命名会话
tmux ls                   # 列出会话
tmux attach -t name       # 恢复会话
tmux kill-session -t name # 终止会话

# tmux快捷键(默认Ctrl+B前缀)
Ctrl+B, D                 # 分离
Ctrl+B, C                 # 新建窗口
Ctrl+B, N/P               # 切换窗口
Ctrl+B, "                 # 水平分割
Ctrl+B, %                 # 垂直分割
Ctrl+B, 方向键            # 切换面板

# 实战案例:持久化运行任务
tmux new -s deploy
./deploy.sh
Ctrl+B, D                 # 分离,放心关终端

# 实战案例:同步执行命令
tmux set synchronize-panes on  # 在多个面板同时输入

tmux是远程运维必备工具。SSH断了任务还在跑,多窗口操作效率翻倍。

50. crontab – 定时任务

# 基础用法
crontab -l                # 查看任务
crontab -e                # 编辑任务
crontab -r                # 删除所有任务

# crontab格式
# 分 时 日 月 周 命令
# *  *  *  *  *  command
# 0  2  *  *  *  每天凌晨2点
# */5 *  *  *  *  每5分钟
# 0  0  1  *  *  每月1号

# 实战案例:完整的crontab配置
# 设置环境变量
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

# 每天凌晨备份
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

# 每5分钟检查服务
*/5 * * * * /opt/scripts/check_service.sh

# 每周日清理日志
0 3 * * 0 find /var/log -name "*.log" -mtime +30 -delete

# 实战案例:防止任务重复运行
*/5 * * * * flock -n /tmp/myjob.lock /opt/scripts/myjob.sh

# 实战案例:查看cron日志
grep CRON /var/log/syslog

cron的坑很多:路径问题、环境变量问题、日志问题。建议在crontab里明确设置PATH和SHELL,命令输出重定向到日志文件。


第六类:用户权限命令(5个)

51. useradd / usermod / userdel – 用户管理

# 添加用户
useradd username
useradd -m username       # 创建家目录
useradd -m -s /bin/bash -G sudo,docker username

# 修改用户
usermod -aG docker username  # 添加到docker组
usermod -s /bin/bash username  # 修改shell
usermod -L username       # 锁定用户
usermod -U username       # 解锁用户

# 删除用户
userdel username
userdel -r username       # 同时删除家目录

# 设置密码
passwd username

# 实战案例:创建应用账户
useradd -r -m -d /opt/app -s /sbin/nologin appuser

# 实战案例:批量创建用户
for user in user1 user2 user3; do
    useradd -m -s /bin/bash $user
    echo"$user:RandomPassword123!" | chpasswd
done

52. chmod – 权限修改

# 数字模式
chmod 755 file            # rwxr-xr-x
chmod 644 file            # rw-r--r--
chmod 600 file            # rw------- (私钥文件)
chmod 777 file            # 永远不要在生产环境用

# 符号模式
chmod u+x file            # 用户加执行权限
chmod g-w file            # 组去掉写权限
chmod o=r file            # 其他人只读
chmod a+x file            # 所有人加执行权限

# 高级用法
chmod -R 755 dir/         # 递归修改
chmod --reference=file1 file2  # 复制权限

# 特殊权限
chmod u+s file            # SUID
chmod g+s dir             # SGID
chmod +t dir              # Sticky bit

# 实战案例:设置正确的Web目录权限
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;

# 实战案例:脚本文件权限
chmod 750 /opt/scripts/*.sh

53. chown – 属主修改

# 基础用法
chown user file
chown user:group file
chown :group file         # 只改组

# 高级用法
chown -R user:group dir/  # 递归修改
chown --reference=file1 file2

# 实战案例:修改Web目录属主
chown -R www-data:www-data /var/www/html/

# 实战案例:修复权限问题
chown -R app:app /opt/app/
chmod -R u=rwX,g=rX,o= /opt/app/

54. sudo – 权限提升

# 基础用法
sudo command
sudo -u username command# 以指定用户执行
sudo -i                   # 切换到root shell
sudo -s                   # 保持当前目录的root shell

# 编辑sudoers
visudo                    # 安全编辑

# 实战案例:sudoers配置
# 允许用户无密码执行特定命令
username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

# 允许用户组执行所有命令
%admin ALL=(ALL) ALL

# 实战案例:查看sudo权限
sudo -l

55. su – 切换用户

# 基础用法
su - username             # 完整登录shell
su username               # 不加载用户环境

# 高级用法
su - username -c "command"  # 执行单条命令
su -                      # 切换到root

# 实战案例:以应用用户执行
su - app -c "/opt/app/bin/start.sh"

# 区别
# su username   - 保持当前目录和部分环境变量
# su - username - 完全模拟登录,切换到用户家目录

第七类:磁盘存储命令(5个)

56. df – 磁盘空间

# 基础用法
df -h                     # 人类可读
df -i                     # inode使用情况
df -T                     # 显示文件系统类型

# 高级用法
df -h /path               # 特定路径
df --total                # 显示总计

# 实战案例:快速查看磁盘使用
df -h | grep -E '^/dev' | awk '$5 > "80%"'

# 实战案例:监控脚本
df -h | awk 'NR>1 && int($5) > 80 {print $6, $5}'

57. du / dust – 目录大小

# du基础用法
du -sh /path              # 目录总大小
du -sh *                  # 当前目录下各项大小
du -h --max-depth=1       # 只看一层

# dust用法(推荐)
dust /path                # 可视化显示
dust -n 20 /path          # 显示前20个
dust -d 2 /path           # 深度2层

# 实战案例:找出大目录
du -h --max-depth=1 / 2>/dev/null | sort -h | tail -20

# 实战案例:找出大文件
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null

# ncdu(交互式)
ncdu /                    # 交互式浏览

dust的可视化效果很好,一眼就能看出磁盘空间被什么占了。

58. mount / umount – 挂载管理

# 查看挂载
mount
mount | grep /dev/sda
findmnt                   # 更清晰的树形显示

# 挂载
mount /dev/sdb1 /mnt/data
mount -t nfs server:/share /mnt/nfs
mount -o loop image.iso /mnt/iso

# 卸载
umount /mnt/data
umount -l /mnt/data       # 延迟卸载
umount -f /mnt/nfs        # 强制卸载

# 实战案例:挂载配置 /etc/fstab
/dev/sdb1  /data  ext4  defaults,noatime  0  2
UUID=xxx   /data  xfs   defaults          0  2

# 实战案例:自动挂载
mount -a                  # 挂载fstab中所有条目

59. lsblk / fdisk – 磁盘信息

# lsblk(推荐)
lsblk
lsblk -f                  # 显示文件系统
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE

# fdisk
fdisk -l                  # 列出所有磁盘
fdisk /dev/sdb            # 交互式分区

# 查看磁盘详情
hdparm -I /dev/sda        # ATA/SATA磁盘信息
smartctl -a /dev/sda      # SMART信息

# 实战案例:新磁盘初始化
fdisk /dev/sdb            # 分区
mkfs.ext4 /dev/sdb1       # 格式化
mount /dev/sdb1 /data     # 挂载
echo'/dev/sdb1 /data ext4 defaults 0 2' >> /etc/fstab

60. dd – 磁盘复制

# 基础用法
dd if=/dev/sda of=/dev/sdb  # 克隆磁盘
dd if=/dev/zero of=file bs=1M count=100  # 创建100M文件

# 高级参数
dd if=/dev/sda of=disk.img bs=4M status=progress
dd if=/dev/sda | gzip > disk.img.gz
dd if=/dev/urandom of=/dev/sda bs=4M   # 安全擦除

# 实战案例:测试磁盘写入速度
dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 conv=fdatasync

# 实战案例:测试磁盘读取速度
dd if=/tmp/testfile of=/dev/null bs=1M

# 实战案例:创建swap文件
dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 常见错误
# if和of写反了会丢数据!操作前务必确认
# 建议用pv显示进度:dd if=xxx | pv | dd of=xxx

dd是个双刃剑,用对了能救命,用错了能毁灭。操作前一定要确认if和of没写反。


四、最佳实践和注意事项

性能优化

  1. 命令选择优化
# 搜索用rg代替grep,快几十倍
# 文件查找用fd代替find,快且语法简洁
# 查看文件用bat代替cat,可读性好
# 监控用btop代替top,信息更全
  1. 管道优化
# 低效
cat file | grep pattern | awk '{print $1}'

# 高效
awk '/pattern/ {print $1}' file
  1. 并行处理
# 串行处理慢
for host in $(cat hosts); do
    ssh $host "command"
done

# 并行处理快
cat hosts | xargs -P 10 -I {} ssh {} "command"

# 或使用parallel
parallel -j 10 ssh {} "command" :::: hosts

安全加固

  1. 危险命令防护
# 使用别名添加确认
alias rm='rm -i'
alias mv='mv -i'
alias cp='cp -i'

# 使用safe-rm
apt install safe-rm
  1. 权限最小化
# 脚本不要777
chmod 750 script.sh

# 配置文件不要world-readable
chmod 640 config.conf

# 私钥文件严格限制
chmod 600 ~/.ssh/id_rsa
  1. 审计日志
# 记录所有命令
export PROMPT_COMMAND='echo "$(date "+%Y-%m-%d %H:%M:%S") $(whoami) $(pwd) $(history 1)" >> /var/log/commands.log'

常见错误

  1. 路径陷阱
# 错误:空变量导致删除根目录
rm -rf $UNDEFINED_VAR/*

# 正确:使用引号和默认值
rm -rf "${TARGET_DIR:-/tmp/safe}/"
  1. 编码问题
# 遇到乱码时检查编码
file filename
iconv -f GBK -t UTF-8 file.txt > file_utf8.txt
  1. 权限问题
# 问题:Permission denied
# 检查:
ls -la file
namei -l /path/to/file   # 检查路径每一级权限

五、故障排查和监控

日志查看

# 系统日志
journalctl -xe                    # 最近错误
journalctl -u nginx --since "1 hour ago"
tail -f /var/log/syslog

# 应用日志
tail -f /var/log/nginx/error.log
less +F /var/log/app/app.log

# 审计日志
ausearch -ts today -k unauthorized

# 登录日志
last -20                          # 最近20次登录
lastb                             # 失败的登录
who                               # 当前登录用户

问题排查流程

# 1. 系统概览
uptime                            # 负载
free -h                           # 内存
df -h                             # 磁盘

# 2. 进程检查
top -c                            # 高CPU/内存进程
ps auxf                           # 进程树

# 3. 网络检查
ss -tuln                          # 监听端口
ss -ant | awk '{print $1}' | sort | uniq -c  # 连接状态

# 4. IO检查
iostat -x 1 5                     # 磁盘IO
iotop                             # IO进程排行

# 5. 日志检查
journalctl -xe
dmesg -T | tail -50

监控告警脚本示例

#!/bin/bash
# 系统监控脚本

# 阈值配置
CPU_THRESHOLD=80
MEM_THRESHOLD=85
DISK_THRESHOLD=90

# CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print 100-$8}' | cut -d. -f1)

# 内存使用率
MEM_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2*100}')

# 磁盘使用率
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')

# 告警函数
alert() {
    echo"[ALERT] $(date '+%Y-%m-%d %H:%M:%S') $1" >> /var/log/monitor.log
    # 发送到告警系统
    # curl -X POST "http://alert-server/api/alert" -d "message=$1"
}

# 检查并告警
[[ $CPU_USAGE -gt $CPU_THRESHOLD ]] && alert "CPU usage is ${CPU_USAGE}%"
[[ $MEM_USAGE -gt $MEM_THRESHOLD ]] && alert "Memory usage is ${MEM_USAGE}%"
[[ $DISK_USAGE -gt $DISK_THRESHOLD ]] && alert "Disk usage is ${DISK_USAGE}%"

六、总结

要点回顾

  1. 文件操作:熟练使用rsync、tar进行数据同步和备份
  2. 文本处理:grep/awk/sed是日志分析三剑客
  3. 系统监控:top/htop/btop实时监控,sar历史分析
  4. 网络诊断:ss/tcpdump/mtr定位网络问题
  5. 进程管理:systemctl是服务管理核心,tmux是远程运维必备
  6. 安全意识:最小权限原则,危险操作前备份

进阶方向

  1. 自动化运维Ansible、Terraform、Pulumi
  2. 容器技术:Docker、Kubernetes、containerd
  3. 可观测性:Prometheus、Grafana、OpenTelemetry
  4. 云原生:AWS/GCP/Azure CLI工具
  5. 编程技能:Python/Go脚本开发

参考资料

  • Linux man pages: man command
  • TLDR pages: tldr command(简洁版man)
  • explainshell.com – 命令解释网站
  • Linux Performance by Brendan Gregg
  • The Linux Command Line by William Shotts

附录

命令速查表

类别
命令
用途
现代替代
文件
ls
列出文件
eza
文件
find
查找文件
fd
文件
cat
查看文件
bat
文件
cp
复制文件
rsync
文本
grep
搜索文本
ripgrep
文本
awk
文本处理
文本
sed
流编辑
系统
top
进程监控
btop
系统
du
目录大小
dust
网络
netstat
网络状态
ss
网络
ifconfig
网络配置
ip

效率提升配置

# ~/.bashrc 或 ~/.zshrc 完整配置

# 现代命令别名
ifcommand -v eza &> /dev/null; then
    alias ls='eza --icons'
    alias ll='eza -alh --git --icons'
    alias la='eza -a --icons'
    alias lt='eza --tree --level=2 --icons'
fi

ifcommand -v bat &> /dev/null; then
    alias cat='bat --paging=never'
    alias less='bat'
fi

ifcommand -v rg &> /dev/null; then
    alias grep='rg'
fi

ifcommand -v fd &> /dev/null; then
    alias find='fd'
fi

ifcommand -v dust &> /dev/null; then
    alias du='dust'
fi

# 常用快捷命令
alias ports='ss -tulanp'
alias myip='curl -s ifconfig.me'
alias h='history | tail -20'
alias j='jobs -l'
alias path='echo $PATH | tr ":" "\n"'

# 安全别名
alias rm='rm -I --preserve-root'
alias mv='mv -i'
alias cp='cp -i'
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

# Git快捷键
alias g='git'
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline -10'
alias gd='git diff'

# Docker快捷键
alias d='docker'
alias dc='docker-compose'
alias dps='docker ps'
alias dex='docker exec -it'
alias dlogs='docker logs -f'

# Kubernetes快捷键
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kgd='kubectl get deployments'
alias klogs='kubectl logs -f'
alias kexec='kubectl exec -it'

# 函数
mkcd() { mkdir -p "$1" && cd"$1"; }
extract() {
    case"$1"in
        *.tar.bz2) tar xjf "$1" ;;
        *.tar.gz)  tar xzf "$1" ;;
        *.tar.xz)  tar xJf "$1" ;;
        *.tar.zst) tar --zstd -xf "$1" ;;
        *.bz2)     bunzip2 "$1" ;;
        *.gz)      gunzip "$1" ;;
        *.tar)     tar xf "$1" ;;
        *.tbz2)    tar xjf "$1" ;;
        *.tgz)     tar xzf "$1" ;;
        *.zip)     unzip "$1" ;;
        *.7z)      7z x "$1" ;;
        *)         echo"'$1' cannot be extracted" ;;
    esac
}

Oh-My-Zsh推荐插件

# ~/.zshrc
plugins=(
    git                  # Git别名和补全
    docker               # Docker补全
    kubectl              # K8s补全
    aws                  # AWS CLI补全
    sudo                 # 双击ESC添加sudo
    history              # 历史命令搜索
    colored-man-pages    # 彩色man页面
    command-not-found    # 命令建议
    zsh-autosuggestions  # 自动建议
    zsh-syntax-highlighting  # 语法高亮
    fzf                  # 模糊搜索
)

术语表

术语
解释
PID
进程ID
PPID
父进程ID
TTY
终端设备
UID
用户ID
GID
组ID
FD
文件描述符
inode
索引节点,文件元数据
SIGTERM
终止信号(15)
SIGKILL
强制终止信号(9)
SIGHUP
挂起信号(1),常用于重载配置
TTL
生存时间
MTU
最大传输单元
RTT
往返时间
OOM
内存溢出
swap
交换空间
buffer
缓冲区(写入缓存)
cache
缓存(读取缓存)
load average
系统负载平均值
zombie
僵尸进程

这份手册是我十年运维经验的浓缩,希望对你有帮助。命令只是工具,重要的是理解背后的原理和在什么场景使用。实践出真知,多动手,少死记。

想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

未经允许不得转载:17认证网 » 运维必会的60个Linux命令,我整理了这份速查手册
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师