运维必会的60个Linux命令,我整理了这份速查手册
一、概述
背景介绍
干了十年运维,从最早的物理机房值班到现在的云原生架构,Linux命令始终是我吃饭的家伙。这些年带过不少新人,发现很多人对命令的理解停留在"能用就行"的阶段,遇到复杂场景就抓瞎。
这篇文章不是简单的命令罗列,而是我多年踩坑后总结的实战经验。每个命令我都会讲清楚:什么场景用、怎么用更高效、容易踩什么坑。
技术特点
2025年的Linux运维和五年前已经大不一样了:
- 现代化工具崛起:ripgrep、fd、bat这些Rust写的工具已经成为主流,性能碾压传统工具
- 容器化环境普及:很多命令需要考虑在容器内执行的场景
- 自动化要求更高:命令不仅要会敲,还要会写进脚本、集成到CI/CD
- 安全合规更严格:很多操作需要审计,命令的安全用法越来越重要
适用场景
这份手册适合以下场景:
环境要求
本文示例基于以下环境测试:
# 操作系统Ubuntu 24.04 LTS / Rocky Linux 9.3 / Debian 12# 内核版本Linux 6.5+# ShellBash 5.2+ / Zsh 5.9+# 现代工具版本ripgrep 14.1+fd 9.0+bat 0.24+eza 0.18+ (exa的活跃维护分支)dust 1.0+
二、详细步骤
准备工作:现代工具安装
在开始之前,强烈建议安装这些现代替代工具。我现在的服务器都会预装这套工具链:
# Ubuntu/Debiansudo apt updatesudo apt install -y ripgrep fd-find bat eza# Rocky Linux/RHELsudo dnf install -y ripgrep fd-find bat eza# 通用方式 - 使用cargo安装最新版curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource ~/.cargo/envcargo install ripgrep fd-find bat eza dust# 创建别名(fd-find在Debian系安装后叫fdfind)echo'alias fd=fdfind' >> ~/.bashrcecho'alias cat=bat' >> ~/.bashrcecho'alias ls=eza' >> ~/.bashrc
核心配置:Shell环境优化
# ~/.bashrc 或 ~/.zshrc 添加以下内容# 历史命令优化export HISTSIZE=50000export HISTFILESIZE=100000export HISTCONTROL=ignoreboth:erasedupsexport 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/logcd ~ # 回到家目录cd - # 回到上一个目录(这个很多人不知道)# 高级技巧cd !$ # 进入上条命令的最后一个参数目录pushd /var/log# 进入目录并压栈popd# 弹出栈顶目录# 实战案例:在两个目录间频繁切换cd /var/logcd /etc/nginxcd - # 快速切回/var/logcd - # 再切回/etc/nginx# 使用目录栈管理多个目录pushd /var/logpushd /etc/nginxpushd /home/appdirs -v # 查看目录栈cd ~2 # 直接跳转到栈中第2个目录
3. cp - 文件复制
# 基础用法cp file1 file2cp -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.bakrename 's/\.log$/.log.bak/' *.log# 实战案例:安全移动大量文件mv -v /source/files/* /dest/ 2>&1 | tee mv.log# 常见错误# 在跨文件系统移动时,mv实际上是cp+rm# 大文件移动要注意磁盘空间
5. rm - 文件删除
# 基础用法rm filerm -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 ~/.trashalias 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 dirnamemkdir -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 +100Mfind /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/currentexport 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 filecat -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 filemore 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# 实战案例:带时间戳的tailtail -f file | whileread line; doecho"$(date '+%H:%M:%S')$line"; done
生产环境用tail -F而不是tail -f。区别是-F在文件被轮转后会自动重新打开新文件,这在日志轮转场景很重要。
14. grep / ripgrep - 文本搜索
这是运维最高频使用的命令之一:
# grep基础用法grep "pattern" filegrep -r "pattern" dir/ # 递归搜索grep -i "pattern" file # 忽略大小写grep -v "pattern" file # 反向匹配# ripgrep用法(强烈推荐)rg "pattern" filerg "pattern" dir/ # 默认递归,自动忽略.gitignorerg -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 filesort -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 | uniqsort 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基础用法toptop -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统计
# 基础用法iostatiostat -x # 扩展信息iostat -xz 2 10 # 每2秒刷新,忽略无活动设备# 输出解读# %util - 设备繁忙程度,接近100%说明IO瓶颈# await - IO平均等待时间,毫秒# r/s, w/s - 每秒读写次数# rkB/s, wkB/s - 每秒读写量# 实战案例:监控磁盘IOiostat -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 - 系统运行时间和负载
# 基础用法uptimew # 同时显示登录用户# 输出解读# 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 - 内核日志
# 基础用法dmesgdmesg -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 addrip a # 简写# 查看路由表ip routeip 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 eth0ip addr del 192.168.1.100/24 dev eth0ip link set eth0 up/downip 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# 实战案例:找出连接数最多的IPss -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 hostping -c 5 host # 发送5个包# 高级参数ping -i 0.2 host # 间隔0.2秒ping -s 1000 host # 包大小1000字节ping -t 10 host # TTL设为10ping -W 2 host # 超时2秒# 实战案例:测试MTUping -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 hosttraceroute -n host # 不解析主机名(更快)traceroute -T host # 使用TCP(绕过ICMP阻断)# mtr(推荐,交互式)mtr hostmtr -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.comcurl -o file.html http://example.comcurl -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" urlcurl -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# 实战案例:测试WebSocketcurl --include \ --no-buffer \ --header "Connection: Upgrade" \ --header "Upgrade: websocket" \ http://example.com/socket
37. wget - 文件下载
# 基础用法wget urlwget -O filename url # 指定文件名wget -c url # 断点续传# 高级参数wget -q url # 安静模式wget -b url # 后台下载wget --limit-rate=1m url # 限速1MB/swget -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.comdig 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.comnslookup example.com 8.8.8.8# 实战案例:检查DNS解析dig +short example.com @8.8.8.8dig +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; doecho"=== $dns ===" dig +short example.com @$dnsdone# 实战案例:测量DNS解析时间dig example.com | grep "Query time"
39. tcpdump - 网络抓包
# 基础用法tcpdump -i eth0tcpdump -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.100tcpdump port 80tcpdump src host 192.168.1.100tcpdump dst port 443tcpdump '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 -viptables -L -n -v -t nat # NAT表# 常用操作iptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -s 192.168.1.0/24 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -j DROPiptables -D INPUT 3 # 删除第3条规则iptables -F # 清空规则# 保存规则iptables-save > /etc/iptables.rulesiptables-restore < /etc/iptables.rules# nftables(2025年推荐)nft list rulesetnft 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 SSHiptables -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 # 发送SIGTERMkill -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"# 按完整命令行匹配# killallkillall nginx # 杀所有nginx进程killall -u www-data # 杀用户所有进程# 实战案例:优雅重启nginxkill -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 # 返回PIDpgrep -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; thenecho"nginx is running"elseecho"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 nginxsystemctl stop nginxsystemctl restart nginxsystemctl reload nginx # 重新加载配置systemctl status nginx# 开机自启systemctl enable nginxsystemctl disable nginxsystemctl is-enabled nginx# 查看服务systemctl list-units --type=servicesystemctl list-units --type=service --state=runningsystemctl list-unit-files --type=service# 高级用法systemctl daemon-reload # 重新加载unit文件systemctl mask nginx # 彻底禁用systemctl unmask nginxsystemctl edit nginx # 编辑服务配置# 实战案例:查看失败的服务systemctl --failed# 实战案例:查看服务依赖systemctl list-dependencies nginx# 实战案例:创建自定义服务cat > /etc/systemd/system/myapp.service << 'EOF'[Unit]Description=My ApplicationAfter=network.target[Service]Type=simpleUser=appWorkingDirectory=/opt/myappExecStart=/opt/myapp/bin/start.shRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reloadsystemctl 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秒后发KILLtimeout --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'# 实战案例:监控磁盘IOwatch -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.shCtrl+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/bashPATH=/usr/local/bin:/usr/bin:/binMAILTO=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 usernameuseradd -m username # 创建家目录useradd -m -s /bin/bash -G sudo,docker username# 修改用户usermod -aG docker username # 添加到docker组usermod -s /bin/bash username # 修改shellusermod -L username # 锁定用户usermod -U username # 解锁用户# 删除用户userdel usernameuserdel -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 $userecho"$user:RandomPassword123!" | chpasswddone
52. chmod - 权限修改
# 数字模式chmod 755 file # rwxr-xr-xchmod 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 # SUIDchmod g+s dir # SGIDchmod +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 filechown user:group filechown :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 commandsudo -u username command# 以指定用户执行sudo -i # 切换到root shellsudo -s # 保持当前目录的root shell# 编辑sudoersvisudo # 安全编辑# 实战案例:sudoers配置# 允许用户无密码执行特定命令username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx# 允许用户组执行所有命令%admin ALL=(ALL) ALL# 实战案例:查看sudo权限sudo -l
55. su - 切换用户
# 基础用法su - username # 完整登录shellsu 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 - 挂载管理
# 查看挂载mountmount | grep /dev/sdafindmnt # 更清晰的树形显示# 挂载mount /dev/sdb1 /mnt/datamount -t nfs server:/share /mnt/nfsmount -o loop image.iso /mnt/iso# 卸载umount /mnt/dataumount -l /mnt/data # 延迟卸载umount -f /mnt/nfs # 强制卸载# 实战案例:挂载配置 /etc/fstab/dev/sdb1 /data ext4 defaults,noatime 0 2UUID=xxx /data xfs defaults 0 2# 实战案例:自动挂载mount -a # 挂载fstab中所有条目
59. lsblk / fdisk - 磁盘信息
# lsblk(推荐)lsblklsblk -f # 显示文件系统lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE# fdiskfdisk -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=progressdd if=/dev/sda | gzip > disk.img.gzdd 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=4096chmod 600 /swapfilemkswap /swapfileswapon /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"# 或使用parallelparallel -j 10 ssh {} "command" :::: hosts
安全加固
# 使用别名添加确认alias rm='rm -i'alias mv='mv -i'alias cp='cp -i'# 使用safe-rmapt install safe-rm
# 脚本不要777chmod 750 script.sh# 配置文件不要world-readablechmod 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 filenameiconv -f GBK -t UTF-8 file.txt > file_utf8.txt
# 问题:Permission denied# 检查:ls -la filenamei -l /path/to/file # 检查路径每一级权限
五、故障排查和监控
日志查看
# 系统日志journalctl -xe # 最近错误journalctl -u nginx --since "1 hour ago"tail -f /var/log/syslog# 应用日志tail -f /var/log/nginx/error.logless +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 # 磁盘IOiotop # IO进程排行# 5. 日志检查journalctl -xedmesg -T | tail -50
监控告警脚本示例
#!/bin/bash# 系统监控脚本# 阈值配置CPU_THRESHOLD=80MEM_THRESHOLD=85DISK_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
参考资料
- 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; thenalias ls='eza --icons'alias ll='eza -alh --git --icons'alias la='eza -a --icons'alias lt='eza --tree --level=2 --icons'fiifcommand -v bat &> /dev/null; thenalias cat='bat --paging=never'alias less='bat'fiifcommand -v rg &> /dev/null; thenalias grep='rg'fiifcommand -v fd &> /dev/null; thenalias find='fd'fiifcommand -v dust &> /dev/null; thenalias 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推荐插件
# ~/.zshrcplugins=( git # Git别名和补全 docker # Docker补全 kubectl # K8s补全 aws # AWS CLI补全 sudo # 双击ESC添加sudohistory# 历史命令搜索 colored-man-pages # 彩色man页面command-not-found # 命令建议 zsh-autosuggestions # 自动建议 zsh-syntax-highlighting # 语法高亮 fzf # 模糊搜索)
术语表
这份手册是我十年运维经验的浓缩,希望对你有帮助。命令只是工具,重要的是理解背后的原理和在什么场景使用。实践出真知,多动手,少死记。