☰
十年运维自测清单:真正掌握Linux的必备命令与实战技巧
2026/10/11 20:31:03 网站建设 项目流程

带人这么多年,我面试过不少自称“熟悉Linux”的候选人,也带过刚入行的新人。说实话,很多人是把命令背下来了,但真扔到一台服务器前面,让他查个问题、排查个故障,手就僵住了。我常说一句话:Linux不难,但它有门槛,这个门槛不是看你记住了多少条命令,而是看你真正会用多少条。如果下面这些命令你只是“见过”或者“用过一两次”,那真不能说会Linux。

这篇文章不打算写成一本命令字典,Linux命令上千条,谁也不可能全背下来。我想换个角度,从一个混了十年的老运维视角,把那些“不会就等于不会Linux”的命令逐个过一遍,告诉你它们真实的使用场景、常用的关键参数、以及我踩过的坑。你可以把这篇文章当成一张自测清单,一条一条对照,看看自己到底有没有真正掌握Linux的基本功。

1. 先别急着背命令,文件与目录操作才是地基

很多人觉得文件操作就是cd、ls、rm,太简单了,没什么好学的。但恰恰是这些最基础的命令,最能看出一个人对Linux的理解程度。我见过太多人在生产环境里执行rm -rf然后哭都来不及的场景,也见过有人用find找文件能折腾一上午的。文件操作这块,我的建议是:基础命令要精通,高级命令要熟练,不要只会皮毛。

1.1 cd、ls、rm不是入门三件套,用好了是效率利器

先说cd。这命令看起来没技术含量,但“能不能快速到达目标目录”直接决定你的操作效率。我自己的习惯是:绝对路径走天下,相对路径只用在脚本里。曾经有个同事,登录服务器后一直在路径之间来回跳跃,用cd ../../..一层一层找,看得我头皮发麻。后来我教他三个技巧:第一,用cd -在最近两个目录之间切换,这个操作在排查问题时尤其好用;第二,用软链接把常用目录钉在固定位置,比如ln -s /var/log/nginx /nginxlog,以后直接cd /nginxlog;第三,配合tab补全,输路径时按两下tab可以看到候选列表,这比盲打强一百倍。

ls的用法就更值得说说了。默认的ls输出信息太少,很多新手根本不知道文件权限那串字符怎么看,也不知道文件大小为什么不显示。我要求自己带的徒弟必须养成ls -lh的习惯,h参数会自动把字节数转换成人类可读的K、M、G单位,一眼就能看出哪个日志文件快把磁盘撑爆了。ls -lt按时间排序,配合head使用,快速找到最近修改的文件;ls -la在排查隐藏文件时必不可少,尤其是怀疑服务器被种了后门,优先看有没有奇怪名称的隐藏文件。这些不是晦涩的冷门技巧,而是每天都会用到的东西,用什么顺序组合参数,就是熟练度的体现。

rm这个命令,我说再多也不过分。第一原则是:生产环境禁用rm,能加引号就加引号,能用find删除就find删除,能先把目录改名观察再删就绝不做一锤子买卖。我有个习惯,凡是要删重要目录,先mv /data/app /data/app_bak_20250101,观察三到七天没问题再清掉。这多花不了几分钟,但能救你于水火。还有个细节:rm -rf里的f参数是“强制”,但很多人忽略了它同时也会抑制“不存在的文件”的报错提示,导致你误以为自己删的是存在的目录。真正常见的做法是,在脚本里这样写:

# 删除前先判断目录是否存在,防止通配符展开错误 if [ -d "/data/app_${DATE}" ]; then rm -rf "/data/app_${DATE}" fi

变量加双引号,路径做存在性判断,这两点哪怕只做到一个,都能避免大部分rm事故。

1.2 find和tar:两个被严重低估的救命命令

find是查找命令,但它的能力远超“找文件”。我处理过最多的场景是磁盘空间告警,这时候find就是第一把刀。比如find /data -type f -size +500M -exec ls -lh {} \;,把大文件全部找出来,再决定是清理还是归档。这里补充一个高频参数组合:-mtime +30表示30天前修改过的文件,配合日志清理需求极好用;-name "*.log"限定文件类型;-exec后面接处理动作,可以执行任何你想执行的命令。

但find有个大坑是通配符处理。如果你执行find /data -name *.log,在某些shell环境下,*.log可能被shell先展开再传给find,一旦/data下正好有多个.log结尾的文件,命令就会报“参数过多”的错误。正确写法是find /data -name '*.log',给文件名模式加上单引号,让find自己处理通配符。这个细节,面试的时候拿来考人一考一个准。

tar的重要性不需要我强调,但用法上很多人只停留在tar -zxvf。四个字母的排序其实暗含逻辑:z是压缩方式,x是解压,v是显示过程,f后面跟文件名,f必须放在最后,因为f需要接参数。我自己的习惯是打包时用tar -zcvf相当于“用gzip压缩、创建、显示过程、输出文件名”,解压时用tar -zxvf。但你要记住,不是所有tar包都是gzip压缩的,.tar.bz2对应j参数,.tar.xz对应J参数。盲目使用-zxvf解压其他压缩格式,虽然tar有时能自动识别,但遇到不兼容情况就会报错。如果实在记不住,直接tar -xf 文件名.tar.gz,现在新版本的tar能够自动识别大多数压缩格式,少打几个参数反而更稳。

2. 文本处理三剑客到底怎么用才算“会”

Linux的一切皆文件,而文件里装的最多的又是文本。日志分析、配置修改、数据提取,这些活全落在grep、sed、awk这三兄弟身上。有人背了一大堆正则表达式,真到实战却不知道从哪下手。我用十年经验浓缩成一句话:grep用来找行,sed用来改行,awk用来取列,三者的边界搞清楚,就能解决九成问题。

2.1 grep为什么是排查问题的第一选择

grep几乎是我每天敲击次数最多的命令。它的核心能力就是从文本流中过滤出你想要的信息。最基础的用法是grep keyword 文件名,但真正有用的场景是配合管道符使用,例如cat /var/log/nginx/access.log | grep "500"。注意,管道符前可以接任何命令的输出,这让你可以动态过滤实时信息,比如ps aux | grep java。

这里必须提一个坑岁数不小的坑:用ps aux | grep java的时候,如果Java进程不存在,你依然会看到一条类似grep java的进程输出,因为grep自己也会匹配到“java”这个关键词。这就是著名的“grep出自己”的坑。解决方案有两个:一是加-v参数反向排除,ps aux | grep -v grep | grep java;更优雅的是用pgrep -f java,或者ps aux | grep [j]ava,用正则特性让grep匹配不到自身。

grep参数中,-i忽略大小写、-r递归搜索目录、-n显示行号、-c统计行数,这四个是基础中的基础。再往上就是正则了:^匹配行首,$匹配行尾,[]匹配字符集合,.*任意字符,\{n\}重复次数。我打一个形象的比方,grep就好比在图书馆里找书,正则就是你的检索规则,规则越精准,找到目标的速度越快。比如你要查IP地址是192.168开头且结尾是8080端口的日志行,可以写:

grep "^192\.168\..*:8080" /var/log/app.log

正则里的反斜杠转义点号,是因为在正则里点号代表任意字符,不转义就会把192x168也匹配出来。这类细节,代码写得多了自然就体会到了。

2.2 sed和awk,一个用来改,一个用来算

sed是流编辑器,擅长“读取文件-处理-输出”,不改变原文件内容,除非加上-i参数。我讲一个高频用法:批量替换配置文件里的内容。比如要把nginx配置里所有8080端口改成9090端口,一条命令搞定:

sed -i 's/8080/9090/g' /etc/nginx/nginx.conf

s就是substitution替换,/8080/是要找的内容,/9090/是替换成的内容,g是全局替换不加的话每行只替换第一个匹配。/前面可以加行号或正则定位范围,比如sed -i '10,20s/8080/9090/g'表示只替换10到20行之间的内容。这比用vim手动改几千行的配置文件效率高太多。

-i参数直接修改文件,好使但没有后悔药。我的习惯是:凡是动生产环境配置文件,先sed 's/8080/9090/g' 原文件 > 新文件,确认无误后再mv覆盖,或者用sed -i.bak在修改前自动备份原文件。sed -i.bak的意思是修改的同时保留一份.bak后缀的备份,这是很多老手在用的安全做法。

awk的定位又不一样,它长得像C语言,但主要用来做文本处理和数据提取。最简单的例子:awk '{print $1}'打印第一列,$0表示整行,NF表示列数,NR表示行号。比如查看CPU使用率,top -bn1 | grep Cpu | awk '{print $8}',这里的$8就是每列数据,具体是哪个数要看top输出的格式,这个需要自己核对文档。awk的处理逻辑是“按行为单位读入,按列为单位切分”,默认按空格/Tab切分,指定分隔符用-F参数,比如awk -F':' '{print $1}' /etc/passwd以冒号分割提取用户名。

但awk真正牛的地方在于统计和聚合。排查Nginx日志的时候,我想看看哪些IP请求量最大,一行awk搞定:

awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' /var/log/nginx/access.log | sort -k2 -rn | head -20

count[$1]++是数组累加,$1是IP列,END块在所有行处理完之后执行,遍历数组输出统计结果,再用sort按第二列数值倒序排列。这已经算得上实打实的数据分析能力了,堪比Excel里的透视表。

3. 系统状态与网络排查,不会看等于裸奔

命令背得再熟,服务器出问题你两眼一抹黑,那就等于零。排查问题是有套路的,首先看系统状态,再看进程资源,最后看网络链路。这一节我把几个核心命令的实战用法捋一遍。

3.1 top命令详解:除了CPU你还要看懂哪五列

top命令可以说是运维的“仪表盘”,服务器有没有问题、瓶颈在哪里,基本扫一眼top就能有个结论。很多人看top只知道按大写P按CPU排序、按大写M按内存排序,这算入门,但远远不够。

首先看第一行的load average,后面有三个数字,分别代表过去1分钟、5分钟、15分钟的系统负载平均值。这三个数字不是CPU使用率,而是一个系统中处于可运行和不可中断状态的进程数的平均值。怎么判断负载高不高?参考CPU核数,比如4核机器负载4.0意味着每个核都满负荷,负载8.0就是过载了。如果1分钟高、15分钟低,说明是临时尖峰;反过来1分钟低、15分钟高,说明已经持续高负载一段时间,需要警觉。

再往下看进程列表,重点关注的不是CPU那一列,而要看进程的RES(常驻内存)和SHR(共享内存),判断进程真实占用内存。还要看进程状态列S,R代表运行,S代表睡眠,D代表不可中断睡眠(通常表示在等待IO),Z代表僵尸进程。如果出现大量Z进程,说明父进程没有正确回收子进程资源,程序有bug或者被kill得不够干净,需要排查。

top的交互式快捷键也值得掌握:按1显示每个CPU核的单独使用率,按c显示完整命令行(默认只显示进程名),按h调出帮助菜单。我曾经遇到一个事故,Java进程CPU飙到300%,敲top一看,进程名只显示java,根本不知道是哪个服务,按c键后看到完整命令行里带着特定的jar包路径,立刻定位到问题服务。这些细节,关键时候真的能救命。

3.2 telnet能不能通,网络链路排查三板斧

网络排查这块,telnet这个命令现在很多人不熟,甚至觉得它老掉牙。但我负责任地说,telnet ip port这个组合,是测试TCP端口连通性最简便的方式,没有之一。很多云厂商的安全组配置、防火墙规则是否正确,用telnet一试便知。

具体怎么用?命令行输入telnet 192.168.1.10 3306,如果端口开放,会进入一个交互界面,显示类似Connected to 192.168.1.10的提示;如果不通,会一直卡在Trying...然后超时,或者直接报Connection refused。Connection refused和超时是两种截然不同的含义,前者说明网络通则目标主机主动拒绝了请求,往往是端口没监听或者防火墙拒绝;后者说明数据包被丢弃了,大概率是网络不通或安全组拦截。我见过不少新手看到Connection refused就以为网络不通,其实恰恰相反,能收到refused说明TCP握手已经到达了目标主机。

但telnet也有自己的问题:很多服务器为了安全并没有安装telnet客户端。这时候退而求其次,用bash自带的/dev/tcp伪设备:

timeout 3 bash -c 'echo > /dev/tcp/192.168.1.10/3306' && echo "port open" || echo "port closed/filtered"

这个命令的原理是利用bash的重定向功能,向TCP套接字发起连接,连接成功就echo通了,失败则反馈错误。timeout 3表示最多等待3秒,避免长时间卡住。

链路排查三板斧,我习惯的套路是:先ping目标IP测ICMP通不通,再telnet测试具体端口通不通,如果通但业务异常,就用ss或netstat查看端口监听状态和连接队列。ss命令是netstat的替代品,性能好输出快,查看监听端口用ss -lntp,查看所有连接用ss -ant。排查网络问题最重要的心态是“分层定位”,先分清是网络层、传输层还是应用层出问题,再用对应的命令去验证。

4. 软件部署与自动化管理,从装系统到容器化的现代基本功

看一个人是不是真正干过生产环境,问问他怎么装软件、怎么管服务、怎么玩转容器,基本就有数了。这一块知识更新快,但核心思路没变:把软件的安装、启动、更新、删除全部纳入可管理的轨道,而不是像新手一样靠猜。

4.1 软件包管理:yum、apt、dnf背后的统一逻辑

不同Linux发行版有不同的软件包管理工具,CentOS/RHEL系用yum或dnf,Debian/Ubuntu系用apt。但背后的逻辑是一致的:软件仓库-依赖关系-元数据缓存-安装升级卸载。会了其中一个,换到另一个发行版只需要一个小时就能上手。

以CentOS系为例,yum install -y nginx,这里-y参数是在安装过程中自动回答yes,避免交互式提示导致脚本卡住。升级软件用yum update 软件名,如果直接执行yum update会把系统所有可更新软件包全部升级一遍。生产环境这么做要慎重,因为某些软件升级后可能与现有配置不兼容,尤其是内核版本升级,需要明确知道自己在做什么。

dnf是yum的下一代版本,在RHEL 8及以后成为默认,命令用法几乎一致。apt系的区别在于需要先apt update更新软件源索引,再apt install -y 软件名。忘记执行apt update就去install,经常会导致安装到旧版本甚至提示找不到软件包。

还有一个三次被坑得记忆犹新的教训:不要使用yum install去安装不属于官方源的软件包。很多第三方软件源配置不当,会引入依赖冲突,轻则软件运行不起来,重则把系统的关键库给替换掉。我一朋友在测试环境配置了一个第三方源,执行yum update后,glibc被更新,然后几乎所有的命令都开始报错,最后只能重装系统。配置第三方源之前,先问自己一句:这个软件有没有官方源?官方源有没有静态二进制包?都不行的话,宁可编译安装也别盲目添加第三方源。

4.2 systemctl:把服务生命周期掌握在自己手里

十年前的Linux管理员用的是service命令和/etc/init.d目录下的脚本,现在主流发行版全部切换到了systemd体系,核心操作命令就是systemctl。最常用的几个子命令:systemctl start 服务名启动、stop停止、restart重启、reload重载配置、enable设置开机自启、disable取消开机自启、status查看状态。

但我见过很多人在使用systemctl时忽略了一个重要细节:修改完服务的配置文件后,必须执行systemctl daemon-reload让systemd重新读取配置,然后才能用systemctl restart 服务名正常重启。如果跳过daemon-reload,systemd可能还在按旧的配置运行。

systemctl status 服务名这个命令,信息量非常大。除了显示服务当前状态(active running是正常,failed是启动失败,inactive dead是未运行),还会显示主进程PID、最近几次日志记录,以及关键的错误信息。排查服务为什么起不来,第一条命令就应该是systemctl status,它把90%的线索都摆在你面前了。如果服务启动失败,想看完整日志,用journalctl -u 服务名 -n 100查看最近100行,加-f参数可以实时跟踪,效果类似tail -f。

4.3 git、docker与containerd:现代Linux的核心素质

现在的服务器环境,没有git和docker寸步难行。git最基础的操作是git clone、git add、git commit、git push、git pull,但我更想强调一个运维场景:在服务器上更新代码。很多人喜欢直接在服务器上改代码,这是极其不专业的做法。正确流程是:本地改代码,push到远程仓库,服务器上git pull拉取更新。如果服务器上的代码与远程冲突,优先用git status查看冲突文件,用git diff确认改动差异,再决定怎么解决。

容器这一块,docker和containerd的关系要搞清楚。docker是一个完整的容器管理工具,containerd是底层的容器运行时,docker本身也在用containerd来创建和管理容器。现在生产环境大量使用Kubernetes,而K8s默认的运行时就是containerd。所以实际操作中,你会发现服务器上既有docker命令,又有crictl或ctr命令。

docker常用命令:docker ps查看运行中的容器,docker ps -a查看所有容器包括已退出的,docker images查看本地镜像,docker exec -it 容器名 /bin/bash进入容器内部,docker logs -f 容器名查看容器日志,docker restart 容器名重启容器。如果是直接使用containerd的环境,用crictl替代docker CLI,命令风格类似:crictl ps、crictl images、crictl exec -it 容器名 sh。

这地方有个容易被新手忽略的坑:容器内部安装的软件在容器重建后会全部丢失,所以不要把容器当成虚拟机对待。配置文件要挂在外部存储,数据要写在volume里,日志要输出到标准输出,由统一日志收集系统处理。我在生产环境看到过有人把数据库直接放在容器内部,没有挂载外部磁盘,结果容器一重启,数据全没了,那种绝望感我至今记忆犹新。

5. 安全自查与提权防护,守住系统的最后底线

Linux安全这块,最容易被忽视也最致命。很多人觉得服务器不出事就行,但一旦出事就是大事。作为一个老运维,我强烈建议每个管理员都定期做安全自查。这一节不讲攻击手法,只讲自查思路和防御命令。

5.1 权限与审计:用最小权限原则自查你的系统

Linux权限模型的核心就三点:用户(user)、组(group)、其他人(other),以及读(r=4)、写(w=2)、执行(x=1)三个权限位。权限值的计算很简单,比如rwxr-xr-x对应755,rw-r--r--对应644。但真正体现水平的是你会不会用特殊权限位:setuid(s)和setgid(s)。

setuid权限需要特别注意。一个可执行文件如果带setuid位,那么任何用户执行它时,进程的有效用户ID都是文件所有者,典型的例子是/usr/bin/passwd。如果一个其他用户可写的文件被设置setuid且所有者是root,那就是一个现成的提权漏洞。自检命令很简单:

# 找出系统中所有带setuid位的可执行文件 find / -perm -4000 -type f 2>/dev/null

同样的道理,查看全局可写文件,find / -perm -002 -type f 2>/dev/null,这些文件如果被恶意篡改,后果不堪设想。我每个月巡检服务器的时候都会执行这两条命令,对照文件列表,新增的条目哪怕是可疑的都值得追查原因。

sudo权限的管理也是安全重地。运行sudo -l查看当前用户有权限执行哪些命令,如果输出显示类似(ALL) NOPASSWD: ALL,那这个账号就等同于root,必须严格保护。我还习惯定期检查/etc/sudoers文件,重点关注有没有异常的命令授权,比如某个普通用户被授权以root身份执行vim,表面上看起来无害,但vim可以打开任意文件,甚至通过!命令执行shell,这跟直接给root没有区别。

5.2 应急响应思路:服务器被入侵后的第一组命令

安全话题绕不开应急响应。假设你发现服务器有异常,比如CPU持续飙高、对外发送大量流量、出现不明进程时,不要慌,按照下面这个顺序执行命令:

# 第一,查看当前登录的用户和登录来源 who w last # 第二,查看系统所有用户的登录shell和UID cat /etc/passwd | awk -F':' '{print $1, $3, $7}' | sort # 第三,查看监听端口和对应进程 ss -antp # 第四,检查进程树,关注可疑进程路径 ps -ef pstree -a

这套组合拳打下来,大多数入侵的痕迹都会暴露。核心思路是“由外向内找线索”:先看谁登录了系统,再看系统里有什么异常账号,然后看网络层有没有可疑监听,最后看进程层有没有可疑程序。

排查过程中切忌直接用kill杀死可疑进程。正确的做法是先用ls -l /proc/PID/exe查看这个进程的真实可执行文件路径,再用cat /proc/PID/cmdline查看启动参数,把这些信息保存下来再决定下一步。很多恶意程序会在被kill后自动重启,清理源头才是解决问题的关键。

我见过有人在应急响应时慌了神,直接把怀疑是恶意的进程kill了,结果权限反弹shell断了,黑客立刻警觉并把服务器上的日志全部清空,反而失去了所有可追踪的痕迹。网络安全不是黑客电影,冷静、有序、保留证据,才是正确态度。

6. 十年经验浓缩的避坑清单,帮你少走三年弯路

最后这部分不讨论具体命令,但我觉得比任何一条命令都重要。这些是十年摸爬滚打总结出来的心得,分享给大家。

第一,不要在生产环境用root直接操作。能给你带来方便,也能让你一个命令毁掉整个系统。平时用普通用户登录,需要提权时用sudo,每一步操作都有审计记录。作为运维,被sudoers限制反而是一种保护。

第二,无论什么时候,删除文件前先备份。哪怕是看着无关紧要的配置文件,备份也能让你在出错时快速恢复现场。我的习惯是删除操作之前先把目标文件打包:

tar -czf config_$(date +%Y%m%d).tar.gz /etc/nginx/

后面再加成生成备份文件的日期,回滚时一目了然。

第三,日志是你最好的朋友。服务器不会说话,但它所有的行为都会记录在日志里。安装新软件后先确认日志文件位置,排查问题时先看日志,不要一头扎进配置文件里瞎猜。学会在/var/log目录下找到对应日志,就迈过了新手和老手的分界线。

第四,也是最后一点:持续学习比什么都重要。Linux每年的内核都在升级,容器技术、自动化运维工具不断推陈出新,没有一门技术学完就一劳永逸。但好消息是,基础命令的底层逻辑几十年没变过,掌握了文件、文本、权限、网络这些核心概念,学什么新工具都只是换个壳子。

我面试的时候经常问一个问题:如果服务器突然ping不通了,但你从云平台控制台能看到CPU占用100%,你的排查思路是什么?能答出用top看进程、用ss看连接、用journalctl看日志、再结合业务特征定位的人,我一定会给过。因为这种思维,才是Linux真正教会你的东西,而不是那几十条命令的排列组合。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询