一、概述
背景介绍
干了十年运维,从最早的物理机房值班到现在的云原生架构,Linux命令始终是我吃饭的家伙。这些年带过不少新人,发现很多人对命令的理解停留在”能用就行”的阶段,遇到复杂场景就抓瞎。
这篇文章不是简单的命令罗列,而是我多年踩坑后总结的实战经验。每个命令我都会讲清楚:什么场景用、怎么用更高效、容易踩什么坑。
技术特点
2025年的Linux运维和五年前已经大不一样了:
-
现代化工具崛起:ripgrep、fd、bat这些Rust写的工具已经成为主流,性能碾压传统工具 -
容器化环境普及:很多命令需要考虑在容器内执行的场景 -
自动化要求更高:命令不仅要会敲,还要会写进脚本、集成到CI/CD -
安全合规更严格:很多操作需要审计,命令的安全用法越来越重要
适用场景
这份手册适合以下场景:
-
日常服务器运维和故障排查 -
生产环境问题定位和性能调优 -
自动化脚本开发 -
容器和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没写反。
四、最佳实践和注意事项
性能优化
-
命令选择优化
# 搜索用rg代替grep,快几十倍
# 文件查找用fd代替find,快且语法简洁
# 查看文件用bat代替cat,可读性好
# 监控用btop代替top,信息更全
-
管道优化
# 低效
cat file | grep pattern | awk '{print $1}'
# 高效
awk '/pattern/ {print $1}' file
-
并行处理
# 串行处理慢
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
安全加固
-
危险命令防护
# 使用别名添加确认
alias rm='rm -i'
alias mv='mv -i'
alias cp='cp -i'
# 使用safe-rm
apt install safe-rm
-
权限最小化
# 脚本不要777
chmod 750 script.sh
# 配置文件不要world-readable
chmod 640 config.conf
# 私钥文件严格限制
chmod 600 ~/.ssh/id_rsa
-
审计日志
# 记录所有命令
export PROMPT_COMMAND='echo "$(date "+%Y-%m-%d %H:%M:%S") $(whoami) $(pwd) $(history 1)" >> /var/log/commands.log'
常见错误
-
路径陷阱
# 错误:空变量导致删除根目录
rm -rf $UNDEFINED_VAR/*
# 正确:使用引号和默认值
rm -rf "${TARGET_DIR:-/tmp/safe}/"
-
编码问题
# 遇到乱码时检查编码
file filename
iconv -f GBK -t UTF-8 file.txt > file_utf8.txt
-
权限问题
# 问题: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}%"
六、总结
要点回顾
-
文件操作:熟练使用rsync、tar进行数据同步和备份 -
文本处理:grep/awk/sed是日志分析三剑客 -
系统监控:top/htop/btop实时监控,sar历史分析 -
网络诊断:ss/tcpdump/mtr定位网络问题 -
进程管理:systemctl是服务管理核心,tmux是远程运维必备 -
安全意识:最小权限原则,危险操作前备份
进阶方向
-
自动化运维:Ansible、Terraform、Pulumi -
容器技术:Docker、Kubernetes、containerd -
可观测性:Prometheus、Grafana、OpenTelemetry -
云原生:AWS/GCP/Azure CLI工具 -
编程技能: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
附录
命令速查表
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
效率提升配置
# ~/.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 # 模糊搜索
)
术语表
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
想了解更多干货,可通过下方扫码关注

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

17认证网








