刚接手一台 Linux 服务器时,对着黑底白字的终端,很多人会先愣上几秒。鼠标、桌面、图形界面全都不见影,只剩下一个光标在等你敲命令。那行command not found会更让人怀疑人生——明明教程里写得好好的,怎么一到自己手上就失灵了?
我见过不少人试图靠死记硬背来搞定 Linux 常用命令,并为此收集了几百页“最全命令速查手册”,但这种做法在实操里基本坚持不过三天。命令越多,脑子越乱,换个操作系统版本,连包管理器的名字都对不上。真正有效的方式,是把命令放在一条清晰的“脉络”里:文件怎么处理、权限怎么理解、进程怎么排查、系统状态怎么看。脉络清楚了,命令就只是一个个挂在树上的工具,用的时候自然能取下来。
这篇内容就是按这个思路整理的。不追求把上千条命令全部塞进一篇文章里,那是查手册的事。这里只挑那些天天在用的命令,把它们串成一条线,让你照着走一遍,能在真实的服务器环境里干起活来不慌。适合刚入门 Linux、准备当运维、或者做开发但经常要碰服务器的同学参考。
1. 先把命令体系拆出主线
1.1 Linux 命令不需要背,关键看怎么归类
很多人学命令的第一反应是找一份“Linux 命令大全”,从 a 到 z 排得整整齐齐,甚至还有人拿着单词表去背:abrt-动作集、alias-别名、apachectl-阿帕奇控制口……背了三个月,一上生产环境还是不会用。
问题出在分类方式上。按字母表归类,只是帮你把“词”抄了一遍,没有告诉你这些命令在什么场景下按什么顺序出现。真正的用法是跟着工作流程走的:你收到一台服务器,要先看系统状态;你要部署一个应用,要经历装软件、改配置、起服务、查日志这个过程;服务出了问题,要沿着网络、端口、进程、磁盘一层层排查。命令本身只是这条流程中的一个个动作节点。
我自己的习惯是把常用命令按“资源”划分成三条主线:
- 文件系统:一切操作的对象都是文件。要会看、会建、会删、会移动、会改权限。
- 进程与服务:系统里跑的东西是进程。要能找到它、观察它、中止它。
- 网络与系统状态:排查问题时,要能判断是网络不通、端口没监听、还是磁盘满了。
这三条线基本覆盖了日常高频操作。什么 tar 打包、crontab 定时任务、systemctl 管理服务,都是在这三条主线之上衍生出来的。主线不牢,后面全是空中楼阁。
1.2 用一条真实任务串起所有命令
我给别人讲命令时,喜欢举一个特别日常的例子:你在某台服务器上要发布一个应用。整个过程大体是这样:
先要确认环境——系统版本、磁盘空间、内存够不够;然后安装依赖包,把应用文件拷贝过去;修改配置文件,把监听端口调成想要的;启动服务,刷新状态;最后打几行日志看一眼是否正常,或者 curl 一下确认端口有响应。
只看这个流程,你会发现命令完全是自动浮出水面的。确认环境要用cat /etc/os-release、free、df;拷贝文件要用cp或scp;改配置要用vim或sed;启动服务要用systemctl或者直接执行二进制文件;查日志用tail和grep;验证端口用ss和curl。
这一串操作,没有任何一条需要刻意去背。它们是顺着任务自己浮现的。这也是“脉络”的价值:命令不是孤立的单词,而是解决问题的工具链。文章后面就用这个思路逐一展开。
2. 文件操作:Linux 世界的“主干道”
2.1 先回答三个问题:我在哪、有什么、去哪
Linux 的一切操作都建立在文件系统之上。进了终端,第一步不是急着输入各种命令,而是先弄清当前所处的位置。pwd这个命令会告诉你当前工作目录的完整路径,就像你在商场里先看一眼楼层平面图,心里才有底气。
ls则是列出当前目录下的内容。裸敲ls只会显示最基础的文件名,真正干活时几乎都要加参数。ls -la是使用频率最高的组合:-l显示详细信息,-a显示包括点开头的隐藏文件。输出中有个细节很多人容易忽略——每一行最前面的字符是文件类型,d表示目录,-表示普通文件,l表示软链接。后面跟着的权限位、属主属组、文件大小、修改日期,每列信息都能派上用场。
cd是切换目录的命令,但它不需要死记。用几次就熟了:cd /etc去系统配置目录,cd ~回家目录,cd -回上一次所在目录。要特别提一下cd -,这个命令在排查问题时很实用。假设你在/var/log下看了半天日志,又跑到/usr/local下去翻了配置,想回到之前的目录,一个cd -就解决,不用再敲一遍长路径。
初次进入一台新服务器,我会先做一轮“环境侦察”:pwd看自己在哪,uname -a看系统内核版本,ls /看看根目录下有哪些关键目录。这套动作能让你在陌生环境里迅速建立方向感。
2.2 文件的增删改查:touch、mkdir、cp、mv、rm
掌握了“在哪”和“去哪”,就开始动手操作文件。日常管理文件用到的五个命令分别是touch、mkdir、cp、mv、rm。
touch表面意思是“摸一下”,实际作用是创建一个新的空文件,或者更新已有文件的时间戳。我更多是用它来快速生成一个占位文件,比如测试脚本时先touch test.txt验证路径是否正确。
mkdir负责创建目录。新手容易踩坑的是创建多级目录时忘记加-p,导致报错。比如你要一次创建/data/logs/2024,直接mkdir -p /data/logs/2024就能把所有层级一并建好,不用逐层创建。这个参数属于那种“知道一次就永远忘不掉”的。
cp复制文件,mv移动文件。有个细节:mv不只是移动,它同时承担“重命名”的功能。mv old.txt new.txt,文件还在原地,名字换了。这个特性在修改配置文件时很常用:先mv app.yaml app.yaml.bak备份一份,再动手改原文件,出问题还能回滚。
rm是删除命令,也是无数事故的源头。rm -rf这三个参数组合在一起,意思是“递归删除且不提示”,一旦路径敲错,后果很难挽回。我身边有个同事曾经深夜在服务器上执行rm -rf /usr/local/,粗心把路径少了末尾一个子目录名,整个应用目录被清空,好在有备份才没酿成大祸。给新人的建议很直接:不要在 root 用户下随意敲rm -rf,不确定路径时先ls确认,批量删除前先cd到目标目录再执行相对路径,这些习惯能救命。
2.3 通配符与链接:让命令更好用的隐藏技巧
当文件数量多起来以后,裸敲命令就不够用了。通配符就是在这里发挥作用的。
*匹配任意长度字符,?匹配单个字符,[]匹配一个范围内的字符。比如目录里有access.log、error.log、access.log.1、access.log.2,想删除所有历史日志,可以执行rm access.log.*。注意这样不会动到access.log本体,正好符合“保留当前日志,只清历史”的诉求。
软链接和硬链接也是文件操作里绕不开的概念。软链接(ln -s)相当于一个快捷方式,它记录的是目标文件的路径,如果原始文件被删除,链接就失效了。硬链接则是指向同一个物理文件内容的另一个入口,删除任何一方都不会影响另一方,只有当所有硬链接都被删除,文件才算真正消失。
日常操作中,软链接的使用频率远高于硬链接。最常见的场景是日志目录迁移:磁盘快满了,要把日志挪到另一块大分区,又不想让应用改配置,那就ln -s /new-disk/logs /var/log/app,应用依然往/var/log/app写,实际落盘却到了新分区。这个操作在真实的服务器维护中用得极多。
3. 文本处理:效率的分水岭
3.1 看文件内容的五种“姿势”,别只会 cat
很多人的文本查看命令只认识一个cat,其实它只是“最基础”的那一种。cat会把整个文件内容一次性输出到终端,适合看几十行的小配置,一旦遇到几百 MB 的日志文件,终端会被刷屏刷到卡死,你根本找不到想看的信息,最后只能按Ctrl+C逃生。
更好的做法是按场景选择:
- 小文件、要快速浏览全部内容:
cat够用。 - 大文件、需要分页翻看:用
less。它可以按方向键上下滚动,按/搜索关键字,按q退出。读大型日志时,less是最顺手的工具。 - 日志是动态增长的、想实时跟踪最新内容:用
tail -f。这条命令会一直停留在“监听”状态,新写入的行会自动显示出来。调试程序时开着tail -f,相当于给日志文件装了一个实时监视器。 - 只想看文件的开头部分:
head -20能打印前 20 行,常用于查看配置文件的头部注释或检查生成文件的格式。
grep算是一个“筛选”型查看器。它能从文件内容里按关键字过滤出匹配的行,最常用的套路是在日志里找错误信息:grep -i "error" app.log。-i忽略大小写,-r递归搜索目录,-v排除匹配行,-c输出匹配行数而不是内容。把grep和tail组合成tail -f app.log | grep "ERROR",能实现“只实时监控日志中的错误行”的效果。这套操作几乎是定位线上问题的起手式。
3.2 管道思维:把命令串成流水线
管道符号|可以说是 Linux 命令体系里最巧妙的设计。它的含义很简单:把前一条命令的输出,当作后一条命令的输入。就这么一个概念,让单个命令变成了可以无限组合的“积木”。
我来举一个实操例子。某次线上排查,我需要统计访问日志里哪个来源 IP 最频繁,判断是不是有异常请求。一条命令搞定:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20这行命令的意思是:读取日志文件,用awk提取每行的第一列(也就是来源 IP),用sort排序,uniq -c统计每个 IP 出现的次数,再按次数倒序排列,最后取前 20 名。整个过程一气呵成,不用写脚本,不用打开 Excel,直接在终端里出结果。
sort、uniq、wc这几个命令单独看都很不起眼,一旦和管道配合,威力立刻就不一样。wc -l统计行数,sort -n按数值排序,uniq -c统计相邻重复项的次数。理解管道的关键,是记住“每个命令只做好一件事,然后把结果交给下一个”。日常排查中,把日志拆成流量统计、错误分类、时间分布,基本都在用这套组合拳。
3.3 正则表达式:不用背,会用这几个就够
提到文本处理,正则表达式是绕不开的话题。我对很多新同学是这么说的:别去背那些复杂的正则符号,工作中真正高频出现的其实不超过 10 个。^匹配行首,$匹配行尾,.匹配任意字符,*表示前一个字符重复任意次,[]表示字符集。有了这些,已经能应对绝大多数搜索需求。
例如要从日志里找出所有以2024-06-01开头的行,可以写grep "^2024-06-01" app.log。想查出请求方法为 POST 或 PUT 的行,写grep -E "POST|PUT" app.log。grep -E启用扩展正则,|表示“或”的关系。
从难易程度上说,基础正则已经覆盖了日志关键字过滤、配置项匹配、文本内容提取等绝大多数场景。真正复杂的正则,比如回溯引用、零宽断言这些,用到的时候再查也来得及,不必一开始就死磕。
4. 权限与进程:由文件到运行中的系统
4.1 权限模型:三个角色、三组权限、三个数字
文件操作熟练了,就该面对 Linux 系统里最容易让人一头雾水的部分——权限。理解权限,先要理解“三个角色”:文件属主(u)、属组(g)、其他用户(o)。每条路径下用ls -l看到的权限位,比如-rw-r--r--,拆开看就是三个角色分别对应的权限。
每个角色有“三个权限”判定:r读、w写、x执行。文件权限和目录权限的含义稍有不同,这一点很容易被混淆。目录的读权限决定了你能否列出目录里的内容,执行权限决定你能否进入该目录,写权限决定你能否在该目录下创建和删除文件。也就是说,光有目录的读权限没有执行权限,进了目录也无法查看文件列表。
把角色和权限合起来,就得到了“三个数字”的写法。r记 4 分,w记 2 分,x记 1 分,没有权限记 0 分。于是rwx对应 7,r-x对应 5,r--对应 4。chmod 755 script.sh的含义是属主拥有读、写、执行权限,属组和其他用户只有读和执行权限。这套数字写法在配置脚本、设置部署目录时高频出现。
日常操作中,新写出来的脚本经常会遇到“权限不够”的尴尬:bash: ./xxx.sh: Permission denied。通常执行chmod +x xxx.sh就能解决。chown则用来修改文件归属,比如把某个目录交给某用户管理时,执行chown user:group /data/app即可。
4.2 用户与组:多用户环境的常识
权限之外,Linux 是一个天然的多用户系统。系统里每个用户有独立的家目录,用户之间通过组来共享资源。
新加一个用户用useradd,设置密码用passwd。组的管理涉及useradd -g指定主组、usermod -aG附加组。这些命令单看不多,但配合权限模型时能解决很多实际问题。
我提一个切身经历。某次发布系统,某个服务运行时报“权限不足”,应用是以普通用户身份启动的,但日志目录的属主是 root。一开始图省事,我直接chmod -R 777把目录权限放开,结果确实不再报错了,但这个做法非常不推荐。777意味着所有用户都能读、写、执行目录里的任何文件,等于是给系统门户大开。后来我把目录属主改成了应用用户:chown -R appuser:appuser /data/logs,问题彻底解决,也没有引入新的风险。处理权限问题,正确的顺序一定是“调整所属关系”优先于“粗暴放开权限”。
4.3 进程管理:从 ps 到 kill 的一整套动作
文件跑起来之后就成了进程。看进程最常用的命令是ps。ps aux会列出所有用户的所有进程,并展示 CPU、内存占用率、启动命令等关键信息。看到某进程 CPU 占用特别高,或者怀疑某个服务是否有跑到内存里,ps aux是第一时间要敲的命令。
ps是静态的快照,想持续观察系统状态就用top。它会实时刷新,按 CPU 使用率排序,top输出最上方还有系统负载均值(load average),三个数字分别代表过去 1 分钟、5 分钟、15 分钟的系统负载。如果平均负载长期高于 CPU 核数,说明系统已经过载,需要排查是哪个进程在消耗资源。
进程出问题需要中止时,用kill。kill本质是向进程发送一个信号,默认的终止信号容易被进程忽略或做一些收尾工作。kill -9则是强制终止,内核直接回收资源。这里有个常见的操作误区:上来就kill -9,导致进程来不及处理缓存和释放资源,反而留下脏数据。正确的顺序是先kill,过几秒看进程还没退,再kill -9收尾。
5. 网络与系统状态:排查问题的眼睛
5.1 网络排查四件套:ping、ss、curl、dig
服务器本身的文件、进程都掌握了,剩下的高频场景就是网络问题。网络排查有一套固定的排查顺序,我习惯从最外层往内层收。
先用ping判断网络通不通。ping走的是 ICMP 协议,能通说明网络链路没问题,能到达对端主机。如果ping不通,就要考虑防火墙、网关、路由等环节,这是排查的起点。
接下来是ss,用来查看本机的端口监听情况。ss -tlnp能列出所有 TCP 监听端口以及对应的进程信息。-t只看 TCP,-l只看监听状态,-n显示数字地址不解析域名,-p显示进程名和 PID。应用启动后,用这条命令确认它是否真的监听在预期端口上。比如你启动了一个服务,配置里写了监听 8080,结果ss -tlnp没有显示 8080,那基本可以断定服务没起成功,或者配置根本没生效。
curl则用来验证 HTTP 服务能不能正常工作。curl -I http://localhost:8080只请求头信息,返回HTTP/1.1 200 OK就说明服务正常响应;返回502、404之类的状态码,就要顺着报错往下查。配合curl -v还能看到完整的握手过程,调试接口时非常有用。
至于dig,主要用来做 DNS 解析测试。怀疑域名解析有问题时,dig example.com可以看到解析结果,对比是否指向预期 IP。这几个命令按顺序走一遍,网络层面的问题基本都能定位到具体环节。
5.2 系统资源查看:磁盘、内存、负载一次看明白
服务起不来、服务器变卡,很多情况下不是代码的问题,而是系统资源被打满了。
磁盘空间查看用df。df -h以人类可读的方式显示各分区使用情况,哪个分区快满了一目了然。du -sh /var/log则是查看某个目录占用多少空间,配合du -sh * | sort -rh | head能快速找出哪个目录最占地方。排查磁盘问题时,这个组合非常高效。
内存用free -h查看。除了一眼扫过 total、used、free 之外,我更关注 available 这一列,这个值表示“在不触发交换的情况下还可以分配多少内存”,相比 free 更能反映真实压力。看到 available 已经很小,就要留意是不是进程存在内存泄漏。
top和uptime能反映整体负载。uptime输出的三个负载值中,如果超过 CPU 核数,说明任务队列已经积压。举一个具体场景:某服务器 CPU 一直 100%,top排序后看到一个进程占用 200% 以上,说明它多线程吃满了多核 CPU。这时候要么优化代码,要么升级资源配置,单纯 kill 进程治标不治本。
还有一个容易忽略的资源是文件句柄,查看系统当前文件句柄限制用ulimit -n,默认值偏小时,高并发服务会出现too many open files报错。这个坑在部署高负载服务时经常出现,需要在启动前检查并适当调大。
5.3 软件安装的“包管理器”思维
Linux 系统安装软件,不是去官网下载一个坏的安装包然后双击。包管理器才是正途。常见的包管理器有 Debian 系的apt,CentOS / RHEL 系的yum和新版的dnf。
包管理器解决的不仅是“把文件放进去”的问题,更重要的是依赖关系。很多软件依赖动态库和其他工具包,手动安装容易陷入“装 A 要 B,装 B 要 C”的无底洞。包管理器会自动把依赖一并装好,卸载时也会清理相关依赖。
日常用得最多的命令就那几个:apt update更新软件源索引,apt install安装软件,apt remove卸载软件,apt list --installed查看已安装列表。这些命令的正确顺序是“先 update 再 install”,否则可能安装到源里已经过时的版本。
判断某个命令是否已经安装,用which。which nginx能返回 nginx 可执行文件的路径,什么都没返回就是没装或者没进 PATH。whereis则能搜索更多相关路径,比如帮助文档、配置文件所在位置。装完软件后习惯性地which一下,能快速确认安装是否成功。
6. 常见问题与排查技巧实录
6.1 权限被拒:90% 是这两类问题
终端里最让人沮丧的无非是Permission denied。这类报错绝大多数时候是两类原因之一:属主不对,或者缺少执行权限。
文件属主不对,意味着当前用户和文件归属的用户不一致,系统拒绝你碰这个文件,和文件本身设置多安全的权限无关。比如应用目录属于 root,但你用普通用户操作,就会报Permission denied。解决办法是chown -R appuser:appgroup /data/app。这个方法后面也适用:任何目录报权限问题,先看属主是谁,再看当前用户是谁,两者对不上,直接改归属。
缺少执行权限的场景集中在运行脚本时。脚本文件刚创建出来默认权限是-rw-r--r--,没有 x 权限,执行./start.sh就会报错。处理方式是chmod +x start.sh。还有一类容易踩坑的情况是,文件本身有执行权限,但所在目录没有执行权限,导致无法进入。这种问题肉眼不太好查,建议通过namei -l /data/app/start.sh逐层查看路径权限。
6.2 端口被占:学会区分“进程占用”和“没监听”
启动服务时常见的报错是port already in use。这个问题的定位很简单,ss -tlnp | grep 8080一查便知哪个进程占着端口。
在实际处理中,我发现新手更容易掉进另一个坑:本机访问端口正常,但外部访问不通。排查思路应该是:先在本机curl http://localhost:8080,通就说明服务正常;再从别的机器ping服务器 IP,通说明网络层没问题;最后检查防火墙规则和云平台的安全组是否放行该端口。很多时候不是服务本身的问题,而是防火墙把入站流量挡住了。iptables、ufw、firewalld 是三类常见的前端防火墙,都需要检查。
6.3 磁盘满之后,为什么你的服务莫名其妙挂了
磁盘空间满的表现很有迷惑性。服务本身还在跑,但一写日志就报错,程序看起来像“卡死”了。df -h一看,根分区 100%。这时候第一反应应该是清理大文件,而不是重启服务——重启之后再马上被写满的情况也不少见。
清理日志有一定的技巧。直接rm日志文件并不是最优解,尤其当一个进程已经打开了该日志文件时,删除文件后空间不会立刻释放,因为进程的文件句柄仍然指向它。这种情况在占用磁盘排查中最让人费解:“明明删了文件,df 还有这么多空间。”正确的做法是用truncate -s 0 /var/log/app.log清空文件内容,保留文件本身,进程继续写日志才会正常。真到需要物理删除大文件时,再用rm,并确认没有进程持有句柄。
6.4 命令打了却提示 not found,但软件明明装过了
还有一类高频问题:明明装过了某个软件,执行命令却提示command not found。这通常不是没装上,而是命令所在目录不在当前 PATH 环境变量里。
比如某些源码编译安装的软件默认装在/usr/local/bin,如果这个路径不在 PATH 中,命令就无法直接执行。处理办法有三条路:直接运行完整路径/usr/local/bin/xxx;把路径导出到 PATH 环境变量export PATH=$PATH:/usr/local/bin;或者/usr/bin下做一个软链接,让系统默认路径也能找到它。
这个问题的另一层含义是,看到一个命令在执行时立即应该想到查which和type,确认系统是在哪个路径下找到它的。这些命令本身,也是 Linux 命令脉络里的关键节点。
结合我自己一路踩坑的经验,最重要的一点是:不要试图一次性记住所有命令。刚开始只要把“文件操作、文本处理、权限、进程、网络、系统资源”这六个方向的关键命令练熟,遇到问题时再顺藤摸瓜地扩展即可。把真正的使用场景装进脑海里,命令自然会在需要时出现在指尖。真到了需要深入某个方向的时候,再回去查手册、读 man page,那时候的理解速度,会比一开始就把自己埋在命令的海洋里,要快得多。