资讯动态

Linux核心命令实战:从文件权限到进程与网络排查

发布时间:2026/10/16 12:43:08 来源:尧图企业网站定制
直接从我最常用的几个命令讲起吧。做运维和开发这些年Linux命令行几乎天天打交道。很多人觉得“Linux核心命令”就是背一背ls、cd、rm、cp其实远没有那么简单——真正核心的不是某个命令的语法而是你面对一个实际问题时知道该调用哪个工具、怎么组合、参数怎么配。这篇内容我尽量按实战视角来讲把命令背后的原理、踩过的坑、排查思路都过一遍适合刚开始接触Linux的朋友也适合用了一段时间但总觉得“命令都见过、遇到问题还是懵”的同行。1. 先搞清楚Linux命令到底在解决什么问题1.1 命令行的核心价值不是“酷”是效率很多刚接触Linux的同学会问为什么非要记命令行图形界面多直观。我在实际工作中体会最深的一点是命令行最大的价值在于可组合、可脚本化、可远程。你可以在图形界面里点十下鼠标完成一次文件复制但要在上百台服务器上批量做同样的事只能靠命令和脚本。而且服务器环境往往没有图形界面SSH连上去就是一片黑底白字这时候命令就是你唯一的操作手段。Linux命令的设计哲学沿用了Unix时代的思路每个命令只做一件事把事情做好然后通过管道把输出交给下一个命令。比如查找某个进程并强制结束单独用ps或者单独用grep都做不到但组合起来就是一条命令的事。这种“小工具大协作”的思路是理解Linux核心命令的钥匙。1.2 命令结构的基本认知一条完整的Linux命令通常包含三部分命令本身、选项参数、操作对象。比如ls -la /home/user其中ls是命令-l和-a是选项/home/user是操作对象。选项的作用是修改命令的默认行为-l表示以长格式输出-a表示显示隐藏文件。这里有个细节很多命令的选项可以用短横线加单字母-l也可以用双横线加单词--all两者等价但脚本里建议写完整的单词选项可读性更好不容易被后来维护的人看懵。还有一个容易忽略的点命令的返回值。Linux世界里命令执行成功的返回码是0非0则代表各类错误。这个特性在写脚本时尤其重要if grep -q error /var/log/app.log; then echo 日志里发现了error fi-q让grep静默输出只用返回码表示是否匹配成功。如果不理解返回码机制很多脚本逻辑会写得很绕。2. 文件与目录操作日常最高频的指令2.1 导航类命令pwd、ls、cd、find先说pwd打印当前工作目录。很多人觉得它没用但在脚本里它经常用来确认执行环境。我见过不少事故就是脚本里用了相对路径结果crontab执行时工作目录跟预期不一样操作到了错误的文件上。所以在脚本开头加上pwd或者直接用绝对路径是个好习惯。ls是最基础的命令但参数多到值得专门列出来。我日常最常用的是ls -la-l长格式显示权限、属主、大小、修改时间-a显示隐藏文件以.开头的文件-h配合-l使用把文件大小显示为K、M、G这种人类易读的单位-t按修改时间排序排查“刚才哪个文件被动了”很好用-S按文件大小排序大文件排查首选。cd命令本身没什么可说的但我建议养成用cd -的习惯。它表示回到上一个工作目录比手敲一长串路径快得多。另外cd ~回到当前用户家目录cd /回到根目录。find是查找文件的重器新手容易在这里踩坑。先看一个常见场景查找某个目录下所有.log文件并删除。find /var/log -name *.log -mtime 7 -exec rm {} \;拆开解释-name按文件名匹配*.log是通配符-mtime 7表示修改时间在7天以前-exec rm {} \;是对每个结果执行删除操作{}是结果的占位符。这里有个大坑find配合-exec或-delete非常危险。我建议任何删除操作之前先不加-exec跑一遍把结果看清楚了再加。更稳妥的方式是用-print先输出确认find /var/log -name *.log -mtime 7 -print确认无误后再执行删除。另外find默认不会进入没有权限的目录会输出一堆“Permission denied”的报错看着心烦可以加2/dev/null把错误信息丢弃。2.2 文件操作cp、mv、rm的细节与风险cp复制文件mv移动或重命名rm删除。这三个命令语法简单但细节坑多。cp我强烈建议默认带-a或者至少带-r。-r递归复制目录-a是归档模式在-r基础上还保留权限、时间戳等属性。复制目录时如果忘了-r会直接报错“omitting directory”。还有一个极易忽略的点cp -r和cp -a的差异在复制配置文件时特别明显。有一次我用cp -r覆盖了一个应用的配置文件结果属主和权限全变了应用启动直接报权限错误。用cp -a就能把原文件的属主、属组、权限一并保留避免这类问题。复制多个文件到目录时要小心cp的用法cp file1.txt file2.txt /backup/最后一个参数必须是目录否则会把前面几个文件的内容拼起来覆盖成一个文件这个操作我是真见人踩过。mv在同一文件系统内是修改路径记录瞬间完成跨文件系统则是先复制再删除耗时跟文件大小成正比。所以要移动一个很大的目录到另一个磁盘分区时mv可能比预想中慢很多。此时可以用rsync先同步确认无误后再删除源操作更可控。rm是Linux里最危险的命令之一。我个人的习惯是凡是要删除的东西先mv到一个临时目录确认一周没问题再真正删除。尤其是rm -rf这种组合一个路径写错就可能把整个系统删掉。曾经有同行在删除时写成rm -rf / var/log/和var/log之间多了一个空格直接把系统根目录干掉了。这种事故不是段子是真实发生的。所以只要涉及rm -rf建议先用ls确认路径再动手。2.3 查看文件内容cat、less、tail、head查看小文件用cat没问题但大文件用cat会把整个屏幕刷爆还占内存。这时候该用less。less支持上下翻页、搜索、跳转查大日志文件非常合适。进入less后按/输入关键字搜索按n跳到下一个匹配项按q退出。这两个快捷键我每天用几十次。tail是排查日志的神器tail -f可以实时跟踪文件追加内容服务起不来、报错看不到时开一个终端挂着tail -f看日志是标准操作。tail -n 100显示最后100行而不是默认的10行排查问题信息不够时很常用。head则相反看文件开头。还有一个组合技巧用tail -f配合grep做实时过滤tail -f /var/log/app.log | grep ERROR这样只关注报错信息不会被大量正常日志淹没。3. 权限体系新手最容易翻车的环节3.1 读懂权限位rwx与数字的对应关系Linux的权限模型是三组九位属主u、属组g、其他用户o每组各包含读r、写w、执行x三个权限位。ls -l输出里的-rw-r--r--就是权限的直观展示。第一个字符是文件类型-普通文件d目录l符号链接c字符设备等。后面三组rwx分别对应属主、属组、其他用户。数字表示法是权限的二进制编码读r算4写w算2执行x算1累加得到该组的数值。比如rwx是7r-x是5r--是4。chmod 755就等于属主7rwx、属组5r-x、其他5r-x。目录的执行权限x意味着能否进入该目录所以目录的r-x其实表示“能看到目录内容列表但只有读权限”没有x就进不去这个点新手经常搞混。3.2 chmod的实践要点chmod修改权限两种写法都需要掌握。符号写法直观chmod ux script.sh # 给属主加执行权限 chmod 755 script.sh # 数字写法定权限脚本文件必须要有执行权限才能直接运行所以写完shell脚本第一件事往往是chmod x。这里要特别提醒对一个目录用chmod -R时务必谨慎。-R会递归修改目录下的所有文件如果对/目录误操作整个系统的可执行权限都会乱掉。某次我见同行想给一个应用目录加权限结果路径写到了应用目录的父级递归下去把系统命令的权限也改了最后只能联系机房处理。正确的操作是先确认当前路径再缩小权限范围必要时加--preserve-root防止对根目录的递归操作。3.3 chown与属主概念chown修改文件属主和属组chown user:group file.txt chown -R user:group /data/app/在部署应用时代码文件必须属于运行该应用的用户否则应用没有权限读取配置或写入日志。这个坑在“越权”或“无权限”报错里占了很大比例。排查权限问题有个实用命令id查看当前用户的uid、gid和所属组列表能快速确认你是不是预期的用户。还有一个很多人不知道的概念umask。它决定了新建文件的默认权限。系统通常设置umask 022所以新建文件默认是644rw-r--r--新建目录默认是755。如果希望团队共享目录下所有新文件都带组写权限就把umask改成umask 002但这需要全局配置不能只在一个终端里改完就算数。4. 进程管理与系统状态监控4.1 ps查看进程的核心命令ps是进程管理的基础。两个最常用的形式ps -ef和ps aux。我看到很多人纠结它们有什么区别其实大同小异——两者的字段基本一致都能看到PID、PPID、CPU、内存、启动时间、命令行。ps aux是BSD风格ps -ef是Unix风格。有些系统上ps aux会对CPU使用率做归一化显示略有差异。日常用哪个都行但我个人习惯ps -ef输出格式更稳定。排查问题最常用的组合ps -ef | grep java ps aux | sort -rk3 | head -10 # 按CPU占用排序看前10第一条用来找某个服务的进程第二条看哪几个进程吃CPU最狠。注意ps aux | sort -rk3中的-k3是按CPU那一列排序-r是倒序。只看某些进程的PID有更精准的方式pgrep -f app.jar pidof nginxpgrep -f支持按完整命令行匹配比pgrep按进程名匹配更可靠因为有些进程名被截断或者被改过。4.2 top和它的替代品top是实时监控的神器打开后默认按CPU占用排序按M键换成内存排序按P键换回CPU排序。练熟几个交互键很有用。当然日常运维中我更多用htop显示更直观还能用F6按指定列排序支持鼠标操作但需要额外安装。看之前有个细节top里的%CPU值可以超过100%因为多核处理器下一个进程可以同时占用多个核。如果你拿top发现某个进程CPU显示200%不要慌那是它占满了两个逻辑核。一次性输出top结果适合脚本采集top -b -n 1 | head -30-b是批量模式-n 1只执行一次head -30只取前30行。这样就能拿到当前系统的实时快照而不是进入交互界面。4.3 kill结束进程的正确姿势kill的本质不是“杀掉进程”而是给进程发送一个信号。默认发送的是SIGTERM信号15让进程有机会做清理工作再退出。如果进程不响应SIGTERM才考虑用kill -9SIGKILL那是强制内核直接结束进程不给任何清理机会。我的建议是先killSIGTERM等几秒不行再kill -9。直接kill -9容易导致数据丢失尤其是数据库、消息队列这类需要持久化的服务。举个例子某次我处理一个卡死的应用服务直接用kill -9把它结束了结果它正在写的缓存索引没有落盘重启后花了大半天做一致性校验。如果之前先kill应用有机会处理未完成的事务。批量结束进程可以结合pgreppkill -f app.jarpkill -f按完整命令行匹配比pkill按进程名匹配要精准但也更危险——匹配串写得太宽泛可能误杀无关进程。用之前先跑一下pgrep -f app.jar看看匹配到了什么。4.4 系统资源监控free、df、du内存排查用free -hfree -h输出里的available是真正可用的内存量而不是free那一列。因为Linux会把空闲内存用作缓存buff/cache在需要时释放出来所以free很小不代表系统内存不够得看available。这个点我强调很多次了——你看到free显示几百M就以为内存爆了其实系统健康得很。磁盘排查用df -h和du -sh。df -h看文件系统的总容量和使用情况du -sh看某个目录占了多少空间df -h du -sh /var/log du -sh * | sort -rh | head -10 # 当前目录下各子目录大小排序磁盘满是很常见的事故排查思路是先用df -h确认哪个分区满了再进到对应目录用du逐级定位大文件。du -sh *中不带/的写法统计的是当前目录下的直接子项方便快速聚焦。5. 文本处理三剑客grep、sed、awk5.1 grep过滤文本的第一选择grep按模式匹配文本行是日志分析、配置排查的基础工具。最常用参数-i忽略大小写-v反向匹配输出不匹配的行-n显示行号-r递归搜索目录-l只输出包含匹配内容的文件名-c统计匹配的行数。看一个综合场景找出日志文件中所有包含“ERROR”且不含“timeout”的行带上行号grep -n ERROR /var/log/app.log | grep -v timeout管道把两个grep串起来了非常符合Linux的设计哲学。还有一个高频用法是统计各等级日志的数量for level in ERROR WARN INFO; do echo $level: $(grep -c $level /var/log/app.log) done日志文件几百M甚至几个G都不罕见但grep依然能秒级返回因为它的匹配逻辑经过了深度优化。不过要记住grep是按行匹配不是按流匹配处理超大文件时内存占用是可控的因为它逐行读入、逐行输出。 ### 5.2 sed流式编辑批量替换利器 sed的英文全称是stream editor流编辑器。它逐行处理文本适合批量替换、删除、打印指定行。最常用的是替换 bash sed -i s/old/new/g file.txt-i表示直接修改文件s/old/new/g是把所有old替换成new末尾的g表示全局替换不加g只替换每行第一个匹配。这个命令在批量修改配置时非常有用比如把一批配置文件里的IP地址批量替换。但sed -i直接改文件前一定要确认匹配模式正确。我曾经写一条sed -i想把日志里的敏感字段脱敏结果正则写得太宽把正常数据也替换了回滚时只能从备份恢复。所以更稳妥的做法是先不加-i把替换结果输出到屏幕确认sed s/old/new/g file.txt | head -20确认无误后再加上-i执行。sed删除指定范围行也常用sed -i 1,5d file.txt # 删除前5行 sed -i /^#/d config.conf # 删除所有注释行5.3 awk按列处理文本的利器awk比grep和sed更强大它能按列拆分文本、做条件判断、甚至做统计。最经典的用法是看某一列的内容awk {print $1} file.txt$1是第一列$2是第二列依此类推。组合条件可以做很多事。比如从ps -ef输出中提取所有java进程的PIDps -ef | awk /java/ !/grep/ {print $2}这条命令把ps输出的每一行拆成多列$2是PID列。这里!/grep/是为了排除grep命令本身产生的进程。awk的统计能力也很实用。分析nginx访问日志请求量Top10的IPawk {print $1} access.log | sort | uniq -c | sort -rn | head -10$1是IP列sort排序uniq -c统计每个IP出现的次数sort -rn按次数倒序head -10取前10。如果要说awk的学习曲线它本质上是一门小型编程语言有变量、循环、条件、函数。日常使用不需要掌握全部把$列引用、BEGIN、END、if条件这几个概念搞懂就能应付绝大多数日志分析场景。我在实战中最常写的awk就是awk -F, {sum$5} END {print sum}这种汇总求和-F,指定逗号作为列分隔符END块在处理完所有行后执行。6. 网络排查从ping到curl6.1 ping与连通性判断ping测试主机连通性原理是发送ICMP回显请求。ping -c 4指定发送几个探测包而不是默认无穷无尽地发。这个细节很重要公网环境的服务器一般禁止外网Ping所以ping不通不代表网络不通可能只是防火墙丢弃了ICMP包。判断域名解析是否正常用nslookup或dig更直接。某次我排查“域名访问不了”的问题先ping域名不通误以为网络断了结果dig发现是DNS解析返回了错误的IP跟网络压根没关系。所以套路应该是先ping测IP连通性再dig测域名解析分别定位问题。6.2 curl万能HTTP调试工具curl是排查HTTP接口的首选工具功能强大到可以当半个接口测试工具用。常用参数-i输出响应头-v输出详细交互过程包括SSL握手、请求头、响应体-X指定请求方法-H自定义请求头-d携带请求体数据-s静默模式不显示进度条-o把响应体保存到文件。排查接口返回慢的经典操作curl -i -v http://localhost:8080/api/health-i能看到响应状态码-v能看到连接建立的每个环节——TCP连接、TLS握手、发送请求、等待响应。如果卡在TLS握手阶段通常是证书或SSL配置问题如果请求发出去后迟迟没有响应通常是应用层处理慢。只测接口通不通可以用-s -o /dev/null -w输出耗时统计curl -s -o /dev/null -w HTTP状态码: %{http_code}\n耗时: %{time_total}s\n http://localhost:8080/api/health这个写法在探活脚本里很常见-o /dev/null丢弃响应体-w自定义输出格式。6.3 端口监听与连接排查netstat和ss排查端口占用或服务监听情况老牌命令是netstat新一代工具是ss。两者功能类似但ss更快信息更全。最常用ss -tlnp netstat -tlnp-t显示TCP-l只看监听状态的端口-n用数字显示地址和端口-p显示对应的进程名和PID。这个命令能回答“这个端口有没有被监听”“是哪个进程在监听”这两个日常问题。排查端口被占用可以用lsof -i:8080lsof列出所有打开的文件-i:8080筛选出绑定8080端口的进程。解决“端口被占用”问题时先lsof找到PID再核对进程是否还需要不需要就kill掉。7. 常见问题速查直接对着排查7.1 “command not found”的常见原因命令找不到先别急着怀疑系统坏了。多半是三种情况命令确实没安装、路径不在PATH里、拼写错误。判断是否已安装用which和typewhich curl type -a curlwhich在PATH里查找可执行文件type -a还会显示alias定义比which信息更全。如果which找不到但命令应该是系统自带的检查一下PATH环境变量是不是被人为改乱了。我见过有脚本在运行时把PATH给覆盖了导致后续调用的命令全部找不到。如果是没安装各发行版安装方式不同。Debian系的用apt install红帽系的用yum install或dnf install。装之前先更新软件源缓存不然可能提示找不到软件包。7.2 “Permission denied”的排查思路遇到权限拒绝按照这个顺序查先用ls -l看文件权限再用id确认当前用户身份最后根据情况调整属主或权限。重点检查目录的所有权和权限尤其是日志目录、上传目录、部署目录这一类。应用报“cant write”类错误时往往不是文件权限问题而是它所在目录没有写权限。逐层用ls -ld查目录权限ls -ld /data/app/7.3 磁盘满了但还是删不掉文件这是经典诡异问题df -h显示磁盘使用率100%但du -sh统计各目录加起来却远小于总量。原因是有进程还在占用已删除的文件。Linux下删除文件只是解除链接如果进程还持有该文件的文件描述符空间不会真正释放。排查方法lsof L1L1列出所有被删除但仍被占用的文件看到PID后重启或kill掉对应进程空间才会释放。这个场景在日志轮转失败的服务器上特别常见logrotate把日志文件删了但应用进程还持有旧文件句柄磁盘空间一直不降。7.4 端口占用冲突启动服务报“Address already in use”说明端口被别的进程占了。常规操作ss -tlnp | grep 8080找到PID后用ps -ef确认是什么进程再决定是杀进程还是换端口。还有一种情况是端口处于TIME_WAIT状态这是TCP四次挥手后的正常状态过一会儿会自动消失不需要处理。8. 命令学习的几个习惯建议8.1 用man和--help解决参数遗忘记不住参数太正常了我到现在还经常翻man。man页面内容太多时用/搜索关键字很快。比如man tar里想找压缩相关参数输入/压缩直接跳到对应位置。大部分命令还支持--help快速查看用法比man更精简。我的建议是先用--help看大体细节拿不准时再开man。如果你连命令名字都想不起来用apropos按功能描述反查apropos copy files8.2 用history和alias积累自己的快捷方式history查看命令历史!123执行历史里第123条命令!!执行上一条命令Ctrlr反向搜索历史命令。这套操作我每天都在用能省下大量重复敲命令的时间。alias给常用命令设置别名。我个人的配置是把rm设置成rm -i让删除前必须确认防止手滑误删。还有ll、la这类别名不同发行版默认配置不一样建议自己统一。8.3 安全使用命令的三条铁律一是高风险命令先输出再执行。find、rm、sed -i这类命令先看结果再动手别直接一把梭。二是涉及批量修改前做好备份。cp -a做一份备份不费什么事但恢复成本极低。三是不确定参数含义时先查文档。我用rm -rf的另一种危险情况是变量值为空比如脚本里rm -rf $DIR/这种写法如果$DIR没赋值命令就变成了rm -rf /直接删根目录。写脚本时对这种裸变量要格外小心至少加一层判断或使用${DIR:?}这种参数展开确保变量非空。8.4 建议的进阶方向掌握了上面的核心命令下一步可以往三个方向深入。一是管道和重定向的灵活运用把多个命令组合成流水线这是Linux操作效率提升的关键。二是shell脚本把常用操作固化成脚本减少重复劳动。三是系统性能分析与调优结合vmstat、iostat、strace这些更底层的工具追踪系统瓶颈。我个人在实际操作中的体会是命令的熟练度没有捷径靠的是高频使用和不断踩坑。每遇到一个问题解决后花一分钟想想“为什么这样能解决”比机械地复制命令有用得多。等到你形成自己的排查套路——先看哪里、用什么命令、怎么缩小范围那时候才算是真正入门了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑