ARTICLE DETAIL

资讯详情

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

Linux终端命令实战:权限、管道与故障排查的工程逻辑

Linux终端命令实战:权限、管道与故障排查的工程逻辑 1. 别急着背命令先看清终端的三层结构我至今记得第一次在生产机器上敲删除命令时手心冒汗的感觉那时候我还搞不清通配符到底匹配了哪几个文件。多年下来Linux 终端命令对我来说早就不是一份背下来的清单而是一套可以组合、可以推理、可以审计的操作语言。这篇内容不打算做成命令大全式的罗列因为那种清单随手一搜到处都是我想聊的是这些命令背后的判断逻辑什么时候该用查找而不是遍历、删除之前应该做哪一步确认、权限报错该从哪个方向切进去、装系统卡住时日志该看哪一段、DNS 改了不生效到底是谁在覆盖配置。如果你是完全的新手看完能少踩一堆坑如果你已经用了几年也许能在权限模型、管道组合、故障排查的思路上补上几块拼图。1.1 终端、Shell 和命令各自负责什么很多人把这三个东西混着叫结果在排查问题时方向就歪了。终端terminal emulator是那个窗口负责画字符、收键盘gnome-terminal、konsole、iTerm2、Windows Terminal 都属于这一类Shell 是躲在窗口后面解析你输入的那层bash、zsh、fish、dash 都是常见选择而你敲的ls、grep、systemctl其实是独立的小程序放在/usr/bin、/bin这些目录里。为什么要分清这三层因为同样一条命令报错原因可能完全不同。提示command not found是 Shell 没在 PATH 里找到这个程序提示syntax error near unexpected token是 Shell 解析你的语法就失败了程序压根没启动而程序输出一段它自己的错误信息才是命令本身执行出了问题。搞清楚错误发生在哪一层排查范围立刻缩小一大半。还有一点值得提终端和你实际操作的机器不一定是同一台。SSH 连过去、在虚拟机里打开控制台、用容器 exec 进去看到的都是终端在本机、Shell 和命令在远端。这也解释了一个常见困惑——为什么在本地图形界面点一下就好的操作在终端里要找半天路径。1.2 图形界面替代不了命令行的四个理由先说批量。图形界面擅长处理一次一个的任务命令行擅长处理一次一千个。给两百个用户批量改密码、把三个月前的日志全清掉、统计一万行访问日志里访问量最高的 IP图形工具要么做不到要么要装额外的软件。再说可复现。你在终端里敲的每一步都可以写进脚本、存进版本库、交给下一个人原样跑一遍。图形界面的操作步骤只能靠截图和文字描述隔两周自己都记不清点过哪些开关。这一点在国产化替代、信创环境迁移过程中特别明显从一个发行版换到另一个发行版图形工具的菜单路径全变了但命令还是那几条。第三是远程与轻量。服务器通常不装桌面环境一台 1 核 1G 的小机器跑图形界面本身就吃力命令行几百毫秒就能连上去干活。最后是审计与自动化命令有历史记录、有退出码、有日志可以被程序调用这是图形界面很难提供的。注意不要因为命令行看起来高级就排斥图形工具。磁盘分区、KVM 虚拟机管理、复杂的网络配置图形工具反而更直观、更不容易填错参数。工具没有高低只有合不合适。2. 一条命令的解剖选项、管道与重定向2.1 命令由哪几块拼起来拿ls -lh /var/log举例ls是程序名-lh是选项短选项可以合并等价于-l -h/var/log是参数。-h在这里是 human-readable把字节数变成 K、M、G长选项写法是--human-readable可读性更好写在脚本里不容易被误读。几个新手容易忽略的细节。第一选项顺序通常不影响结果但一旦遇到--这个符号后面所有内容都会被当成参数而不是选项所以处理以横线开头的文件名时可以写rm -- -weird-name.txt。第二参数里带空格必须加引号cd My Documents会被当成两个参数正确的是cd My Documents。第三单引号和双引号有区别双引号里的变量会被展开单引号里原样保留处理包含$的字符串时要格外小心。还有一个隐藏角色是退出码。每条命令跑完都会返回一个数字0 表示成功非 0 表示失败。终端里用echo $?能立刻看到上一条命令的结果。这个习惯看起来多余但写脚本、做定时任务、串联命令时判断逻辑全靠它。2.2 管道把一堆小工具串成流水线Unix 的设计哲学是每个工具只做一件事然后靠管道把它们的输出接起来。想统计某台服务器访问日志里访问量最高的十个 IP可以这样写awk {print $1} access.log | sort | uniq -c | sort -nr | head -n 10拆开看awk {print $1}把每行第一列也就是 IP取出来sort先排序因为uniq -c只能统计相邻的重复行uniq -c把连续重复行合并并计数sort -nr按数字倒序排head -n 10取前十。五个工具各管一段组合起来就是一条完整的数据处理链。这种思路的价值在于你不需要写一个日志分析程序只要把现成的零件拼起来就行。而且每段都能单独跑、单独验证。我调试这类管道有个固定习惯先跑前两段看中间结果对不对再加后面的。直接写完一整条再运行出了问题只能靠猜。管道的另一个变体是xargs用来把标准输出变成后面命令的参数比如find . -name *.tmp | xargs rm -f。不过xargs遇到带空格的文件名会拆错稳妥写法是加上-print0和-0配对使用。2.3 重定向标准输出和标准错误是两条线很多人第一次被坑是执行了一条会报错的命令想保存结果却发现文件是空的。原因在于命令默认有两条输出通道标准输出文件描述符 1和标准错误文件描述符 2。只重定向前者报错信息还是打到屏幕上。command out.log 2 err.log # 分开存 command all.log 21 # 合并存 command all.log # 简写仅 bash 等支持 command /dev/null 21 # 全部丢掉是追加是覆盖写错一个符号就可能把重要日志清零。tee是个有用的补充command | tee out.log能在屏幕上看到输出的同时写一份到文件做部署脚本时经常用。至于/dev/null它是个黑洞设备写进去的东西直接丢弃适合用来静默那些无关紧要的输出。注意在命令开始执行前就会打开并清空目标文件。所以sort bigfile bigfile会把源文件清掉再排序结果什么都没了。这种情况要先写到临时文件再替换。2.4 命令找不到时先看 PATHcommand not found不一定是没装也可能是装了但不在 PATH 里。用echo $PATH看看当前的搜索路径用which nginx、type nginx、command -v nginx定位实际用的是哪个可执行文件——三者有细微差别type能告诉你这是别名、函数还是外部程序which有时反而看不全。如果确实是路径问题临时生效可以export PATH$PATH:/opt/app/bin要长期生效就写进~/.bashrc或~/.zshrc。改完后记得重新加载或者执行hash -r清掉 Shell 的命令缓存。我自己遇到过最迷惑的一次是已经确认/usr/local/bin里有新装的工具但敲名字还是报找不到最后发现是 Shell 缓存了老路径hash -r一下就好了。如果是编译安装的程序放在自定义目录建议不要直接覆盖/usr/bin下的同名文件而是统一放到/usr/local/bin或/opt/xxx/bin再通过 PATH 或软链接暴露出来卸载和升级都干净。3. 查找与删除事故率最高的两个动作3.1 find 的表达式本质是逻辑组合find的语法结构是路径 条件 动作。条件不写就匹配全部动作不写就默认打印出来。常见的条件包括按名称、按时间、按大小、按类型、按权限。下面这条命令找出/data下七天前修改、且大于 100M 的日志文件find /data -type f -name *.log -mtime 7 -size 100M -print这里有几个容易记错的点。-mtime 7表示修改时间超过 7 个 24 小时-size 100M里的 M 是大写小写 m 是块单位差着一个数量级的坑多个条件默认是与关系要写或就用-o并加括号括号在 Shell 里有特殊含义需要转义或加引号。动作部分-print是打印-delete是删除-exec是执行外部命令find /tmp -type f -name *.tmp -exec rm -f {} \; find /tmp -type f -name *.tmp -exec rm -f {} {}代表匹配到的文件名\;是逐个执行是批量拼接后一次执行。文件多的时候快得多因为它避免了每匹配一个文件就启动一个新进程。新手常犯的错是忘了结尾那个分号命令会一直等输入看着像卡死。实测下来我更喜欢把查找结果先输出到文件检查一遍再执行操作find /data -type f -name *.log -mtime 7 /tmp/to_delete.txt wc -l /tmp/to_delete.txt head /tmp/to_delete.txt多花十秒能省掉一次通宵。3.2 删除之前必须做的三次确认rm本身没有回收站删了就是删了。我给自己定了三个动作第一先用ls把通配符展开看一眼确认匹配范围符合预期第二把待删列表写进文件数一遍数量跟心里预估的对一下第三才执行删除。最容易翻车的是变量为空的场景。脚本里写rm -rf $DIR/如果DIR因为某种原因没被赋值就变成rm -rf /这是能毁掉整台机器级别的错误。防御写法是加参数检查和引号set -euo pipefail : ${DIR:?DIR is not set} rm -rf -- ${DIR:?}/*set -u让未定义变量直接报错退出${VAR:?}是显式检查--防止后面的内容被当成选项。这几行看着啰嗦但写进脚本就是保命符。对于确实需要定期清理的场景我更倾向于先移动再删除把待清理文件mv到一个带时间戳的临时目录观察一周确认没人用再整体删掉。空间紧张时至少要保证关键目录在动手前做过备份或快照。删除前顺手用lsof查一下有没有进程正在占用这些文件避免删掉后进程还在写、磁盘空间却不释放的怪现象。3.3 解压和文件名乱码先判断编码再动手压缩包处理是日常高频操作先记清楚不同格式的工具格式常用命令说明.tar.gz / .tgztar -zxvf a.tar.gz最常用查看列表加-t.tar.bz2tar -jxvf a.tar.bz2压缩比高速度慢.tar.xztar -Jxvf a.tar.xz压缩比最高解压耗 CPU.zipunzip a.zip注意编码问题.7z7z x a.7z需装 p7zip 或 7zip 包.rarunrar x a.rar部分发行版默认不带文件名乱码是最常见的投诉。根本原因是打包端用 GBK 存文件名解压端按 UTF-8 解读于是出现一堆问号和方块。处理思路是让解压工具按正确编码解析或者解压后批量改名unzip -O CP936 a.zip -d ./out # 部分 unzip 版本支持 -O 7z x a.zip -mcp936 -o./out # 7z 指定代码页 convmv -f gbk -t utf8 -r --notest ./out # 批量转换文件名convmv一定要先不加--notest跑一遍看预览确认转换方向没搞反再真执行否则可能把本来正常的名字改成乱码。tar 包出现乱码时情况更麻烦一些思路是先解压拿到文件内容内容通常不受影响再用convmv处理文件名或者借助能指定编码的工具重新打包。如果手头有原始打包环境的信息最好直接在打包侧改成 UTF-8从源头解决。另外一个常被忽略的点中文文件名在跨系统传输时容易出问题脚本、配置、自动化流程里尽量用英文名人看得懂、机器也不出错。提示解压前先df -h看一下目标分区剩余空间尤其是几十 G 的大包。解压到一半空间不足留下个残缺目录清理起来更费劲。4. 用户、用户组与权限所有 Permission denied 的源头4.1 建用户不是敲一条命令就完事useradd和adduser的区别值得说清楚。useradd是底层命令默认不建家目录、不给登录 Shell参数不带就得到一个半成品用户adduser是发行版提供的友好封装会交互式问密码、建家目录、复制骨架文件。生产环境脚本里我更常用useradd加明确参数可控性更强useradd -m -d /home/deploy -s /bin/bash -G docker,www-data deploy passwd deploy id deploy-m建家目录-d指定路径-s指定 Shell-G加入附加组。注意-G是附加组会覆盖已有的附加组列表正确姿势是用usermod -aG追加-a这个参数漏掉就会把用户从其他组里踢出去这个坑我踩过不止一次。删除用户时userdel只删账号不删家目录userdel -r会连家目录一起删。如果这个人还有定时任务、还有在跑的进程直接删会留下孤儿进程和残留文件。稳妥流程是先pgrep -u 用户名确认没有活跃进程把家目录打包归档再删账号最后清理/etc/cron.d和sudoers里的残留条目。4.2 权限位、umask 和几个特殊位Linux 权限由三组 rwx 组成分别对应属主、属组、其他人数字表示是 r4、w2、x1。chmod 755表示属主读写执行、其他人读和执行。文件默认权限是 666没有 x目录默认 777但实际创建出来不是这个值因为umask会做减法。umask # 默认常见 022 umask 027 # 收紧组内只读其他人无权限umask 022下文件是 666-022644目录是 777-022755。多人协作的服务器上把 umask 设成 027 更稳妥避免同组之外的账号读到业务文件。这个设置可以写进/etc/profile或用户的~/.bashrc注意只对登录 Shell 生效服务进程还受 systemd 单元配置影响。chown -R是另一个高危险动作。递归改属主看着方便一旦路径写错可能把系统目录的属主全改了机器直接起不来。我的习惯是先用find 路径 ! -user 目标用户 | head看看影响范围甚至先用--from限定原属主chown -R --fromolduser:oldgroup newuser:newgroup /data/app特殊权限位里sticky bit 最常见/tmp就是 1777任何人都能写但只能删自己的文件。SUID 和 SGID 涉及以文件属主身份运行是安全审计的重点用find / -perm -4000 -type f 2/dev/null可以列出系统里所有 SUID 程序定期看一眼有没有多出陌生的东西。4.3 sudo 和权限提升的正确姿势日常运维里从普通用户切到管理员权限执行维护操作是家常便饭正规做法只有一条走sudo并留下审计记录而不是共享 root 密码、更不是去找系统的漏洞。配置入口是visudo它会做语法检查千万别直接用编辑器打开sudoers一个语法错误可能导致所有人都用不了 sudo。# 允许 deploy 组免密重启应用服务 %deploy ALL(root) NOPASSWD: /bin/systemctl restart myapp原则是最小授权能只给一条命令就不给整组能用通配符限制子命令就别放开全部。NOPASSWD用起来爽但等于把这条命令的所有权交出去了只适合那种本身就没破坏力的操作。所有 sudo 操作都会记进/var/log/secureRedHat 系或通过journalctl查到出问题时这是最可靠的追溯线索。企业环境里安全扫描工具、基线检查脚本通常会重点核对 sudo 配置、SUID 文件、空密码账号这几项提前按规范整理好比事后被通报再补要轻松得多。5. 装系统这件事镜像、虚拟机与第一公里网络5.1 虚拟机安装 Linux 的完整流程与卡点先确认宿主机的 CPU 虚拟化已开启Intel 平台对应 VT-xAMD 平台对应 AMD-V在 BIOS 里打开后重启生效。这一步没做虚拟机可能跑得极慢甚至启动失败。然后用虚拟化软件VirtualBox、VMware、KVM、Hyper-V 都行新建虚拟机内存至少给 2G桌面版建议 4G磁盘 40G 起步选动态分配。镜像下载完成后一定做一次校验sha256sum ubuntu-24.04.iso把结果和官网公布的哈希值比对不一致说明下载损坏或被篡改别硬装后面各种莫名其妙的报错都是从这来的。分区方案上新手直接选自动分区最省事但要注意它有时会默认使用 LVM后续调整分区会多一层操作熟悉之后可以手动分出/、/home、/boot、swap把数据和使用系统分开重装时方便保留。安装过程卡住的常见原因一是显卡驱动不兼容导致黑屏或花屏可以在启动参数里加nomodeset绕过二是内存给太小安装程序直接崩三是宿主机的 Hyper-V 和 VirtualBox 冲突需要按顺序调整功能开关。装完第一件事是打快照此时系统最干净出问题秒回滚比事后修系统快得多。如果是嵌入式方向安装流程又有区别一般是先在虚拟机里搭好交叉编译环境再把编译产物通过网口、串口或烧录工具部署到开发板宿主机的发行版和交叉工具链版本要匹配好这是另一条专门的技术线值得单独拆开说。5.2 装完系统的第一公里网络与 DNSip a看网卡有没有拿到地址没有地址先查虚拟机的网络模式。NAT 模式方便上网但外部访问不进来桥接模式能让虚拟机像独立设备一样加入局域网主机模式适合做纯内部实验。配置静态地址用nmcli比较规范nmcli con show nmcli con mod ens33 ipv4.addresses 192.168.1.50/24 nmcli con mod ens33 ipv4.gateway 192.168.1.1 nmcli con mod ens33 ipv4.dns 223.5.5.5 8.8.8.8 nmcli con mod ens33 ipv4.method manual nmcli con up ens33DNS 配置出问题是最让人抓狂的一类故障因为现象往往很迷惑能 ping 通 IP但域名解析不了浏览器打不开网页。排查顺序我固定按这个走。第一步cat /etc/resolv.conf看当前的 DNS 服务器是谁如果里面是127.0.0.53说明系统用了本地缓存解析服务真正配置在别处第二步resolvectl status看实际生效的 DNS第三步确认配置有没有被 NetworkManager 覆盖——直接手改/etc/resolv.conf在启用 NetworkManager 的系统上经常重启就失效正解是通过nmcli改连接配置或者在/etc/systemd/resolved.conf里配DNS后重启服务第四步再测解析nslookup www.example.com dig 223.5.5.5 www.example.com short systemd-resolve --flush-caches # 刷新缓存还有一个容易被忽略的细节/etc/hosts的优先级高于 DNS如果之前为图省事在里面写死过某条记录改了 DNS 也不生效记得回头检查。5.3 用 iperf3 测真实带宽别靠感觉网络慢的时候先量数据再下结论。iperf3 是最常用的带宽测试工具服务端和客户端各装一份# 服务端 iperf3 -s # 客户端默认单线程测 TCP iperf3 -c 192.168.1.50 -t 30 # 四线程并发模拟多连接场景 iperf3 -c 192.168.1.50 -P 4 -t 30 # 反向测试测下行 iperf3 -c 192.168.1.50 -R # UDP 模式关注丢包和抖动 iperf3 -c 192.168.1.50 -u -b 100M单线程测出来的数字经常远低于网卡标称值这不一定是网络有问题可能是单条 TCP 连接受窗口大小和延迟限制。多线程并发才能看出链路真实吞吐。UDP 模式适合评估语音、视频这类实时业务的链路质量重点看 jitter 和丢包率而不是带宽数字。测试时有两点要留意防火墙要放行 5201 端口否则连接被拒测试本身会占用大量带宽别在生产业务高峰期跑。跨公网测试时两端中间的任何一跳都可能成为瓶颈所以测出来的数字要结合路径来看不能简单当成网络不行的证据。6. 排查现场进程、磁盘与网络6.1 进程查看与安全终止ps aux和ps -ef是最基础的两条前者 BSD 风格后者 System V 风格输出字段略有不同但信息一样。真正干活时我更常用top或htop实时看按 CPU、内存排序快速定位吃资源的进程。要找特定进程pgrep -a 进程名比ps | grep干净不会把自己这条 grep 也匹配进去。终止进程要先温和后强硬。kill 15SIGTERM是请求进程自行退出程序有机会保存数据、关闭连接、清理临时文件等待几秒没反应再上kill -9SIGKILL这是内核直接强杀进程没有任何保存机会。生产环境上来就-9的习惯很危险数据库、消息队列这类程序被强杀后可能留下不一致状态甚至需要重建数据。想搞清楚某个进程到底打开了哪些文件、连了哪些端口lsof -p 进程号一次给你答案。有时候会发现进程占着几个已经删掉的文件这正是下一节要讲的磁盘怪现象。6.2 磁盘空间去哪了df -h看分区使用率du -sh *逐层看目录大小配合排序找大头du -sh /var/* 2/dev/null | sort -h ncdu /var # 交互式浏览推荐经典难题是df显示磁盘满了du却怎么也算不出那么多空间。八成是文件被删了但还被进程占用文件在目录里已经不可见但进程的文件描述符还指着它空间自然不释放。用下面这条命令抓出来lsof L1 | head -20 lsof | grep deleted确认后重启对应服务最直接或者找到进程号用 /proc/PID/fd/N清空要非常小心写错进程可能引发故障。另一个常见原因是日志文件被写爆检查/var/log并配置 logrotate 策略比事后清理靠谱得多。inode 用尽也会报空间不足df -i一看就知道这种通常是大量小文件造成的。6.3 网络不通的分层排查顺序排查网络问题最忌乱猜按层次来最快。第一层看接口ip a确认网卡 up 且有 IP。第二层测链路ping 网关不通就是本地网络配置问题。第三层测出口ping 8.8.8.8或运营商 DNS 地址通了说明路由正常。第四层测解析nslookup 域名这一步失败基本锁定 DNS 配置。第五层测端口ss -tulnp | grep 端口看服务有没有监听、监听在哪个地址上接着用nc -zv 目标IP 端口或curl -v http://目标:端口从外部验证。ss已经基本取代了netstat速度快、信息全加-p需要 root 才能看到进程名。curl -v是排查 HTTP 问题的利器能从 DNS 解析、TCP 握手、TLS 协商一路看到响应头比在浏览器里反复刷新效率高得多。服务层面的问题就去看日志journalctl -u 服务名 -n 100 --no-pager能快速看到最近一百行加-f实时跟踪。日志里的时间戳还能和date对比如果服务器时间误差过大TLS 证书校验、日志关联、分布式系统的心跳都可能出问题记得配上时间同步。7. 让终端顺手起来工具链与自动化7.1 别名、历史和 zsh 的取舍Shell 用久了效率差距主要体现在细节上。alias能省下大量重复输入把几个常用组合固化下来alias llls -alh --colorauto alias dfhdf -h alias portsss -tulnp alias grepgrep --colorauto历史记录是另一个被低估的功能CtrlR反向搜索、history | grep 关键词、!!重复上一条命令、!$引用上一条命令的最后一个参数熟练之后敲键盘的次数能少一半。历史记录默认存在~/.bash_history多台机器同步、加时间戳、记录更多条数都可以通过环境变量配置。zsh 加 oh-my-zsh 是很多人提升体验的选择自动补全和主题确实好看。安装方式有两种脚本一键安装或手动克隆仓库网络环境不好的时候建议手动方式先克隆再执行安装脚本避免卡在半路留下一个残缺的配置。要注意的是插件装太多会明显拖慢新开终端的速度我一般只留自动补全、语法高亮和目录跳转三四个。tmux解决的是另一个问题SSH 断开后任务还在跑。开会话、断线重连、分屏这三件事用熟了基本离不开。7.2 从手动敲到脚本重复三次就该写下来我的经验法则是同一条命令组合如果一周内敲到第三次就值得写成脚本。脚本骨架建议固定成这样#!/usr/bin/env bash set -euo pipefail IFS$\n\t LOG_FILE/var/log/myjob.log log() { echo [$(date %F %T)] $* | tee -a $LOG_FILE; } : ${TARGET_DIR:?TARGET_DIR is required} log start cleaning ${TARGET_DIR}set -euo pipefail三个开关分别处理命令失败即退出未定义变量报错管道中任一环失败都算失败能挡掉绝大多数静默错误。所有关键步骤都写日志并带时间戳出问题时不用靠回忆。加锁防止重复执行也是常见需求用flock或者mkdir原子性做一个简单的锁文件即可。任务调度上简单的周期任务用cron就够但 cron 的环境变量和登录 Shell 不一样脚本里最好用绝对路径、显式设置 PATH。对时间精度和依赖管理要求高的用 systemd timer 更现代可以配置失败重试、依赖关系、日志统一进 journald。至于系统级备份思路和文件操作是一回事先确定要备什么配置、数据、还是整盘快照再确定恢复目标换盘重装还是原地还原最后定期演练一次恢复流程。备份没验证过等于没备。8. 常见问题速查表与避坑经验8.1 高频问题速查现象常见原因排查与处理命令报 command not found未安装或不在 PATHwhich/command -v定位检查$PATHhash -rPermission denied权限或属主不对ls -l看权限、id看身份、namei -l 路径逐层查能 ping IP 不能解析域名DNS 配置或缓存cat /etc/resolv.conf、resolvectl status、检查/etc/hosts磁盘满但 du 算不出来文件已删仍被进程占用lsof L1重启服务或清理 fd解压后文件名乱码打包端 GBK解压端 UTF-8unzip -O CP936、7z -mcp936、convmv批量改名脚本手动跑正常定时跑失败环境变量和路径不同用绝对路径脚本内显式设 PATH看 cron 日志虚拟机装完上不了网网络模式或网卡名不对ip a看状态nmcli con show核对连接配置删掉服务后端口仍被占进程未退出或残留ss -tulnp找进程kill 15优雅退出子系统环境提示版本过旧运行环境需要升级按官方提示执行更新命令后重启终端服务器时间越跑越偏未配置时间同步检查同步服务状态配置内网时间源8.2 几条我用代价换来的经验第一条改配置之前先备份。cp nginx.conf nginx.conf.bak.$(date %F)这一行命令救回过我无数次。尤其是改/etc/fstab、/etc/sudoers、网络配置这三类文件改错可能导致机器连不上、进不去有备份至少能通过单用户模式恢复。第二条在能复现的环境里练手。需要练删除、练分区、练网络配置就在虚拟机快照里练别拿生产机器当试验田。快照功能存在的意义就是让你敢于折腾用完回滚零成本。第三条不要迷信一键脚本。网上抄来的安装脚本、优化脚本跑之前至少从头到尾读一遍看它改了哪些文件、加了哪些源、开了哪些端口。我见过因为脚本改了系统源和 DNS 配置导致后续所有软件安装都变慢的案例。第四条记录比记忆可靠。每台机器的网络参数、账号用途、特殊配置都往一个文档里写。三个月后回来维护能省掉大量逆向猜测的时间。文档不用多正式一个 Markdown 文件、一份表格就够了。最后说个个人习惯。我在每台新装好的机器上做的第一件事不是装软件而是敲一遍ip a、df -h、free -h、systemctl status把正常状态记下来。这样以后出问题时一眼就能看出哪项指标偏离了基线。终端命令真正的价值从来不是背了多少条而是你知道在什么情况下该敲哪一条、敲完该怎么看结果、看到异常该往哪个方向继续挖。
返回列表