多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Linux常用命令实战:文件操作、系统排查与网络诊断

Linux常用命令实战:文件操作、系统排查与网络诊断 你有没有过这种经历刚接触 Linux 时面对黑乎乎的终端窗口脑子里一片空白只能一个命令一个命令地查查完还会发现网上说法五花八门照着敲还报了错。就算是有几年经验的开发者换到不熟悉的发行版或者碰到容器、国产系统这类环境也经常会被一些“常用命令”卡住。我这些年维护服务器、搭测试环境、给团队做培训踩过不少坑也总结出一条经验Linux 命令不在于背得多而在于把最核心的高频命令用透。这篇内容我从日常实操角度出发把文件操作、文本处理、用户权限、系统排查、网络诊断这些真正天天用的命令整理出来每个命令都会讲清楚“为什么这么用”和“实际会踩什么坑”希望能给正在学 Linux、准备面试或者工作中要用它解决问题的朋友一些参考。1. 内容整体设计与思路拆解1.1 为什么说“常用命令”背后是一套逻辑很多人学命令习惯对着“Linux 命令大全”从头背到尾今天背明天忘真到用的时候还是不会。我自己带过不少新人发现凡是能很快上手的人都不是靠死记硬背而是先理解了命令的构成逻辑。Linux 命令的基本格式就三部分命令、选项、参数。比如ls -lh /var/logls是命令本体-lh是选项-l表示长格式、-h表示人类可读/var/log是操作对象。这个结构几乎适用于所有命令理解了它你见到一个陌生命令都不会慌先man 命令名看帮助再命令名 --help看选项基本就能用起来。还有一个特别容易被忽略的底层概念PATH 环境变量。你在终端里敲date能执行不是因为你当前目录有个叫 date 的文件而是 shell 会按照 PATH 变量里记录的路径一个一个去找。之前有个同事装了个软件怎么敲都提示command not found折腾半天发现是安装目录没加进 PATH。这个问题在自定义安装软件、自己编译源码时特别常见。1.2 怎样构建自己的命令知识体系与其追求“不重不漏地学 1000 个命令”不如把命令按使用场景归类。我给自己和团队做培训时通常分成几个模块文件与目录操作、文本处理、用户与权限、软件包管理、进程与服务、网络诊断、系统资源查看。每个模块掌握 10 个左右高频命令日常工作就够用了。比如文件操作就绕不开ls、cd、cp、mv、rm、mkdir、tar文本处理就是grep、sed、awk、sort、uniq、wc网络诊断则是ping、telnet、curl、ss、netstat、iptables。按照这个思路去学你会发现很多命令之间有很强的关联性像ps查出来的进程号接下去就是kill或top去处理形成一条完整的操作链。这套思路放到国产系统、容器环境里也一样成立。最近帮客户维护过几台基于国产化系统的服务器虽然包管理器变成了yum或dnf但系统设计理念、目录结构、常用命令和主流 Linux 发行版基本保持一致之前积累的命令经验可以直接迁过去。这也是我写这篇文章的出发点底层的分析思路比命令本身更值钱。2. 文件操作与文本处理绝大多数业务场景都踩在这里2.1 文件与目录操作先学会保护自己文件操作是所有命令里使用频率最高的但也是误操作重灾区。我见过有人想把某个目录下的日志清空结果rm -rf /var/log/*少打了一个斜杠变成删除/log目录整个环境直接崩掉。所以我对新手一直强调能不裸用rm就尽量不要裸用。这里分享几个实际环境里很稳的习惯删除前先用ls -l确认路径再用find把要删的文件列出来。能用mv把文件移动到临时目录就不要急着rm等确认没问题再清。重要操作加上-i参数如rm -i会逐条确认虽然麻烦但能救命。创建目录时mkdir -p a/b/c这个-p参数很关键父目录不存在时会一并创建。如果不加在脚本里连续创建多级目录就会报错这也是很多自动化脚本运行失败的常见原因。复制和移动文件时cp -r和scp -r用于递归复制目录rsync比cp更适合大目录或增量同步。我之前同步一个几 GB 的应用目录用cp每次都全量复制慢得要命换成rsync -avz --progress以后增量同步速度提升了不止一个量级。2.2 文本处理三兄弟grep、sed、awk日志分析、配置修改、批量处理全都要靠文本处理命令。这三个命令我放在一起讲因为它们是排查问题时的黄金组合。grep用于筛选。日常用得最多的组合是grep -E扩展正则、grep -v排除、grep -A/-B显示匹配行的后几行/前几行。比如排查接口报错只搜 ERROR 关键字还不够经常要连带上文grep -B 5 ERROR app.log能直接把异常前的堆栈上下文拉出来定位问题会快很多。sed用于流式编辑。最常用的两个场景一是替换sed -i s/旧内容/新内容/g 文件二是按行处理比如删除前 5 行sed -i 1,5d 文件。这里有个特别容易踩的坑在 Mac 上sed -i必须带一个参数比如sed -i 否则会报错。我在 macOS 和 Linux 之间切换时这个细节折腾过我两三次。awk则适合做列处理和统计。比如查看磁盘空间时只看利用率列df -h | awk NR1 {print $5, $6}按 CPU 使用率列出 Top 进程也会用ps aux | awk配合sort完成。很多面试题也会考awk的字段处理其实只要理解默认按空格分割、$1、$2分别代表第几列就能应对大部分场景。2.3 解压乱码与编码问题遇到一次就忘不掉热搜词里有个“linux 解压文件乱码”这个问题我处理过太多次了尤其是从 Windows 那边传过来的 zip 包。原因在于Windows 下压缩工具默认用 GBK/GB18030 编码Linux 系统默认用 UTF-8解压时文件名里的中文字节解析不出来就变成乱码。解决办法有两个方向。第一个方向如果用的是unzip新版支持-O参数指定编码unzip -O GBK file.zip。但这个参数在老版本里并不存在我在 CentOS 7 上就遇到过不支持的情况这时候就得换第二个方案。第二个方向用unar或7z这类自动识别编码的工具。unar会自动检测压缩包内文件名编码基本能无脑解压。如果压缩包特别多还可以用convmv批量转换文件名convmv -f GBK -t UTF-8 --notest *。另外那个“linux 输入法”问题本质也是编码和桌面环境配置的问题。Fcitx 或 IBus 框架下环境变量GTK_IM_MODULE、QT_IM_MODULE设置不正确输入法就起不来。排查思路是先echo $GTK_IM_MODULE看环境变量再确认输入法框架软件包是否安装完整最后检查桌面自启动项里是否加载了输入法进程。2.4 文件查找技巧find 与 locate 的取舍查找文件是高频需求。find功能强大但稍慢因为它实时扫描磁盘locate基于数据库快但会有延迟。日常排查时我习惯先用locate快速定位再用find精确确认。find的常见组合包括按文件名find /data -name *.log按时间find /data -mtime -7按大小find /data -size 100M。配合-exec还能直接对结果做操作比如清掉 7 天前的临时文件find /tmp -type f -mtime 7 -exec rm {} \;。这里要注意{}和\;的写法很多新手第一次用都会漏掉反斜杠。3. 用户权限与软件包管理搞不定这两个系统就是裸奔状态3.1 创建用户与切换权限从 useradd 到 sudo创建用户是 Linux 系统管理的基础操作但很多人一上来就踩坑。最简单的创建命令是useradd test但这样创建的用户没有家目录、没有 shell登录后体验很差。推荐做法是useradd -m -s /bin/bash test-m自动创建家目录-s指定登录 shell。如果还要指定用户组加-g 组名要设置密码再执行passwd test。这里有个容易忽略的地方useradd和adduser在不同发行版上行为不一样。Debian/Ubuntu 里adduser是交互式、更友好的封装RHEL/CentOS 里useradd才是主流的低层命令。所以在 CentOS 上用adduser有时不会创建家目录就会留下隐患。日常操作坚持一个原则能用普通用户绝不用 root。需要提权时用sudo。把用户加进wheel组RHEL 系或sudo组Debian 系用户就能使用 sudo 权限。很多新手在这两个组名上记混结果明明加了组还是无法 sudo浪费不少时间。3.2 权限体系chmod、chown 与特殊权限Linux 权限模型用三个数字表示分别对应 owner、group、others 的读(4)、写(2)、执行(1)权限。比如chmod 755表示文件所有者可读写执行组和其他人可读可执行。这个计算过程我一直建议新人自己推一遍印象会深刻很多7421541。实际环境里最常见的两个需求把文件归属给某个用户和组chown user:group 文件。给脚本添加执行权限chmod x script.sh。还有一个经常被忽略的目录权限陷阱目录的写和执行权限决定了你能否在其中创建和删除文件。哪怕文件本身是 777你所在目录没有写权限照样创建不了文件。这个知识点很多面试官喜欢考“为什么文件可写但目录不可写时还是无法删除它”。特殊权限里chmod us设置 SUID 很实用比如/usr/bin/passwd默认就带 SUID让普通用户也能用 root 权限更新密码。但自己给脚本加 SUID 时一定要谨慎可能带来安全隐患。3.3 软件包管理apt、yum/dnf 与国产系统的差异不同发行版的包管理器不一样Debian/Ubuntu 用aptCentOS/RHEL 用yum或dnf国产系统如银河麒麟、统信 UOS 基本兼容 dpkg/apt 或 rpm/yum 体系网上经常搜“银河麒麟安装软件命令”其实核心就是根据系统分支选择apt或yum。日常我最常用的几组命令apt update刷新软件源索引配套apt upgrade升级已装软件。apt install 软件名卸载用apt remove 软件名。yum install -y 软件名-y跳过交互确认在脚本里几乎必备。软件源的问题也很常见。默认源在某些网络环境下很慢或者干脆连不上这时候就要换国内镜像源。操作其实不复杂备份原配置文件然后修改sources.listDebian 系或*.repoRHEL 系里的地址。改完以后一定要执行apt update或yum makecache刷新缓存否则可能出现“软件源已更新但安装还是用的旧列表”的错觉。3.4 环境管理conda、docker 与容器内命令现在很多开发环境都容器化或虚拟化了conda和docker这类命令也实际成了“常用命令”。conda主要用于 Python 环境隔离conda create -n py39 python3.9创建环境conda activate py39激活环境。装包时优先用conda install因为 conda 会一并解决依赖冲突比 pip 更稳。不过 conda 环境的根目录默认在用户家目录下如果服务器磁盘配额有限建议用conda install --prefix /data/conda_env/py39把环境装到数据盘。docker命令的体系跟常规 Linux 命令不太一样但思路相通。docker ps查运行容器docker logs -f 容器名看日志docker exec -it 容器名 /bin/bash进入容器内部。进去以后你会发现容器里的系统最小化得连编辑器都没有这时候更需要熟练使用 grep、awk 这些自带命令来排查问题。之前排查一个容器内中文乱码问题就是因为基础镜像里没装中文字体跟宿主机编码完全无关差点误导了整个排查方向。4. 系统排查与网络诊断遇到问题别急着重启4.1 系统资源查看CPU、内存、磁盘一套组合拳服务器出问题时第一步不是重启而是先看资源状态。我的固定排查顺序是先用top看整体负载再free -h看内存接着df -h看磁盘最后iostat或vmstat看 IO。top打开后按P按 CPU 排序按M按内存排序这两个快捷键一定要记住。有时候光看 CPU 使用率还不够要按1看每个核心的负载分布如果只有某个核打满可能是单线程程序绑核导致的问题而不是整机性能瓶颈。free -h里有个非常容易被误解的指标available才是真正的可用内存。如果只看free列你会觉得内存剩得很少但那些其实是 page cache 占用的缓存系统内存不足时会自动释放。判断是否真的内存不足要看available是否长期偏低以及有没有频繁的 swap 换入换出。磁盘方面df -h看分区使用率du -sh 目录看具体目录大小。有个经典场景df显示磁盘满了但du加起来却没有占到那么多。原因通常是有文件被进程删除但还在被占用用lsof | grep deleted能定位到底是哪个进程握住了这个删除文件处理办法一般是重启该进程或服务。4.2 网络连通性诊断ping、telnet 与端口连通性“telnet 命令怎么用”和“telnet ip 端口命令怎么看通不通”这两个热词说明很多人卡在了网络排查的第一步。telnet ip 端口是非常方便的端口连通性测试命令。执行后如果弹出一个连接成功的空窗口说明端口是通的如果提示Connection refused说明目标端口没有服务监听如果一直卡住直到超时说明中间有防火墙拦截或路由不通。我平时排查的时候还会配合底层的ss或netstat先确认服务器本机是否在监听。本机查看监听端口ss -lntp-l只看监听状态-n不做域名解析-t只看 TCP-p显示对应进程。netstat -lntp也能看但在新系统上netstat有时没有默认安装而ss属于iproute2包基本都带。再延伸一步如果端口通了但业务还是访问异常我会用curl -v http://ip:端口看应用层协议返回。curl的-v参数能显示完整的请求响应过程是排查 Web 服务问题最直观的工具。4.3 防火墙管理iptables 与系统防火墙防火墙是网络问题的重灾区。“iptables 命令详解”这个热词后面往往跟着的问题是明明服务已经启动了外部还是访问不了。遇到这种问题先确认防火墙状态。systemctl status firewalldCentOS 7 以上或ufw statusUbuntu可以快速查看。如果用的是 iptables 原生规则可以执行iptables -L -n -v看当前规则。放行某个端口比较直观的做法是iptables -A INPUT -p tcp --dport 8080 -j ACCEPT-A追加规则-p指定协议--dport指定目的端口-j ACCEPT表示放行。改完后要保存规则不同发行版保存方式不同CentOS 是service iptables save需要安装 iptables-services 组件。这里有个实战教训改了 iptables 规则后最好先开着窗口测试一下再保存。我有一次在远端服务器上执行了错误规则直接把自己 SSH 断开了端口也被拒了最后还是靠控制台的“重新初始化服务器”才恢复教训相当深刻。4.4 进程、服务与日志三条线串起来进程和服务管理也是常考常用的内容。ps -ef查看进程全量列表pgrep -f 关键字按名字找进程号kill -9强制结束pkill -f按名字批量结束。这里我特别提醒一下能用kill -15默认让进程优雅退出就别上来就kill -9。-9会把进程直接杀掉可能留下缓存文件、未写完的日志甚至破坏数据库文件的一致性。服务管理方面systemctl系列命令目前是主流。这里有一个容易混淆的知识点systemctl start是临时启动重启后失效systemctl enable是设置开机自启动但它不会立即启动服务。真正要在本次开机和后续开机都生效需要组合使用systemctl enable --now 服务名两条一起做。排查问题时日志是一切的答案。journalctl -u 服务名 -f可以跟踪某个服务的实时日志。如果服务起不来我最常用的做法是先看状态systemctl status 服务名它会显示最近几条日志如果不够定位再journalctl -xe查看完整上下文。很多系统初始化、网络配置、DNS 解析的问题都能在日志里找到线索。5. 常见问题与排查技巧实录日常运维里我遇到的高频问题其实就那几类这里整理成速查表可以直接对照排查。问题现象排查命令常见原因与解决方向命令找不到 command not foundecho $PATH、which 命令名软件没装或安装路径不在 PATH 中添加软链接或修改 PATH端口无法访问ss -lntp、telnet 127.0.0.1 端口先查本机监听再查防火墙规则再查云安全组策略程序卡死top、ps -aux、strace -p 进程号CPU 高靠 top 定位IO 卡住靠 strace 查看系统调用磁盘空间显示占用高但找不到大文件lsof | grep deleted文件被删除但仍被进程占用释放方式是重启对应进程日志中文乱码echo $LANG、locale系统语言环境变量与日志文件编码不一致统一为 UTF-8使用kill -9后进程依然存在ps -ef | grep 进程名进程可能处于不可中断睡眠(D状态)只能等 IO 恢复或重启系统还有一个大家常忽略的命令history。排查“是谁改了配置”“刚才执行过什么操作”时history和~/.bash_history能帮上大忙。我会在排查问题的同时把操作现场的输入历史调出来很多诡异的 “改完配置但行为没变” 的问题最后都发现是因为操作打错了字母或者改错了文件。再补充两个压箱底的建议。第一个不要一上来就执行网上的“一键脚本”。很多安全事件都是因为盲目执行脚本导致的。执行前先下载到本地用head -50和cat看一下脚本内容确认每一步在做什么。第二个习惯用alias给危险操作加减防护。比如alias rmrm -i每次删除都会确认alias llls -lhtr按时间反序显示文件最近修改的会排在下面查看日志目录时特别好用。写完记得把 alias 写进~/.bashrc再source ~/.bashrc才能永久生效。我自己的体会是Linux 常用命令就像厨房里的锅碗瓢盆天天用到的就那几样但真正把这几样用好、用顺就能解决 80% 以上的问题。与其背一大本手册不如在日常操作时有意识地建立“排查一条链”的习惯发现问题、定位进程、查看日志、确认网络、验证权限。这套思维通了换任何发行版、任何环境都不慌。最后再分享一个小技巧每次遇到搞不定的问题解决之后花两分钟把“现象、排查过程、最终原因、修复命令”记成本地笔记。坚持半年以后你会发现自己排查问题的速度会有肉眼可见的提升很多原来要查半天的问题看一眼现象就能直接反应出该敲哪条命令。
返回列表