
场景一为什么说“一切皆文件”—— 用代码证明给你看原理简述Linux把硬件设备、目录、进程、socket都抽象成文件意味着你可以用操作文件的函数open/read/write/close来操作硬件。这个设计让系统接口高度统一。代码演示用cat命令直接读取硬盘和内存信息bash# 查看硬盘的物理信息注意不要往系统盘写只读是安全的 sudo cat /dev/sda | head -c 1024 | hexdump -C | head -10 # 读取系统内存信息/dev/mem是物理内存的映像 sudo cat /dev/mem | head -c 64 | hexdump -C逐行解读第1行sudo cat /dev/sda→ 把硬盘设备当作普通文本文件来读取虽然它是二进制。head -c 1024只取前1024字节hexdump -C以十六进制显示。第2行/dev/mem是物理内存的映像文件同样可以用cat读取——这证明了“内存也是文件”。结论你操作任何设备都统一通过文件描述符不需要为每个硬件学一套新API。场景二用户和权限的真实案例 —— 为什么你的脚本“Permission denied”原理简述每个文件有三组权限所有者/组/其他人和三种动作读/写/执行。当你执行./script.sh报错Permission denied要么是没有x权限要么是文件所有者不是你但你又没sudo。代码演示创建脚本、赋权、切换用户执行bash# 1. 用当前用户创建脚本 echo #!/bin/bash test.sh echo echo Hello from $USER test.sh # 2. 查看权限默认没有执行权 ls -l test.sh # 输出-rw-rw-r-- 1 alice alice 43 Jul 28 10:00 test.sh # 解释-rw-rw-r-- 表示所有者可读写组可读写其他人只读——没有x # 3. 尝试执行会失败 ./test.sh # 报错bash: ./test.sh: Permission denied # 4. 给所有者加执行权 chmod ux test.sh # 5. 再次查看权限 ls -l test.sh # 输出-rwxrw-r-- 1 alice alice 43 Jul 28 10:00 test.sh # 解释多了x现在所有者可以执行 # 6. 成功执行 ./test.sh # 输出Hello from alice # 7. 切换到root用户执行需要输入密码 su - root -c ./test.sh # 输出Hello from root # 虽然脚本属于alice但root拥有上帝权限仍可执行逐行解读第8行./test.sh失败是因为文件模式中没有x位。第11行chmod ux只给文件所有者加执行权不影响组内其他用户。第18行su - root -c是“切换成root并执行一条命令”的典型用法验证了权限的绝对性。场景三管道和重定向 —— 让简单命令组合成“瑞士军刀”原理简述管道|把左边命令的stdout直接接到右边命令的stdin省去中间文件。重定向改变输入/输出来源默认是终端。代码演示统计日志中最耗时的IPbash# 场景你有一个Nginx访问日志想找出访问次数最多的前5个IP # 1. 查看原始日志前3行了解格式 head -3 /var/log/nginx/access.log # 输出示例192.168.1.5 - - [28/Jul/2026:10:15:23] GET /index.html 200 1024 # 2. 用管道链提取IP、排序、去重计数、再排序、取前5 cat /var/log/nginx/access.log | \ awk {print $1} | \ sort | \ uniq -c | \ sort -nr | \ head -5 # 输出示例 # 1543 192.168.1.5 # 876 10.0.0.23 # 543 192.168.1.9 # 210 172.16.0.4 # 98 10.0.0.7逐行解读第5行awk {print $1}→ 每行按空格拆分取第一个字段IP地址。第6行sort→ 把所有IP按字母序排列为后续去重做准备。第7行uniq -c→ 统计相邻的重复行次数输出格式为“次数 IP”。第8行sort -nr→ 按数字-n降序-r排序使访问量大的排前面。第9行head -5→ 只取前5行。关键点整条命令没有创建任何临时文件全部在内存中通过管道流动高效且简洁。场景四进程管理 —— 如何“救回”一个跑在前台的大任务原理简述前台进程占用终端CtrlC可终止。后台进程不占用终端用启动或CtrlZ挂起后bg放入后台。作业控制jobs查看后台任务fg调回前台kill发送信号。代码演示启动一个耗时任务挂起放后台再调回bash# 1. 启动一个模拟耗时任务ping 无限循环 ping 8.8.8.8 ping_result.txt # 此时终端被占住无法输入新命令 # 2. 按 CtrlZ 挂起当前任务 # 终端显示[1] Stopped ping 8.8.8.8 ping_result.txt # 3. 把挂起的任务放入后台继续运行 bg %1 # 终端显示[1] ping 8.8.8.8 ping_result.txt # 4. 现在可以输入其他命令了检查后台任务状态 jobs # 输出[1] Running ping 8.8.8.8 ping_result.txt # 5. 在后台任务运行的同时再启动一个新前台任务 tail -f ping_result.txt # 实时查看ping输出这是另一个前台任务 # 6. 想切回ping任务时先停止tailCtrlC再把ping调回前台 fg %1 # 终端恢复显示ping的实时输出因为现在它接管了终端逐行解读第2行重定向输出到文件避免屏幕刷屏。第6行CtrlZ发送SIGTSTP信号挂起进程不是终止。第10行bg %1→bg让作业在后台继续运行%1表示jobs列表里的1号任务。第17行fg %1→ 把1号任务拉回前台再次占用终端。实际场景当你误启动了一个大压缩任务不想中断就可以这样操作。场景五定时任务 —— 让服务器凌晨自动清理日志原理简述cron是Linux的时间调度器通过crontab -e编辑每个用户的定时任务表。格式为分 时 日 月 周 命令。代码演示编写一个自动清理脚本并设定凌晨2点执行bash# 1. 先写清理脚本 cat /home/user/cleanup.sh EOF #!/bin/bash LOG_DIR/var/log/myapp BACKUP_DIR/backup/logs DATE$(date %Y%m%d) # 压缩昨天的日志 find $LOG_DIR -name *.log -mtime 1 -exec gzip {} \; # 把压缩好的文件移动到备份目录保留7天 mv $LOG_DIR/*.gz $BACKUP_DIR/ # 删除7天前的备份 find $BACKUP_DIR -name *.gz -mtime 7 -delete echo Cleanup completed at $(date) /var/log/cleanup.log EOF # 2. 给脚本执行权限 chmod x /home/user/cleanup.sh # 3. 添加到cron表 crontab -e # 在打开的编辑器中插入下面这一行 # 0 2 * * * /home/user/cleanup.sh /dev/null 21 # 4. 查看已添加的定时任务 crontab -l # 输出0 2 * * * /home/user/cleanup.sh /dev/null 21逐行解读第6行find ... -mtime 1找到修改时间超过1天的日志即昨天的。第7行-exec gzip {} \;对每个找到的文件执行gzip压缩。第10行-mtime 7 -delete删除7天前的压缩包自动回收空间。第17行0 2 * * *→ 每天凌晨2点整执行。第17行末尾 /dev/null 21→ 标准输出和错误都丢弃避免产生邮件通知。场景六网络诊断 —— 综合运用ping/traceroute/ss排查“为什么连不上数据库”原理简述ping测连通性和延迟ICMP协议。traceroute追踪路由路径。ss查看端口监听和连接状态比netstat快。代码演示三步排查法bash# 假设你的应用连不上数据库服务器 192.168.1.100:3306 # 第一步测网络通不通注意有些防火墙禁ping ping -c 4 192.168.1.100 # 如果收到回复说明网络层OK如果超时走第二步 # 第二步看路由在哪断了-n表示不解析主机名更快 traceroute -n 192.168.1.100 # 输出会显示每一跳的IP能看出是在哪个网关丢失的 # 第三步检查本机到目标端口的三次握手是否成功使用ss或nc ss -tln | grep 3306 # 如果输出为空说明本机没有监听3306或服务没启动 # 如果本机监听正常但远程连不上检查防火墙是否允许 sudo iptables -L -n | grep 3306 # 如果有DROP规则需要添加放行规则 # 实战用ncnetcat测试端口连通性 nc -zv 192.168.1.100 3306 # 输出示例 # Connection to 192.168.1.100 3306 port [tcp/mysql] succeeded! # 如果失败会显示 Connection refused 或 timeout逐行解读第6行ping -c 4只发4个包避免无限循环。第11行traceroute -n用IP而非域名显示减少DNS解析耗时。第15行ss -tln→-tTCP-llistening监听-n数字显示端口。这是检查服务是否启动的快速方法。第20行nc -zv→-z只扫描不发送数据-v详细输出是最常用的端口检测工具。总结代码与文字结合的学习建议学习阶段正确姿势错误姿势初学者对照本文的“场景→代码→解释”三步手动输入每一行命令观察输出。只读文字不敲命令或只复制粘贴不思考。进阶者修改代码中的参数如把head -5改成head -10预测输出再验证。死记命令参数不理解为什么这样组合。高手把多个场景串联成自动化脚本如把健康检查脚本加入cron形成自己的工具箱。学过就忘遇到问题只会百度现成命令。最后送你一个“万能调试命令”当你对任何命令不确定时永远可以bashman 命令名 # 查看官方完整手册 命令名 --help # 查看快速帮助 whatis 命令名 # 看一句话简介例如bashman grep grep --help whatis awk