
1. 别急着背命令先搞清楚 Linux 命令的本质每年都有大量新人涌入 Linux 这个圈子有的是运维转岗有的是开发要部署环境还有的是学生做实验。大家干的第一件事出奇一致找一份Linux 常用命令大全开始背。我也干过这事儿说实话背完前三十条的时候还挺有成就感等背到一百条往上就开始乱了今天学的明天忘明天学的后天又忘最后真正写命令的时候脑子里一片空白。后来我才意识到问题不在记忆力在于我把 Linux 命令当成了一堆孤立的单词去记。实际上Linux 命令本质上就是一组运行在 shell 里的程序每条命令的本质都可以拆成三件事它接受什么输入、它做了什么事、它产生什么输出。你把这三件事想明白了命令之间的共性就浮现出来了根本不需要死记硬背。我举个最直观的例子。ls和cat这两个命令看起来八竿子打不着一个是列目录一个是看文件内容。但底层逻辑惊人地相似都有一个路径参数都支持一堆选项都有标准输出。你再往后学grep、awk、find会发现它们全都是这个套路。理解了这一层你就不再是背命令而是用命令了。还有很多人会问到底要记多少条命令才算够我的回答可能跟很多教程不一样不看你记了多少条看你能组合多少条。单条命令只是积木真正拉开发差距的是你能否用管道把好几条命令串起来解决一个实际问题。比如排查一个问题你可能要用ps找进程、用grep过滤、用sort排序、用awk提取字段、用head看前几行一条命令链下来问题就水落石出。这才是 Linux 命令的真正魅力。这篇文章我不会给你列一份两三百条的大而全清单那种东西搜索引擎一抓一大把。我打算换个思路从命令的本质出发把最常用、最核心、最容易被忽略的知识点掰开揉碎讲清楚配上实际场景和你直接能抄的用法。不管你是刚摸到 Linux 的纯小白还是已经干了半年一年的初级运维这篇文章应该都能让你有收获。在我正式开始之前先做个小提醒。学习 Linux 命令最忌讳的就是看会了一定要动手敲。你看着我的文章觉得哦原来是这样跟你自己打开终端敲一遍完全是两种体验。后面每一条命令我都建议你亲手在环境里跑一遍哪怕只是几条简单命令的排列组合也能帮你建立肌肉记忆。2. 核心命令的底层逻辑从文件、进程、文本三个维度切入如果把 Linux 命令按功能分个类市面上有各种分法但我在实际工作中最常用的框架是三个维度文件与目录、进程与系统、文本处理。这三个维度覆盖了 Linux 运维和开发中八九成的场景我把每一个维度的核心命令掰开讲讲不只是告诉你这个命令是干嘛的更重要的是说清楚它背后的逻辑和最佳实践。2.1 文件与目录操作这些命令你天天用但真的用对了吗文件操作是整个 Linux 的根基。在 Linux 世界里一切皆文件这句话不是鸡汤是设计哲学。你操作文件的能力某种程度上就代表了你操作 Linux 的能力。先说ls很多人从头到尾就用一个ls -l但其实ls有很多讲究。比如ls -lh会把文件大小显示成人类可读的格式ls -lt按修改时间排序ls -ltr按修改时间反向排序这在找最新日志文件的时候特别好用。还有一个冷门选项ls -d */只列出当前目录下的子目录不列出里面的内容配合find使用的时候非常顺手。再说cd这个命令简单得不能再简单但有个细节很多老手都会忽略cd -可以在上一次和当前目录之间切换。你在两个目录之间反复横跳的时候这个快捷键比敲绝对路径高效得多。另外很多人不知道cd后面可以跟变量比如你用了dir$(pwd)之后就可以随时用cd $dir跳回来。cp、mv、rm这三个命令是文件操作的三驾马车也是最容易酿成事故的三个命令。每次提到它们我都要多啰嗦两句因为太多次看到有人在生产环境里把rm -rf用在了不该用的地方。cp -r是递归复制目录这个必须带不然复制目录会报错。cp -p保留原文件的权限、时间戳等属性在做备份或迁移的时候很有用。mv在同一个文件系统内是 rename 操作速度快且不消耗额外磁盘空间跨文件系统才是真正的拷贝加删除速度慢且会占用临时空间。理解了这点你就能解释为什么同样一个 mv有时瞬间完成有时却要等很久。rm -rf是递归强制删除这条命令如果不小心在企业服务器的根目录或重要数据目录执行后果不堪设想。我建议在所有需要删除的操作里先执行ls确认目标路径再执行删除。如果你用的是 CentOS 或 Ubuntu可以考虑给rm -i设置别名让你在删除每个文件前都确认一次。还有两个命令是文件系统管理的好帮手很多人却不太重视。du用来统计目录大小排查磁盘空间的时候离不开它常用的是du -sh *一键列出当前目录下每一项的大小。df -h则是查看整个磁盘分区使用情况和du搭配使用可以快速定位是哪个目录在疯狂吃磁盘。至于软链接和硬链接这是初学者最容易混淆的概念我在这里顺便讲透。ln -s 源文件 目标文件创建的是软链接你可以把它理解为 Windows 的快捷方式它本身是个独立文件有自己的 inode内容是指向源文件的路径。ln 源文件 目标文件创建的是硬链接它和源文件共享同一个 inode相互之间是平等关系删除其中一个另一个内容依然存在。实际操作中软链接用得多得多比如很多应用的安装目录就是通过软链接指向真实数据盘。2.2 进程与系统状态从 ps、top 到 systemctl 的排查链路Linux 系统出了卡顿、负载高、进程异常第一反应肯定是看进程和系统状态。这一块的核心命令我按排查链路给你串起来。第一条命令永远是top或htop。top是 Linux 自带的htop需要额外安装但显示效果更友好支持鼠标操作。top启动之后你第一眼看负载平均值load average的三个数字1 分钟、5 分钟、15 分钟的系统负载。如果这三个数字持续高于你的 CPU 核心数就说明系统已经超负荷运转了这时候需要按P键按 CPU 使用率排序按M键按内存使用率排序快速找出罪魁祸首。top里既然能看到可疑进程下一步自然是用ps去拉取更详细的进程信息。我最常用的是ps aux和ps -ef两个都能列出所有进程区别在于输出格式ps aux里的注释信息更丰富CPU 和内存占用率都有。如果你想精确找某个进程用ps aux | grep 关键词但注意这条命令会把 grep 自己匹配进去可以用ps aux | grep 关键词 | grep -v grep排除掉或者直接用pgrep -l 关键词更干净。进程找到了要处理它就用kill。最简单的kill PID发送 SIGTERM 信号请求进程正常退出。如果进程不听话用kill -9 PID发送 SIGKILL 信号强制杀死。这里我要特别提醒一句kill -9是最后手段不是首选手段。很多服务的数据在内存里还没落盘就被 SIGKILL 杀掉轻则丢数据重则整个服务起不来。正确顺序是先 SIGTERM 让它自己收拾完退出等几秒不行再上 SIGKILL。top和ps告诉我们的是某个瞬间的系统状态但要判断问题是不是持续性的需要看历史数据。sar命令如果装了 sysstat 包就能用它可以查看历史某段时间的 CPU、内存、IO 数据。排查那种一到半夜系统就卡的诡异问题sar -q -f /var/log/sa/saXX翻历史记录是最靠谱的方式。说完这些进程层面的命令再往上走一层就到了服务管理层面。新一点的 Linux 系统都默认用 systemd 管理服务核心命令是systemctl。日常运维里用得最多的就这几个systemctl start/stop/restart启动停止重启服务systemctl status查看服务状态systemctl enable/disable设置开机自启。systemctl status的输出非常有价值它会告诉你服务当前的状态、主进程 PID、最近的内存占用、最下面的日志片段这些信息在排查服务异常时能节省大量时间。和 systemctl 配套的是journalctl这是查看系统日志和 service 日志的核心工具。很多人刚接触的时候只会用journalctl -u服务名看看最近的日志实际上它的过滤功能非常强大。journalctl --since 10 minutes ago只看最近十分钟的日志journalctl -p err只看错误级别的日志journalctl -u 服务名 --since today | grep 关键词把时间、服务、关键词三层过滤组合起来精准定位问题。这套组合拳下来大部分服务异常都能在几分钟内找到线索。2.3 文本处理三剑客grep、sed、awk 的真实应用场景如果说文件与进程是 Linux 的骨肉那么文本处理就是 Linux 的灵魂。Linux 下的一切配置、日志、数据几乎都是以文本形式存在这导致了一个结果谁掌握了文本处理谁就掌握了 Linux 的高效之道。文本处理三剑客是grep、sed、awk。这三个命令每一个单拿出来都够写一本书但实际工作中只用得上其中一小部分能力。我按使用频率和实用价值讲一下最核心的用法。grep是文本搜索的第一选择也是最不需要学就能上手的命令。但有几个选项我希望你务必记住grep -r递归搜索目录里的所有文件这在翻配置和代码的时候极其好用grep -v反向匹配把不符合条件的行过滤掉grep -c统计匹配行数注意它不是统计出现次数而是行数一行里有多个匹配也只算一行。这几个选项配合使用比如grep -r error /var/log/ | grep -v ignored可以快速在海量日志里筛出真正的报错。sed是流编辑器它的核心工作模式就是读一行、处理一行、输出一行全程不修改原文件。最有价值的能力是替换和删除。替换用sed s/旧内容/新内容/g那个g表示全局替换不带的话一行里只替换第一个匹配项删除用sed /关键词/d在输出里删掉包含关键词的行。这些操作配合-i参数可以直接写回文件比如全局替换配置里的 IP 地址sed -i s/10.0.0.1/192.168.1.1/g /etc/nginx/nginx.conf一条命令就能完成原本需要手动逐行修改的繁琐工作。awk是这三兄弟里最强大的也是初学者最容易望而却步的。其实你只需要抓住一个核心概念awk 把每一行按分隔符切成若干字段$1是第一个字段$2是第二个字段依次类推$0是整行。默认分隔符是空格或制表符用-F参数可以自定义分隔符。举个例子你想从/etc/passwd文件里提取所有用户名这个文件每一行用冒号分隔第一个字段是用户名一行命令就搞定awk -F: {print $1} /etc/passwd。还有两个最常用的 awk 模式BEGIN 和 END。BEGIN在读取第一行之前执行常用来打印表头或初始化变量END在读取完最后一行之后执行常用来输出统计结果。比如统计文件行数可以用awk BEGIN{count0} {count} END{print count} 文件名虽然wc -l一行就能完成同样的事但理解了这种模式往后做更复杂的统计就不在话下。三剑客的威力单看都不算惊艳但它们组合起来才是真正的核武器。管道符|把每个命令串起来前一个命令的输出变成后一个命令的输入一环接一环地处理数据。我给你一个实战场景现在需要找出系统里占用内存最高的前五个进程并展示进程名和内存占用。一行命令就能搞定ps aux --sort-%mem | awk NR1 {print $11, $4} | head -5这条命令链的每一步都是有含义的ps aux把所有进程的信息打出来--sort按内存占用降序排列awk把表头行跳过只取进程名和内存占比两列head只保留前五行。你不需要会每一处细节但你要能看懂每一环做了什么然后就能根据自己的需求去改、去拼。这才是 Linux 命令学习的精髓。3. 从格式化到提权一套命令通吃日常运维场景3.1 文件压缩、传输与下载tar、scp、curl 和 wget 的那些坑日常运维里除了在本地操作文件大量工作是在文件传输、打包备份、下载补丁和程序包之间来回切换。这一块命令多而杂但因为使用频率极高值得花时间彻底吃透。tar命令是打包压缩的绝对核心。有人记不住参数总抱怨tar难用其实你只需要记住两套固定组合打压缩包用tar -zcvf解压包用tar -zxvf。其中z表示 gzip 压缩c是创建v是显示过程f指定文件名x是解压。这个套路背下来其他花活都是在这个基础上做微调。比如tar -jcvf换成 bzip2 压缩压缩率更高但是更慢tar --exclude*.log -zcvf backup.tar.gz /data排除掉指定文件再打包这个在备份日志和大目录的时候特别实用。解压的时候也有个常见困惑tar 包会解压出来一个目录还是直接一波文件散在当前目录我建议解压前先跑一条tar -tvf 包名看看包内结构再决定要不要新建目录进去解压。文件传输出镜率最高的是scp和rsync。scp用起来简单直接从本地传到服务器就是scp 文件名 用户名服务器IP:/目标路径从服务器拉回来就是反过来写。但它有个缺点每次都全量传文件一多、量大速度就感人。这时候rsync的优势就体现出来了它的增量同步能力在传输海量文件时堪称神器。最常用的一条命令是rsync -avz --progress /本地目录/ 用户名服务器IP:/远程目录/-a是归档模式保留权限、时间戳这些属性-v显示详细信息-z传输时压缩--progress显示进度。rsync 特别适合做定时同步任务配合 cron 使用可以实现准实时的数据备份。下载文件这一块curl和wget是两个绕不开的工具。很多人不知道两者的区别我简单概括一下wget专精于下载curl则是一个传输工具它不仅支持下载更擅长与 HTTP 接口交互。我们的实际场景中下载一个软件包、一个脚本用wget就够了比如wget https://example.com/package.tar.gz加个-O还可以指定保存的文件名。而如果你要调试某个 API、发送 POST 请求、查看响应头那就必须用curl。比如curl -X POST https://api.example.com/v1/data -H Content-Type: application/json -d {name:test}又比如你只想知道某个地址是否可访问用curl -I https://example.com只看响应头就够不需要下载整个页面。理解了这两个工具的分工就不会再一头雾水地在到底该用哪个上浪费时间了。很多人还会忽略一条命令——telnet。虽然现在 telnet 本身因为明文传输已经被时代抛弃了但它的探测端口功能至今仍在无数运维的肌肉记忆里。比如排查网页打不开这类问题你可以用telnet 服务器IP 80来测试目标服务器的 80 端口通不通。如果端口通了会看到类似连接成功的反馈如果超时或拒绝连接问题大概率出在网络或防火墙层面。在服务器上如果没有 telnet 命令用nc -vz 服务器IP 端口也能达到同样的效果。这一招排查网络问题屡试不爽。3.2 用户与权限从 root 到 sudo身份切换的完整攻略Linux 是一个多用户操作系统用户和权限的管理是安全的核心。对于很多单人单机学习的用户来说可能觉得这一块距离自己很远但一旦你去公司碰生产环境用户权限混乱导致的悲剧随处可闻。这一块的内容我按看自己、看别人、切身份、提权限四个步骤来展开。看自己用的是whoami这个命令会直接告诉你当前登录的用户名。与之配套的id能输出更完整的信息包括 UID用户 ID、GID组 ID以及当前用户所属的全部附加组。id之所以重要是因为 Linux 权限并不是看用户名而是看 UID 和 GID你在/etc/passwd里能看到所有用户和 UID 的映射关系。看别人就是查看系统里有哪些用户这个前面已经提到了awk -F: {print $1} /etc/passwd就能列出所有用户名。如果需要看哪些用户登录了系统用who或w命令。who简洁列出登录用户和来源 IPw还会额外显示每个用户当前正在干什么CPU 占用和登录时长都有。切身份的核心是su和sudo。这两个命令天天用但很多新手混为一谈。su的意思是切换用户switch user比如su - root会切换到 root 用户中间的-表示同时加载目标用户的环境变量这个细节很多人忽略导致切过去之后 PATH 或某些环境变量不对。但su的问题在于需要目标用户的密码而且一旦切换成 root后续所有操作都以 root 身份执行权限太大风险也大。sudo则更加精准你不需要切换到 root 用户只需用sudo 某条命令以 root 权限临时执行这一条。比如sudo systemctl restart nginx只有这一条命令是以 root 身份运行的执行完就回到普通用户。sudo权限的配置在/etc/sudoers文件里修改这个文件建议用visudo命令它自带语法检查避免因为写错格式导致整个 sudo 崩溃。最常见的配置写法是username ALL(ALL) ALL这句的意思是用户username可以从任何终端登录以任何用户身份执行所有命令。如果只想放开部分权限可以写username ALL(ALL) /usr/bin/systemctl效果是只允许他执行 systemctl 这一个命令。这个精细粒度在权限审计严格的企业环境里非常实用。提权限还有一个场景需要提一下sudo -i或sudo su -可以直接切换到 root shell相当于临时获得了完整 root 环境适合需要连续执行多条特权命令的时候。但这种长时间保持 root 身份的习惯我是不建议的无论个人机器还是生产服务器做完该做的事就立刻退出这是 Linux 安全的基本素养。权限的另一个维度是文件和目录的读、写、执行权限。ls -l输出里那一串-rw-r--r--不是乱码它分成四部分第一个字符是文件类型-是普通文件d是目录l是软链接后面三组每组三个字符分别是拥有者、所属组、其他人的权限顺序永远是rwx读、写、执行。数字表示法对应关系是r4, w2, x1所以755就是拥有者可读可写可执行组和其他人只读可执行644是文件默认权限所有用户可读只有拥有者可写。更改权限用chmod 755 文件名更改拥有者用chown username:groupname 文件名。这一套下来你能对付几乎所有的权限问题。3.3 网络排查三板斧ping、netstat、ss 到底该用谁网络出了问题没有经验的人会抱着一堆命令手足无措。实际上网络排查有一套清晰简洁的路径跟着路径走大部分问题都能在几分钟内定位到具体环节比如是 DNS 解析失败还是端口不通是丢包严重还是防火墙拦截。网络排查的第一步通常都是ping用来测试目标主机是否可达。ping的原理是发送 ICMP 数据包看对方是否回应。通了不一定代表网络健康比如对方可能禁 ping但实际服务正常不通也不一定代表网络断了也可能是中间路由器丢弃了 ICMP 包。所以ping的结果只能作为初步参考不能作为最终结论。第二步是查看本机的网络配置和路由信息。ip addr显示本机的所有网卡和 IP 地址ip route显示路由表重点关注默认网关那一行。如果你的机器能 ping 通内网但出不了外网十有八九是默认网关配置出了问题。第三步就到了端口和连接的排查。这里有两个命令老的netstat和新的ss。ss是netstat的替代品性能更好输出更快而且在很多新系统里netstat已经需要额外安装 net-tools 包ss是 iproute2 自带直接可用。我最常用的几条ss -lntp # 列出所有监听中的 TCP 端口及对应进程 ss -antp # 列出所有 TCP 连接带进程信息 ss -unap # 查看 UDP 监听的端口ss -lntp的价值在于你在排查端口被谁占用的时候一条命令就能看到端口号和对应的进程名不需要再绕道去lsof -i:端口号查。ss -antp可以看到所有活跃连接特别是对端是谁、状态是什么。ESTABLISHED是正常连接TIME_WAIT是连接已关闭但端口还留着等秒回收SYN_SENT是对端没响应可能被防火墙挡了CLOSE_WAIT是对端关了但本机还没关说明程序有泄漏连接的嫌疑。网络排查的第四步是 DNS 解析用nslookup或dig。你访问一个域名不通但 IP 直连却正常这时候就该怀疑 DNS 了。dig 域名的输出里会显示解析到的 IP 和使用的 DNS 服务器dig 8.8.8.8 域名可以指定用某个公共 DNS 服务器去解析用来对照判断是不是当前 DNS 配置的问题。最后一步也是最常被忽略的一步防火墙。很多企业服务器用的是firewalldCentOS 系或ufwUbuntu 系我在这里重点讲firewalld。日常管理就是systemctl status firewalld看状态firewall-cmd --list-all看放行的服务firewall-cmd --add-port8080/tcp --permanent放行某个端口然后firewall-cmd --reload让配置生效。很多服务明明起来了但外面访问不了的案例最后查出来都是防火墙没放行端口。排查顺序漏了这一步你会白走很多弯路。4. 高频实用命令的用法细节与避坑心得到了这一节我想把前面没有展开、但日常使用频率同样很高的命令拿出来单独讲一讲。这些命令不是那一类里的主角但没有它们很多任务就是做不顺畅。我从信息查找、Shell 操作、软件安装、日志定位四个块面来讲每一块都给你实打实的用法和最真实的避坑经验。4.1 找文件、找内容、找命令find、grep、type 与 which在 Linux 上找东西是门手艺活。找命令文件用什么找内容用什么找命令在哪定义用什么这三件事混在一起很多人就懵了。其实分工很明确which负责在当前 PATH 里找命令type负责看一个命令是内部命令还是外部命令find负责按条件找文件grep负责在文件内部找内容。find是最强大也是参数最多的一个但实际工作中最常用的就这几个用法。按名字找文件find / -name nginx.conf 2/dev/null从根目录开始找找不到的权限报错直接丢弃这是最常用的写法。按类型找find /data -type d -name logs找目录find /data -type f -name *.log找文件。按大小−:find / -type f -size 1G找出所有超过 1G 的大文件清理磁盘空间的时候这一条救命。按时间找find /data -type f -mtime 30找出 30 天前修改过的文件配合-exec rm {} ;可以实现过期日志自动清理。这里要提醒一下-exec是 find 的一个动作把找到的每一个文件替换到{}里执行后面的命令非常强大但用的时候务必多检查几遍命令尤其在配rm 的时候一个符号错误就可能删错文件。type命令可能很多人从未用过但它对理解命令系统特别有帮助。Shell 里的命令分两种一种是 Shell 自带的比如cd、echo、alias叫内部命令另一种是存放在文件系统里的可执行文件比如ls在/usr/bin/ls叫外部命令。type 命令名可以告诉你这个命令是哪种以及它真正指向哪个文件。比如type ls很可能输出ls is aliased to ls --colorauto这说明你敲的ls其实是一条别名后的命令。理解这一点你就能解释为什么有时候改了系统的某个命令文件可敲命令时行为还是没变因为很可能走的是一条别的路径甚至是一条别名。grep找内容的用法在 2.3 已经详细展开过了这里我补充一个高频场景递归搜索整个配置目录或代码目录。在排查哪个配置文件里写了这个参数的时候grep -rn 参数名 /etc/nginx/一行就能把目录下所有出现的位置和行号列出来配合-i可以忽略大小写再配合--include*.conf还可以只搜指定类型的文件这样能省下大把体力活。4.2 Shell 操作技巧history、alias、管道与重定向的进阶玩法Shell 是我们和 Linux 内核打的照面把 Shell 用溜了命令效率翻一倍都不止。这一节不谈复杂的脚本编程只讲几个日常交互中最高频的进阶技巧。history是查看历史命令的入口。history直接列出你敲过的所有命令history | grep 关键词可以从历史命令里搜索之前的某条命令。更高效的方式是Ctrl R在反向搜索模式下输入关键词Shell 会实时匹配最近的历史命令回车即可执行这种情况在重敲某条很肥的长命令时特别派得上用场。还有两个快捷键我天天用Ctrl A跳到行首Ctrl E跳到行尾如果你还在用方向键一点点挪光标这俩快捷键能帮你每天省下不少脑细胞。alias是给命令起小名的工具。养成给自己的常用命令设置别名的习惯长期下来能省下大量重复劳动。比如我常年使用这么几条alias llls -al alias grepgrep --colorauto alias rmrm -i把rm别名成rm -i这个操作我一直强烈推荐新手做它能让你在删除文件时多个确认步骤有效避免冲动删文件。这些别名写进~/.bashrc文件就能永久生效修改后执行source ~/.bashrc或者重开一个终端别名就会加载。管道|的威力在 2.3 已经重点讲过这里重点补充重定向。重定向符号有三个把标准输出写入文件、追加到文件末尾、2把错误输出写入文件。最经典的组合是命令 文件 21把标准输出和错误输出一起放到同一个文件里。这在定时任务的日志记录中经常用到。比如你用 cron 定时跑脚本期望如果运行出错了也能记录下来就用/opt/backup.sh /var/log/backup.log 21。如果你不想屏幕上刷出乱七八糟的报错可以把错误输出丢进/dev/null这个设备是一个无底洞任何写进去的内容都会直接被系统丢弃这在清理不必要的报错信息时特别实用。再分享一个组合技巧用管道加tee命令。tee的作用是把输出同时写到文件和屏幕上比如你跑一个业务脚本既想看实时输出又想把输出保存下来就可以这样./deploy.sh | tee deploy.log这样你既能在屏幕上看到部署过程中的每一步状态又能留下完整日志后续排查问题也有据可查。这个技巧在操作需要持续很长时间的任务时尤其好用有日志做保险你就不会慌了。4.3 软件包管理apt、yum、dnf 的差异与排查依赖问题Linux 下安装软件的体验跟 Windows 完全不一样也恰恰是很多新手最困惑的一环。不同的发行版用不同的包管理工具Debian/Ubuntu 系用aptCentOS 7 用yumCentOS 8 及以上的 RHEL 系用dnf。虽然包管理工具名字不同但基本逻辑完全一样从软件仓库下载安装包、自动解决依赖、把程序装进系统。学会一个其他就是换汤不换药。apt最常用的三板斧是apt update更新软件源列表apt install 软件名安装软件apt remove 软件名卸载软件。注意apt update和apt upgrade是两个不同命令前者只刷新软件源缓存后者才会真正升级系统里已有的软件很多新手在这上面栽过跟头盲目执行 upgrade 结果升级了一堆包最后服务起不来。如果只是想装某个软件的最新版直接apt install 软件名就够了不用特意 upgrade 整个系统。yum和dnf的用法几乎一脉相承yum install -y 软件名中间那个-y表示自动回答 yes跳过交互确认。RHEL 系里安装软件组也有支持比如yum groupinstall Development Tools一下子装好编译工具链。不过包管理工具最磨人的不是命令本身而是依赖问题。尤其是离线环境装软件没有互联网就没办法直接apt install或yum install这时候需要先把安装包下载下来再拷贝到目标机器手动安装。apt里可以用apt download 软件名下载安装包yum里用yumdownloader 软件名。下载到.deb或.rpm文件之后用dpkg -i 包名.debDebian 系或rpm -ivh 包名.rpmRHEL 系手动安装。这种方式最坑的是依赖不好解决经常装 A 提示缺 B装 B 提示缺 C绕一大圈发现还缺一堆所以有条件还是优先联网用仓库安装。还有几个包管理相关的排查技巧值得记住。安装时如果提示Command not found可能是包管理工具的源里没收录这个软件也可能是软件名没对应上你先apt search 软件名或yum search看看仓库里有没有。安装某个包失败时apt会输出具体的错误信息最常见的两种依赖关系错误、锁文件占用。后者往往是你同时打开了两个终端在装东西系统级的包管理器同一时间只允许一个进程在用解决办法是找到并耐心等待那个进程结束或者确认没有安装进程后清除遗留的锁文件。不过我不推荐一上来就直接删锁文件有好几次就是这样坑了自己的。4.4 日志定位与任务调度journalctl、tail、crontab 的黄金组合日志和定时任务是运维日常的两座大山。日志让你知道系统发生了什么定时任务让你按预定的节奏让系统自动化做事两者配合得好能省下巨大的精力。日志查看的第一工具其实是tail特别是tail -f这个组合。-f是 follow 的意思会持续跟踪文件的更新新写入的内容实时显示在屏幕上。排查服务运行中但表现异常的问题时我在另一个终端里启动服务再开一个终端tail -f /var/log/xxx.log盯着日志输出问题原因经常一目了然。tail -n 100 文件名则是查看文件最后 100 行也是排查异常时的第一动作。与之对应的head -n 50 文件名查看开头部分用来确认文件内容的起始格式。系统服务的日志则推荐 2.2 提到的journalctl。journalctl -u 服务名查看某个 systemd 服务的所有日志journalctl -xe在系统报错时直接查看最近的错误详情和提示journalctl --disk-usage可以看到日志占了多少磁盘空间。日志太多导致磁盘满的问题也挺常见用journalctl --vacuum-size200M可以清理旧日志把占用降到 200M 以内。定时任务用crontab来管理。crontab -e打开编辑当前用户的定时任务表每行代表一个任务。Cron 的格式是五个字段加一条命令分别是分、时、日、月、周。比如每天凌晨 2 点备份日志写法是0 2 * * * /opt/backup.sh /var/log/backup.log 21中间那五个*是通配*表示任意取值。这个场景里0 2是凌晨 2 点整三个*分别表示任意日期、任意月份、任意星期几。实战里常见错误是时间写反比如想每周五晚上 11 点跑一次写成了0 23 5 * *这会被解析成每月 5 号晚上 11 点而不是周五晚上 11 点。正确的写法是0 23 * * 5第五个字段代表星期几0 和 7 都表示周日5 就是周五。定任务之前一定要想清楚每个字段对应的含义。另一个容易被坑的地方是任务里的环境变量。Cron 执行任务时用的是精简环境PATH 可能和你在终端里不一样如果你在脚本里用了某个命令且这个命令不在 Cron 的 PATH 里任务就静默失败了。解决方法是尽量在任务命令中写命令的绝对路径比如/usr/bin/script.sh或者在脚本开头显式设置PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。我遇到过太多次定时任务没执行最后查出来不是没执行是脚本第一行就报错了而报错信息被吞掉了。所以每次写完 cron 任务记得先手动跑一遍脚本确认能成功再交给 cron 去周期执行。5. 常见问题速查表网罗那些明明很简单却卡半天的操作实战经验告诉我很多问题不是难度高而是卡在各种小细节上。我把这些年被问得最多、踩得最多的问题整理成一张速查表每条都给出排查思路和解决办法你可以直接存下来当参考手册。5.1 命令没找到command not found这是最常见也最让人抓狂的错误。遇到它先别慌按顺序排查首先确认命令名有没有拼错比如把git敲成了gti。其次确认这个命令对应的软件有没有安装比如 CentOS 上用dig的时候默认没有需要yum install bind-utils。最后查一下这个命令是不是在 PATH 里如果软件装好了但还是找不到可以用find / -name 命令名 -type f 2/dev/null找到它的真实路径然后用全路径执行。5.2 权限不够Permission denied看到这个错误第一反应是当前用户对该文件或任务的权限不足。如果这个文件是 root 所有的普通用户只有读权限那写操作自然失败解决办法是sudo或者切换到 root。还有一种容易被忽略的情况是文件所在目录没有执行权限导致无法 cd 进入这种情况报的也是 Permission denied。检查权限用ls -l看文件用namei -l 路径可以逐层深入自动检查整条路径上每一层目录的权限排查起来省心不少。5.3 端口被占用Address already in use服务启动时报端口被占用最直接的排查方式是用ss -lntp | grep 端口号找到占用端口的进程 PID然后用ps -p PID -o pid,cmd看这个进程到底是什么。确认是僵尸服务的话kill PID杀掉再重启服务。如果端口确实是业务要用的可以考虑换端口但更优雅的做法是查一下是不是服务配置里重复监听了一个端口。5.4 文件传输中断或慢scp传大文件老中断或者传得极慢优先怀疑网络带宽和链路质量。这时候可以用ping -M do -s 1400 目标IP测试大包传输是否正常如果提示 fragmentation needed说明 MTU 配置有问题。另外同机房内网传输如果用上了公网带宽速度自然感人建议搭个内网传输通道或使用rsync配合内网地址传输效率能翻好几倍。5.5 sudo 报错xxx is not in the sudoers file这个报错翻译成人话就是当前用户不在 sudoer 列表里无权使用 sudo。解决办法是用 root 账号执行visudo在文件中追加一行用户名 ALL(ALL) ALL保存退出后该用户就能使用 sudo 了。注意操作要写对用户名很多人只写了ALL ALL导致烧掉了整个 sudo 机制这种事故我见过不止一次。5.6 系统时间不对导致定时任务错乱你排查了半天发现定时任务完全没在执行某天突然发现系统时间慢了三个小时那任务自然跟着错乱。这种情况先date看一下系统时间再用systemctl status chronyd或systemctl status ntpd看时间同步服务是否在跑没跑就启动它。时间一旦正常所有定时任务都会回到正常轨道。6. 我给 Linux 初学者的一句话心得走到这儿Linux 命令的整套骨架已经给你搭起来了。很多人学 Linux 卡在记不住、不会用、容易忘这三大难关上我的经验是不要去背命令要去用命令解决真实问题。今天学了find找文件那就用它在系统里找出所有超过 500M 的大文件明天学了awk切字段就真的拿它去解析一个日志文件把关键数据抽出来。需求和命令之间一旦建立起解决问题的钩子你就不会忘。我个人的体会是Linux 命令的学习曲线不是密密麻麻铺开答应你你要记几百条而是把二三十条核心命令吃透剩下的命令都是它们的排列组合和变体。当你发现一条命令搞不定的时候学着用管道把多条命令串起来很多时候问题就迎刃而解了。不要怕敲错Linux 的好处是命令敲错了最多报个错不会把机器烧了。大胆去试在你的测试环境里肆意折腾比看一百篇文章都管用。先把文章里提到频率最高的那二十条命令在终端里敲一遍把每一个选项亲手试一次然后关掉教程试着不看任何参考用它们解决一个真实的运维小任务。等你做完这件事你就不再是那个对着屏幕手足无措的 Linux 新手了。