ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux运维实战:不背命令,从原理建立认知地图

Linux运维实战:不背命令,从原理建立认知地图 刚看到这标题的时候我愣了一下Liunx——好家伙又见这个经典拼写。十多年里我在各种论坛和技术群里见到不下几百次从刚入门的菜鸟到偶尔撸脚本的老手总有人把Linux打成Liunx。说实话这不算什么大事儿毕竟大家一看就知道说的是哪个系统这也算是圈内一种心照不宣的默契了。但真正让我觉得有必要写这篇笔记的原因并不是纠结一个单词怎么拼而是我观察到的一个现象很多人学 Linux 的方式是背命令今天背ls、明天背cd、后天背grep背了仨月真到了服务器上出问题照样一头雾水。为什么因为把命令当成孤立的咒语来记只要场景一变根本不知道怎么组合、怎么变通。我早年在好几家互联网公司做过运维和研发从零搭建过测试环境也处理过不少线上事故。这些年用 Linux 的体感就是——它的知识结构其实比大多数人想象的要紧凑得多。文件、进程、权限、日志、网络翻来覆去就那么几件事。今天这篇笔记我就把这几件事拆开揉碎结合真实的服务器运维场景来讲。你不懂 Linux 也能跟着走一遍老手也能从中挑出一些值得反思的细节。1. 整体设计与思路拆解先建立认知地图再谈具体命令很多人学 Linux 一上来就是ls、cd、pwd这没错但问题在于没有先建立一张地图。Linux 系统的日常操作再怎么花里胡哨本质上都绕不开下面五个维度文件与存储、用户与权限、进程与资源、网络与连接、日志与排障。我见过的所有能把 Linux 玩明白的人脑子里都有这张地图。拿到一个问题先判断它是哪个维度的事再顺着维度找命令找方案就不会乱。1.1 五维认知模型Linux 日常操作的骨架拿最常见的场景举例——网站访问不了。新手反应是到处试命令老手的行为是先看进程还在不在ps再看端口有没有监听ss接着看日志报什么错tail最后看磁盘和内存够不够df、free。看到没有完全不靠背就是按维度排查。这里我给一个建议把 Linux 学习分成两条线并行。第一条线是场景线比如我要部署一个 Python 服务我要给用户开放一个目录的上传权限我要查一下为什么磁盘满了。第二条线是底层线比如文件描述符是什么、硬链接和软链接有什么区别、crontab的环境变量为什么和你手动执行的不一样。两条线走到一半交汇你的水平就起来了。1.2 别急着上各种花哨工具命令行核心就三板斧现在很多新手被推荐学tmux、zsh、oh-my-zsh这些确实能提升效率但不是雪中送炭。真正雪中送炭的是三样东西命令的组成结构、帮助系统、管道和重定向。这三个是一切的根基。命令组成结构说白了就是命令 参数 选项。很多人以为ls -l里的-l是long的意思对但不全对。搞清楚-和--的区别短选项和长选项再看ls和ls -l输出格式的不同很多命令自然就会了。帮助系统方面man和info是官方文档--help是快捷参考这三种要熟练切换。管道和重定向是真的需要下功夫的。|是把前一个命令的输出交给下一个命令处理和是把输出写到文件里。我把这三样东西称为命令行的语法基础因为它们是把零散工具组合起来的粘合剂。2. 核心细节解析与实操要点文件、权限、进程三大重头戏下面进入正题。选这三个维度来重点讲是因为我接触的绝大多数 Linux 问题都集中在它们身上——文件找不到了、没权限改了、进程卡死了这三句话基本能覆盖 80% 的新手求助。2.1 文件操作不只是 ls 和 cd看得见和看不见的文件ls和cd是入门级不用多讲但有三个细节很多人用得少关键时刻特别有用。第一个是tree命令。系统默认不一定装但装完之后看目录结构非常直观加-L指定层级比如tree -L 2只看两层分析一个陌生项目的目录结构时比ls -R清晰得多。第二个是find命令。很多人知道find / -name xxx是全局找文件但不知道它还能按时间、大小、类型找。我举个实际场景磁盘告警日志目录快满了要找出最近 7 天内改动超过 100M 的文件可以用find /var/log -type f -mtime -7 -size 100M这条命令实际用到的次数远比按名字查找多。第三个是通配符。*和?的区别一定要弄清楚*匹配任意数量字符?只匹配一个字符。rm -rf *.log和rm -rf *.?og处理的范围完全不同。别小看这个误删数据的事故很多时候是通配符范围没搞清楚。2.2 权限模型rwx 和数字之间的关系权限这一块必须彻底理解。Linux 权限九位字符分三段属主、属组、其他用户。每段三位对应读r、写w、执行x。数字表示法是把r4、w2、x1相加。为什么是 4、2、1因为这是二进制位4 是 1002 是 0101 是 001每一位独立加在一起不会混淆。chmod 755就是属主 7rwx、属组 5r-x、其他用户 5r-x。这里我要特别强调两个在实战中容易忽略的点。第一个是目录的 x 权限到底意味着什么。文件的 x 是能否执行目录的 x 是能否进入这个目录。如果只给了目录 r 权限但没有 x你ls能看到目录里的文件名但cd进不去stat拿不到详细属性。这种半吊子权限经常在一些共享目录配置中出现排查半天才发现是权限组合不对。第二个是为什么不要轻易chmod 777。777意味着所有人都能读写执行相当于把家门钥匙复制了一万份贴满小区。开发环境里图省事用了777到了生产环境忘了改轻则被删配置重则整个服务被拖垮。正确做法是给最小必要权限文件就644、755需要协作就搞组权限。2.3 进程管理搞清楚什么在跑、状态怎么样进程这块新手第一步是ps aux但很多人看不懂输出。ps aux里每一列的含义USER是哪个用户启动的PID是进程号CPU是占用 CPU 的百分比MEM是占用内存的百分比STAT是进程状态COMMAND是实际执行的命令。STAT常看的几个状态码S是睡眠R是运行Z是僵尸进程T是停止。Z状态要警惕僵尸进程杀不掉只能处理它的父进程。top命令是动态看资源占用但很多运维老手其实更常用htop——彩色、支持鼠标操作、可以树状显示进程关系。没装的话apt install htop或者yum install htop装一下让监控更直观。如果真的要看实例我给过一个实际项目的例子排查 Java 服务 CPU 飙高的问题先用top定位到哪个 Java 进程占用高再用top -Hp PID看具体哪个线程有问题配合jstack导出线程快照用printf %x 线程号转成十六进制去匹配定位到具体代码行。这个排查思路学一次就能用一辈子比到处问人Java 进程 CPU 高怎么办有用得多。进程和资源这一块我还想提一个几乎所有人都会踩的坑kill -9用多了会出事。kill -9是强制终结进程不给他机会做任何收尾工作——不写缓冲数据、不关闭文件、不通知子进程。我自己以前图省事一卡就kill -9结果几次数据库文件损坏教训很深。正确姿势是先kill PID发 SIGTERM让进程自己处理退出逻辑等几秒看它还不退再用kill -9。这和我们关电脑要先点关机、而不是直接拔电源是一个道理。3. 实操过程与核心环节实现从零到跑起一个服务的完整示例光讲概念容易飘我拿一个完整的实操例子把上面的东西串起来。假设我们要在一台干净的 CentOS 服务器上把一个简单的 Python Web 服务部署起来。当然这里不会涉及生产级的上游负载、HTTPS 证书什么的我们就专注把一条链路跑通过程中很多知识点都会出现。3.1 Step 1系统摸底与初始连接登录服务器后的第一件事不是着急装东西而是先摸底。我会依次看下面几项系统版本cat /etc/os-release有NAME和VERSION_ID两行判断是 CentOS 7、8 还是 Ubuntu包管理器完全不同当前用户whoami和id有没有 sudo 权限是 root 还是普通用户系统架构uname -m一般都是x86_64但要是 ARM 服务器后面装软件包的思路就不一样了磁盘情况df -h先看看根分区够不够用装软件之前发现磁盘满了是一件很尴尬的事这些不是形式主义我接手过不少前任留下的服务器系统版本不同同样的命令效果完全不一样。CentOS 7 用yumCentOS 8 之后推荐dnfUbuntu 系用apt这些搞混了装任何东西都会翻车。3.2 Step 2创建专用目录和用户为了演示权限和文件操作我建议创建一个专用用户不要什么都用 root 跑。给一个规律服务和项目能不用 root 就不用 root出问题之后排查权限依赖会非常痛苦。useradd -m -s /bin/bash deploy mkdir -p /data/www/myapp chown -R deploy:deploy /data/www/myappuseradd -m会顺手创建用户家目录-s /bin/bash指定登录 shell。然后创建项目目录并把目录属主改成deploy。这里我用了/data/www而不是/root或者/home是我们的习惯——约定的服务数据目录统一放/data下找起来方便备份也好做。权限这块chown -R deploy:deploy是递归地改属主和属组的意思-R一定不能漏不然目录建好了里面还是别人的后续写文件照样报 permission denied。3.3 Step 3编写测试脚本并验证执行权限先写一个最简单的 Python 脚本内容就是启动一个 HTTP 服务。为了演示权限我们先创建一个脚本文件#!/usr/bin/env python3 from http.server import HTTPServer, SimpleHTTPRequestHandler import os os.chdir(/data/www/myapp) HTTPServer((0.0.0.0, 8080), SimpleHTTPRequestHandler).serve_forever()代码本身没什么高深的关键是接下来的操作。保存为/data/www/myapp/server.py后要执行它需要两个条件一是文件有 x 权限二是解释器/usr/bin/python3存在。我们先看一下文件权限ls -l /data/www/myapp/server.py # -rw-r--r-- 1 deploy deploy 192 Aug 15 10:30 server.py权限是644没有执行权限。这时候直接./server.py会报 permission denied。给它加上执行权限有两种方式chmod x /data/www/myapp/server.py # 或者 chmod 755 /data/www/myapp/server.py两种方式效果等价chmod x是追加执行位chmod 755是直接指定最终权限。我更推荐第二种因为显式指定目标状态比在现有基础上增删更可控不容易出现我加了 x 但 ugo 搞错了的情况。3.4 Step 4启动服务、验证状态、查看日志启动服务可以前台跑也可以后台跑。先用前台跑方便观察输出确认没问题再转后台cd /data/www/myapp ./server.py看到终端出现Serving HTTP on 0.0.0.0 port 8080说明服务起来了。另开一个终端验证curl -I http://127.0.0.1:8080/返回HTTP/1.0 200 OK就说明本地已经通了。再验证一下端口监听状态ss -ltnp | grep 8080ss是netstat的现代替代品-l只显示监听中的端口-t只看 TCP-n不解析服务名直接显示端口号-p显示对应进程信息。能在输出里看到python3和 PID 就说明监听正常。这时候把前台的进程CtrlC停掉再用后台方式启动nohup ./server.py /data/www/myapp/server.log 21 nohup的意思是不挂断即使退出终端进程也不停。是追加输出到日志文件21是把标准错误也重定向到日志里。这个写法是跑后台任务的经典范式值得刻进脑子里。3.5 Step 5模拟一次真实故障排查过程服务跑着但某天发现访问量上不去先看一下进程状态ps aux | grep server.py如果发现进程根本没在去翻日志tail -n 50 /data/www/myapp/server.log日志如果显示端口已被占用ss -ltnp | grep 8080 # 有另一个进程占用了端口处理方式是先确认占用的进程是什么如果不是预期的就kill PID然后再重启服务。如果磁盘满了也会导致服务起不来别急着重启先df -h看看是不是/分区撑爆了。这个排查路径我称之为进程→端口→日志→磁盘四层检查法大部分服务的启动失败都能通过这条路径定位。3.6 常用命令速查表日常操作一览把上面涉及的以及日常用得最多的命令整理成一个速查表按场景分类场景命令示例核心作用目录导航cd -在最近两次目录之间跳转我写脚本时频繁用少打很多长路径文件查找find /data -name *.py按文件名或后缀查找配合-mtime、-size效果更好查看文件head -n 20 file/tail -f file头尾查看tail -f是实时跟踪日志的利器文本处理grep -r error /var/log/递归找关键词-i忽略大小写常配着用权限设置chmod 755 script.sh给脚本执行权限属主调整chown -R deploy:deploy /data/www修改文件属主和属组-R递归整个目录进程查看ps aux/top -Hp PID静态/动态查看进程后者看线程更专业端口状态ss -ltnp查看监听端口和对应进程日志跟踪journalctl -u nginx -fsystemd 托管服务日志-f实时跟踪资源占用free -h/df -h内存、磁盘一屏概览这个表不用背打印出来贴屏幕旁边用一两周就自然熟了。4. 文本处理与效率工具grep、sed、awk 的实战逻辑文件查找和服务器管理解决的是东西在哪的问题但真正让 Linux 物超所值的是文本处理三兄弟grep、sed、awk。这句话我经常对新人讲在 Linux 上工作一半时间在处理文本另一半时间在处理文本产生的数据。日志、配置文件、命令输出全是文本。4.1 grep不是只会 grep error 就行grep的几个常用变体grep是普通查找egrep或grep -E支持扩展正则grep -r递归目录查找grep -i忽略大小写grep -v反向匹配排除某关键词。但更实用的是组合用法比如grep -E ERROR|FATAL /var/log/nginx/error.log | grep -v favicon.ico这条命令的意思是找日志里的 ERROR 和 FATAL 行但排除 favicon.ico 相关的。中间用管道连接前一个grep的输出作为后一个的输入。这种管道链式处理方式是 Linux 命令行最有魅力的地方——不用写脚本就能快速过滤、归并数据。实际项目里我还经常用量词比如grep -E ^[0-9]{4}匹配以四位数字开头的行用于提取带年份的日志条目。4.2 sed流编辑器的三个核心场景sed常被说成是流编辑器听着挺玄用起来就三个高频场景一是替换文本。配置文件里把端口 8080 改成 9090sed -i s/8080/9090/g config.ini-i是直接改文件s/旧/新/g是全局替换。没有-i的时候sed 只把结果输出到终端不改原文件很多人第一次用都栽在这上面。二是删除行。删除配置文件里的注释行以#开头sed -i /^#/d config.ini三是按范围提取内容。比如提取从[database]到[cache]之间的内容sed -n /\[database\]/,/\[cache\]/p config.ini-n配合p的意思是不打印全部只打印匹配范围内的行。这三个场景覆盖了运维日常里 90% 的 sed 需求。4.3 awk默认按空格分列比想象中简单awk很多人一听就头疼其实最常用的只有列提取。它的默认行为是按空格或 Tab 把一行拆成多列然后$1、$2、$3分别代表第一、第二、第三列。最经典的是从df -h输出中提取磁盘使用率df -h | awk {print $5}输出每一行的第五列也就是磁盘使用百分比列。再加一个过滤条件只看使用率超过 80% 的分区df -h | awk $580df -h的表头Use%也会被一起打印出来可以用NR1跳过第一行NR是行号df -h | awk NR1 $580 {print 磁盘快满了:, $1, $5}这个组合实战价值极高。你以为这是编程不是这就是文本处理的思路。我再补充一个真实案例日志分析时从 Nginx 日志里提取每分钟请求数需要先取$4时间字段截取到分钟级别然后排序计数awk {print substr($4, 14, 5)} access.log | sort | uniq -c | tail -n 20substr($4, 14, 5)是取第 4 列字符串从第 14 个字符开始的 5 个字符刚好是09:45这种分钟格式。sort排序uniq -c去重并计数tail -n 20看最后 20 行。一条命令完成排查哪个分钟请求量异常的任务。4.4 管道思维一长串命令组合出魔法效果最后一定要讲管道。管道是 Linux 命令行的灵魂一台服务器上的日志几十 GB你不可能下载下来用 Excel 打开但你可以用管道一条命令顶别人手动排查半天。比如对访问日志按 IP 统计访问次数取前 10 名awk {print $1} access.log | sort | uniq -c | sort -rn | head -n 10这条命令的分解先把第一列 IP 全部打出来排序让相同 IP 相邻uniq -c统计每个 IP 出现的次数再按次数倒序排列最后取前十条。每段都简单组合起来就是一条非常有杀伤力的分析命令。这就是 Linux 命令行的范式不做大型程序而是像搭积木一样组合小工具。5. 网络诊断与系统资源从测试环境到线上问题网络和资源这块日常排障用到的高频命令其实不算多但每个都要能用得准、用得对。我把它们分成两组一组对外看连接网络诊断一组对内看资源CPU、内存、磁盘。5.1 网络连通性从 ping 到 curlping测网络通不通看网络延迟time值和丢包率。但ping不通不代表服务不可用可能是对方防火墙禁了 ICMP域名解析到别的 IP或者端口没开。telnet或nc测特定端口是否可达。比如telnet 10.0.0.5 3306能连上说明 MySQL 端口通连不上大概率是防火墙挡了。nc -zv 10.0.0.5 3306也是常见写法-z不发送数据只检测-v显示详细过程。curl测 HTTP 服务时最常用-I只看响应头、-s静默不显示进度条、-w可以自定义输出格式。之前帮人排查接口超时就是用curl -w 耗时: %{time_total}s\n URL看的完整耗时和各阶段时间。ss现代 Linux 中替代netstat查看端口和连接连接状态有LISTEN监听、ESTABLISHED已建立、TIME_WAIT主动断开后的等待状态等杂项。HTTP 层出现 502 Bad Gateway 的时候如果后端服务确实在跑ss -ltnp检查端口监听curl直接在后端本机试一次两步下来基本能摸清是中间件的问题还是后端没起来。5.2 CPU、内存、磁盘三个经典指标怎么看top一打开上半部分是系统概况下半部分是进程排行。系统概况重点看load average——过去 1 分钟、5 分钟、15 分钟的平均负载。很多人误把负载当 CPU 使用率其实负载是正在运行和等待运行的进程数负载大于 CPU 核数就说明在排队系统复杂度开始上来了。比如 8 核的机器 load average 超过 8就得注意了。内存方面free -h看的是总量和已用但更重要的是注意 Linux 的缓存机制。Linux 会把空闲内存作为文件缓存让读写更快。所以看free输出时真正可用的内存大约是available那一列而不是free那一列。很多人看到 free 只有几百 MB 就慌其实 available 还有好几 GB虚惊一场。磁盘方面df -h看分区用量du -sh *看当前目录下各文件/目录的大小。生产上磁盘空间突然满了比较快的定位方式df -h找到哪个分区满然后cd到对应挂载点du -sh * | sort -rh | head一层层往下看几分钟就能定位到大文件或大目录。sort -rh是按人类可读大小倒序排列比du加sort -n更直观。5.3 crontab定时任务的正确姿势提到系统资源顺便说一个和定时紧密相关的工具crontab。我见过太多脚本明明写好了就是不执行的例子基本都栽在两个地方。一是crontab执行时的环境变量和手动执行不同PATH可能没包含/usr/local/bin导致脚本里某些命令直接找不到。解决方法是脚本里尽量写绝对路径或者第一行写. /etc/profile让环境初始化一下。二是crontab的%要转义。%在 crontab 里是有特殊含义的表示换行、标准输入写日期比如$(date \%Y-\%m-\%d)时百分号必须加\。这个小细节我踩过不止一次。# 每天凌晨 3 点备份数据库注意 % 转义 0 3 * * * mysqldump -u root mydb | gzip /data/backup/db_$(date \%Y\%m\%d).sql.gz写完 crontab 之后用crontab -l查看是否生效然后用tail -f /var/log/cronCentOS或grep CRON /var/log/syslogUbuntu看有没有真正执行这是排查定时任务的三板斧。6. 常见问题与排查技巧实录这些年踩过的坑这部分是重点中的重点。前面讲的都是正常流程但真实项目里永远有意外。我把这些年实际遇到、帮人排查过的高频问题整理一下每个都给出了排查思路不是直接甩结论。6.1 钥匙开不了门Permission denied 的排查思路新人在服务器上部署代码最常见的报错就是Permission denied。这个错的原因就两类文件权限不足、文件属主不对。查看方法ls -l 目标文件 id 当前用户看你的用户名在不在文件的属主或属组里以及对应位的权限够不够。还有一种隐蔽情况文件权限正常但文件所在目录缺少 x 权限照样进不去。所以排查时要一层层往上看ls -ld /data /data/www /data/www/myapp每一层目录都要有合理的 x 权限。我自己处理过的一个案例是某团队收到静态资源 403检查半天发现文件是 644 权限属主也对问题出在/data/www这层目录权限是 755 中的其他人可读缺失。加好目录权限问题秒解。6.2 文件删不掉的一个经典场景进程占用rm -rf删文件提示Device or resource busy或者删了之后磁盘空间没释放。原因是文件正被进程打开。排查方式lsof | grep deleted这个命令会列出所有已被删除但仍被进程占用的文件。找到对应 PID 后处理方式有两种一是重启进程让系统释放文件描述符二是特殊情况比如删掉了日志文件但服务还在写不一定要想办法把已删除的文件恢复而是告诉服务的日志轮转机制让服务重新打开新的日志文件。运维里甚至有这样的场景线上环境快照太大某个进程占着删除的文件不放空间就是不见少最后靠重启容器解决因为容器里的主进程占用了大量日志句柄。看到deleted标记时别慌按这个思路处理就行。6.3 端口被占用到底是谁占了我的 8080启动服务提示Address already in use。排查ss -ltnp | grep 8080 # 或者 lsof -i :8080看到 PID 和进程名之后确认是不是自己之前启动的服务。如果是需要停掉的优先用常规方式kill PID不行再用kill -9 PID。这里有一条重要经验不要盲杀。我曾见过有人把ss输出里的 PID 看错把别的服务的进程给杀了事故现场眼泪都来不及掉。先ps -fp PID看一眼进程的全貌再动手费用只有 0.1 秒。6.4 磁盘突然满了大文件定位技巧磁盘告警是最常见的线上告警之一。排查效率最高的路径df -h du -sh /var/log/* | sort -rh | head du -sh /data/* | sort -rh | head日志目录是重灾区。journalctl的日志systemd 日志默认不会无限增长但有的系统配置了老的日志一直不清理。快速释放空间可以用journalctl --vacuum-size200M把 systemd 日志压缩到 200M 以内。如果是 Nginx 或 Tomcat 日志疯长要找具体日志文件再用truncate -s 0 /var/log/nginx/access.log而不是直接rm——直接删文件会导致进程还握着旧文件句柄空间照样不释放。这也是为什么很多人删了日志文件空间没变的谜团所在。6.5 命令敲了半天没反应终端假死还是系统真卡碰到命令输不进去、按回车没反应先确认终端本身活着没有。按一下CtrlC取消当前任务如果可以回到提示符说明只是某个命令卡住了。如果完全没反应可能是终端窗口在远程连接下卡住了退出重连试试。如果是系统级负载过高导致整体卡顿uptime看 load average 是不是超出 CPU 核心数很多。如果可以执行命令用top -b -n 1非交互模式抓一次快照看 CPU 时间占比最大的进程排查是业务进程冲上去了还是挖矿木马之类把服务器资源耗尽了。top -b -n 1的意思是一次性批量输出 top 的结果适合后续处理这些数据不用开交互界面干瞪眼。6.6 常见问题速查表现象可能原因优先排查命令Permission denied权限/属主不对ls -l、idAddress already in use端口被占用ss -ltnp、lsof -i :端口删了文件空间没释放进程占用文件句柄lsof磁盘满告警日志/大文件堆积df -h、du -sh * 一层层看服务起不来端口冲突、磁盘满、依赖缺失前四层检查法对照组定时任务不执行环境变量、% 转义、权限crontab -l、/var/log/cron系统卡顿负载过高、资源耗尽uptime、top -b -n 1命令找不到PATH 变量不完整which 命令、echo $PATH中文乱码系统没装中文字体或 localelocale、cat /etc/locale.conf7. 写给新手和高手的几点心得说了这么多最后真心实意聊几句。第一Linux 不用背命令。你只需要把最核心的几十个命令弄明白剩下的交给man和--help。我工作这些年绝大部分命令都是边查边用最后用熟了的才记住。遇到没见过的命令先man一下看看它到底是做什么的比瞎猜效率高十倍。第二养成用 Linux 写笔记和做日常任务的习惯。我自己从最开始的Windows 打天下到后来慢慢习惯在 Linux 下跑开发服务、写脚本处理日志、甚至直接用 Vim 写文件这个过渡有很大帮助。真正常用的命令和习惯不用刻意背顺手之后就内化了。第三给自己造轮子。比如我后来把自己的所有笔记都放进一个自建的~/notes目录用find、grep、awk快速检索配合vim写笔记效率极高。用grep -r 关键词 ~/notes找到自己半年前写的一段笔记这种检索体验一旦用过就回不去了。我还想针对现在的新手多补一句别被Linux 很难的刻板印象吓住。它和 Windows、macOS 一样只是一个操作系统。把它当工作台而不是考试题遇到问题就查、就试、就记录积累一两个月你会发现自己已经能独立处理很多曾经一脸懵的场景。最后再分享一个小技巧把history命令的输出和grep组合起来。history | grep ssh能快速找回你两周前用过的 ssh 登录命令。history记得配合!操作符使用比如!123重新执行历史记录里第 123 条命令!!重复执行上一条命令。这些是最低成本、最高回报的小技巧就像电灯开关一样你知道它在哪日常就顺了。Linux 这条路并不拥挤因为放弃的人远比坚持下来的人多。这篇笔记是我多年填坑后的纯手动摘要没有工具、没有捷径、没有三分钟精通有的只是从真实环境里磨出来的可复现经验。你把它存下来遇到问题翻一翻会比收藏夹里吃灰的一百篇教程更有用。
返回列表