Linux 入门最怕的就是对着命令大全背了三天,一上手还是不知道从哪敲起。我自己刚接触 Linux 那阵,也干过把 man 当字典查、把 tar 参数试错到怀疑人生的蠢事。所以这篇东西我不想给你列一份“看起来很多但用不上”的清单,而是直接把平时运维、开发、折腾服务器最高频的 8 类指令拆开揉碎讲:它解决什么问题、怎么记最牢、踩坑点在哪。看完你能直接上手操作,至少应对日常登录服务器、部署服务、排查故障是够用的。适合刚入门的运维新手、转后端开发的程序员,以及所有被 Linux 命令行折磨过的同学。
1. 为什么是这 8 类指令
1.1 背命令不如按场景记
总有人喜欢对着命令大全从头背到尾,结果背到一百条的时候就崩了。我的经验是按“我此刻想干什么”来找命令,这才是高频指令的核心逻辑。你无非就是在做这几件事:去看目录里有什么、打开文件看内容、给文件改权限、看系统是不是还活着、连不上网了排查一下、把文件打个包发给别人、装个软件、对文本做处理。8 类指令对应的就是这 8 个场景,每个场景记熟三五个核心命令,就足够覆盖日常 80% 的操作。
1.2 这套内容能覆盖什么
我在这套入门路线里选命令的标准很简单:一是不能太冷门,二是必须能组合使用。比如 grep 单独用只是搜关键词,但配合管道 | 和 tail,就能实时盯日志;find 单独用只是找文件,配合 -exec 就能批量清理旧日志。命令之间像积木一样能拼起来,才是这个命令值得学的标志。那些一辈子用不上的冷门参数我直接忽略,等你真遇到再查 man 也来得及。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件与目录操作:每天敲得最多的指令
2.1 查看与切换目录:ls、cd、pwd
我见过不少新人第一条命令记的就是 ls,但是只知道 ls 不带参数,显示出来的文件信息少得可怜。日常最推荐的组合是 ls -lh,-l 是长格式显示权限、属主、大小、修改时间,-h 是让大小以 K、M、G 这种人类能看懂的单位显示。想要看隐藏文件就加 -a,也就是 ls -lah。别小看这个组合,排查日志文件大小、确认权限归属的时候,一眼扫过去就有了。
cd 命令本身没有太多花样,但有几个快捷写法值得养成肌肉记忆:cd ~ 回到当前用户的家目录,cd - 回到上一次所在的目录。这个 cd - 特别实用,比如你在 /etc/nginx/conf.d 改完配置,想回到刚才那个日志目录继续干活,一条 cd - 就切回去了,不用把长路径再敲一遍。pwd 就是显示当前路径,我用它最多的场景是:在一个很深的目录里迷路了,或者刚通过 su 切换了用户,需要确认自己到底在哪个位置。
2.2 创建、复制、移动、删除:mkdir、cp、mv、rm
mkdir -p /data/logs/web 这一条命令能在父目录不存在的情况下,一次性把多级目录建好。新手最大的错误是记不住 -p 参数,然后一级一级 mkdir,效率极低。cp 和 mv 我习惯统一加 -v 参数,比如 cp -rv old_dir new_dir,它会输出每个复制成功的文件,心理上有底。rm -rf 是双刃剑,我见过有人把自己家目录删空的,所以这里必须立个规矩:删除前先用 ls 看清楚目标路径,删除时尽量用相对路径而不是绝对路径,绝对路径一旦写错连补救机会都没有。
为了减少误删,我强烈建议把 rm 替换成 trash-put 这类回收站命令,或者至少把 rm -i 弄成别名。具体操作是在 ~/.bashrc 里加一行:
bash复制alias rm='rm -i'
但说实话,-i 在批量删除时也很烦,每删一个文件都要确认一次。我现在是直接加 alias rm='trash-put',删掉的垃圾文件能按日期恢复,真误删了不至于崩溃。这个习惯花了十分钟配置,但长期省下的后悔药价值无限。
2.3 find 定位文件:比你以为的更强大
find 是很多人最怕的命令之一,因为参数太多。但你只要记住三个核心场景就够了:按名字找、按类型找、按时间找。
bash复制find /data -name "*.log" -type f
find /data -mtime +7 -type f
第一条是找 /data 下所有以 .log 结尾的文件,第二条是找 7 天前修改过的文件。第二个场景在清理日志时非常常用,配合 -exec rm {} \; 就能批量删除 30 天前的归档日志。我有一台低配服务器就是靠这一条定时任务撑了好几年硬盘没爆:
bash复制find /var/log -name "*.log" -mtime +30 -exec rm {} \;
注意:
find -exec后面的{}和\;是固定格式,{}代表每个找到的文件名,;前面必须加转义反斜杠,漏了会直接语法报错。
3. 文件内容查看与搜索:读取信息的正确姿势
3.1 cat、less、tail 怎么选
cat 适合看小文件,比如 /etc/hosts、/etc/resolv.conf 这种几十行的配置。但日志文件动辄几百 MB,如果你也干过 cat huge.log,恭喜你,终端会卡到怀疑人生。遇到大文件,唯一的正确答案是 less。less 的好处是支持方向键上下翻页,按 / 输入关键词搜索,按 n 跳到下一个匹配项,按 q 退出。
tail 是看日志最常用的命令,没有之一。tail -n 100 app.log 看最后 100 行,tail -f app.log 持续跟踪文件新增内容,就像给日志文件装了个实时监控。排查线上问题的时候,我会开两个终端,一个 tail -f 看业务日志,一个输入排查命令,效果极好。如果你只想看最后几行且不想一直挂着,tail -n 20 就够。
3.2 grep 匹配:从日志里捞有用信息
grep 可以说是 Linux 命令里投入产出比最高的一个。最基础的用法是 grep "关键字" 文件名,比如 grep "ERROR" app.log,把所有错误行捞出来。但光这样不够,你还得会和管道搭配:grep -E "ERROR|WARN" app.log | grep "订单ID",先过滤错误级别,再过滤具体业务关键字,两个条件一叠加,问题范围立刻缩小。
grep 有几个参数我建议直接刻进脑子里。-i 忽略大小写,-r 递归搜索整个目录,-n 显示行号,-A 和 -B 分别代表匹配到关键行之后、之前各显示几行。排查代码问题的时候,grep -r "getUserInfo" src/ 一键找出所有调用点,比在 IDE 里鼠标点半天快得多。我试过在不开 IDE 的服务器上改代码,全靠 grep 和 sed 完成了整个逻辑追踪。
4. 用户与权限管理:搞懂 rwx,不再报 permission denied
4.1 权限模型与 chmod、chown
Linux 权限可以拆成三组看:属主(u)、属组(g)、其他人(o),每组都有读(r=4)、写(w=2)、执行(x=1)三种权限。数字表示法其实就是把三个权限值相加,7 代表 rwx(4+2+1),5 代表 r-x(4+0+1)。我常用的是 chmod -R 755 /data:目录用 755,文件用 644,这是搜索引擎和服务器环境最不挑事的权限组合。想要单独给属主追加执行权限就 chmod u+x script.sh,不要没事就 chmod 777,生产环境下这么干等于给攻击者开门。
chown 用来改文件归属,比如 Nginx 需要读取某个上传目录的文件,你就得把目录属主改成 nginx 用户。一条命令解决问题:chown -R nginx:nginx /data/www。这里 -R 表示递归修改目录下所有子文件和子目录,不加的话只改目录本身,经常造成“子文件还是 root 的”这种玄学问题。
4.2 新建用户与 sudo 授权
新服务器到手第一件事,不要用 root 到处跑,而是:
bash复制useradd -m -s /bin/bash ops
passwd ops
usermod -aG sudo ops
useradd -m 自动创建家目录,-s /bin/bash 指定默认 shell,passwd 设置密码,usermod -aG sudo 将用户加入 sudo 组。这样 ops 用户就能通过 sudo 临时获得 root 权限,日常操作退出 root 身份,安全性高一个档次。我之前处理过一台被暴力破解的服务器,日志里全是 root 登录尝试,后来直接禁用 root 远程登录、改 sudo 用户,马上清净了。
Linux 跟 Windows 最大的区别是,普通用户没有权限安装系统级软件、修改系统配置,必须借助 sudo。新手常遇到的“Permission denied”十有八九就是权限问题,不必慌,先看看当前用户是谁,再决定是 sudo 还是 chmod。
5. 进程与系统监控:判断服务器是不是真的不行了
5.1 ps 与 top:秒级定位 CPU 和内存大户
服务器卡顿,第一反应是敲 top。top 是实时交互界面,默认按 CPU 使用率排序,按 M 键按内存排序,按 P 键按 CPU 排序,按 q 退出。我一般盯着两个地方:load average 后面的三个数字,以及 %CPU、%MEM 这两列。Load average 是 1 分钟、5 分钟、15 分钟的平均负载,如果长期超过 CPU 核数,说明系统已经在排队了。
ps 适合一次性快照。ps -ef | grep java 能精确找到 Java 进程的 PID,然后 kill -9 PID 果断处理。但也不是所有情况都该 -9,能 kill(默认发 SIGTERM 信号)就先用普通 kill 让进程优雅退出,实在没反应再用 -9。我处理过同事写的脚本只会无脑 kill -9,导致好几个服务没来得及做状态落盘,重启后数据回滚,教训相当深刻。
5.2 磁盘、内存和负载:df、du、free、uptime
看到磁盘告警,df -h 立刻能告诉你哪个分区满了。我曾经排过一台 MySQL 服务器,一直报“No space left on device”,结果 df -h 显示根分区才用 60%,最后用 df -i 才发现是 inode 耗尽——大量几百字节的小文件塞满了索引节点。这就是热词里“linux删除文件夹命令”都不解决的事,得先找到这些小文件,删掉一批,才能恢复正常。
du -sh /data/* 能列出指定目录下每个子目录占用的总大小,-s 汇总、-h 人类可读。我通常用它来快速判断哪个业务目录是流量大户,为清理磁盘列出最直接的证据。free -h 看内存,重点看 available 列,这个值才是系统实际可用的内存,不是只看 free 列,因为 cache 会被回收再用。uptime 一行输出,就是 top 第一行的核心信息,连 SSH 上去第一件事先 uptime,系统忙不忙,一目了然。
5.3 kill 和 nohup:怎么干掉进程,怎么让服务后台跑
kill -9 是强制结束进程,kill -15 是礼貌请求结束,优先级依次是先 15 后 9。定位进程除了 ps -ef | grep,还能用 pgrep -f 进程名,直接拿到 PID,省得再写管道。配合 pkill -f 服务名,能按完整命令行匹配批量关闭进程,这在清理多开进程时特别省事。
想要服务在退出 SSH 后继续跑,核心命令就是 nohup 命令 &。nohup 忽略挂断信号,& 放后台执行。比如我启动一个 Spring Boot 服务:
bash复制nohup java -jar app.jar > app.log 2>&1 &
> app.log 把标准输出重定向到日志文件,2>&1 把错误输出也送到同一个文件,不然错误信息会打印到黑洞里,出问题根本查不到线索。这一条是我每次部署必备的启动姿势。
6. 网络排查指令:连不上网?先按这个顺序查
6.1 连通性测试:ping 与端口检查
服务器连不上,新手第一反应是 ping。但 ping 只能证明 IP 通不通,不能证明端口通不通。我就遇到过客户说“网站打不开”,我 ping 服务器 IP 通得很,最后发现是 8080 端口被防火墙挡了。这时候要用 ss -lntp 查看本地监听的 TCP 端口,-l 只看正在监听的,-n 不解析域名,-t 只显示 TCP,-p 显示对应进程。组合起来是这样的效果:
bash复制ss -lntp | grep 8080
如果这条命令没输出,说明服务根本没在 8080 监听,问题不出在防火墙,而出在服务本身没起来。跟以前 netstat 相比,ss 在处理大量连接时性能更好,我建议直接只用 ss,别在新服务器上还去查旧命令。
6.2 接口请求:curl 和 wget 的实战用法
curl -I https://example.com 只拿响应头,-I 是 HEAD 请求。看状态码、看响应时间、看是否存在重定向,这几秒钟就能判断一个接口通不通。curl -v https://example.com/api 会输出完整的请求和响应过程,包括 TLS 握手、DNS 解析、请求头、响应头,排查问题最详细。我定位过一次接口偶发超时,就是用 curl -w "%{time_total}\n" 多次请求看耗时波动,找出是数据库连接池的问题。-w 参数可以自定义输出请求、响应、连接各阶段耗时,是压测前的小白排查利器。
wget 主要用于下载文件,但有个参数经常被忽略:wget -c 断点续传。下载大文件中断了,不用从头再来,这个细节在弱网环境下太宝贵了。curl 和 wget 两者最大的区别是,curl 更偏接口调试,支持 POST、自定义 Header,wget 更偏文件下载,各管一摊。
6.3 远程管理:ssh 与 scp
ssh user@server_ip -p 22 是最基础的远程登录。但天天输密码确实痛苦,也容易被暴力破解盯上。更稳妥的做法是配置密钥登录:在本地生成密钥对,把公钥复制到服务器 ~/.ssh/authorized_keys,以后登录免密。生成方式:
bash复制ssh-keygen -t ed25519 -C "your_email"
ssh-copy-id user@server_ip
scp 是传文件最快的方式。scp file.zip user@server_ip:/data/ 上传,scp user@server_ip:/data/file.zip ./ 下载。如果你已经配了 ssh 别名,scp 也支持直接用别名,写起来舒服很多。scp -r dir user@server_ip:/data/ 能传整个目录,不过大目录我更建议先 tar 打包再传,速度差异挺明显。
7. 打包压缩与软件安装:部署环境绕不开的操作
7.1 tar 命令:打包和压缩一步到位
对于 Linux 用户来说,tar 比 zip 更常见。我见过一个流传很广的段子:tar 参数记不住,干脆每次都是 tar -zxvf。理解每个字母后其实很清晰:-z 表示用 gzip 压缩,-x 解压,-c 创建,-v 显示过程,-f 指定文件名。所以:
bash复制tar -czf app.tar.gz /data/app
tar -zxvf app.tar.gz
第一条是打包压缩,第二条是解压。-z 对应 .tar.gz,如果文件是 .tar.bz2,就用 -j;如果只是打包不压缩,直接 tar -cf。别小看这个区别,我接手过一台服务器,上面全是 .tar.bz2 的备份,用 -zxvf 硬解,每次报错,最后才发现是压缩格式问题。遇到未知格式可以先 file 文件名,它会告诉你真实格式,省得瞎试。
7.2 软件包管理:apt 与 yum
Debian 系用 apt,Red Hat 系用 yum。核心命令几乎一一对应,apt update && apt install -y nginx 对应 yum install -y nginx。注意,apt update 只是更新软件源索引,不升级任何软件,apt upgrade 才是真升级。很多新人刚装完系统就执行 apt upgrade,结果内核被更新了,重启后某些内核模块不兼容,反而惹出一堆事。保守做法是平时只 apt update && apt install 指定软件,确有必要时再做全量升级。
yum 同理。卸载软件用 apt remove / yum remove,想连配置文件一起清掉用 apt purge。查某个软件装没装,which 或 dpkg -l | grep nginx。最后提醒一句:官方源的版本可能不是最新,但依赖关系最干净,自己从官网下二进制包虽然版本新,依赖没对齐反而是最常见的坑。我在 CentOS 7 上装 Nginx,图官网新版本,结果缺了一堆编译依赖,折腾两个小时,最后老老实实 yum install nginx。
8. 文本处理与管道:Linux 命令行的精髓
8.1 管道和重定向:让命令像流水线一样协作
管道符 | 是我认为 Linux 与 Windows 命令行最本质的区别。它把左边命令的输出,直接作为右边命令的输入。比如 docker ps | grep mysql,就是先列出所有容器,再从中筛出包含 mysql 的行。这种组合让单个命令变成一个可拼接的积木,你不需要记忆一个“查询容器并筛选”的命令,只要记住 docker ps 和 grep 两个独立能力就够了。
重定向则解决“输出去哪里”的问题。> 覆盖写,>> 追加写,2> 重定向错误输出。我之前给服务器写定时备份脚本,就是靠 mysqldump ... > backup.sql 2>> backup.log 把数据库备份到文件,把错误信息追加到日志。区分标准输出和错误输出,排查问题时可以快速判断是业务日志还是系统层面的异常。
8.2 sort、uniq、wc、cut:日志统计四件套
这四个命令组合在一起,可以完成很复杂的统计任务。举个最常见例子:分析 Nginx 访问日志,找出访问次数最多的前 10 个 IP。
bash复制awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
awk '{print $1}' 提取第一列(IP),sort 排序让相同 IP 相邻,uniq -c 统计每行出现次数,sort -rn 按次数倒序排,head -10 取前十。这套流水线我在排查 CC 攻击时用得太多了,一条命令能快速定位哪些 IP 是访问大户。wc -l 统计行数,cut -d: -f1 按冒号切列提取字段,都是日志分析的常用利器。
8.3 sed 与 awk 的入门级用法
sed 最常用的操作是替换。比如要把配置文件里所有的 8080 改成 9090:
bash复制sed -i 's/8080/9090/g' /etc/app.conf
-i 表示原地修改,s/旧/新/g 是替换语法。注意,这里写的是全局替换 g,如果只换每行第一个匹配就省略最后的 g。awk 更多用于按列处理,awk '{print $2}' 取第二列,awk -F':' '{print $1}' 指定冒号分隔取第一列。这两个工具初看很难记,但它们的核心就是“文本里的查找替换”和“表格里的列操作”,理解了就一通百通。
9. 常见问题与排查技巧实录
9.1 command not found:别急着装,先看是不是路径问题
“command not found”有三种常见原因:命令没装、命令在 sbin 目录但普通用户 PATH 里没有、命令名拼错。我遇到最多的其实是第二种,比如 ifconfig 在新系统上经常提示不存在,因为已经替换成了 ip 命令,或者需要 apt install net-tools 才能装回来。我的排查顺序是:先用 which 命令名 看能不能找到,which 找不到再看 /usr/sbin、/usr/local/sbin 里有没有,有的话直接写全路径执行,或者把目录加进 ~/.bashrc 的 PATH。
9.2 Permission denied:权限错误三板斧
权限报错第一件事是 ls -l 看当前权限,确认当前用户是不是属主。第二件事是判断场景:如果是写文件没权限,给目录加写权限或 chown 改变属主;如果是执行脚本没权限,给脚本加 chmod +x;如果是 ssh 登录报权限,八成是 ~/.ssh 目录或 authorized_keys 文件权限太开放。第三件事才是考虑 sudo。我给人排查过一个问题,sudo 都执行了还是 permission denied,最后发现是 /etc/sudoers 里根本没给这个用户权限。权限问题从来不是单靠“加权限”就能解决,而是要找对归属和文件类型。
9.3 端口被占用:服务为什么起不来
启动 Nginx、Java 应用时报“Address already in use”,十有八九是端口被占用。定位方式:
bash复制ss -lntp | grep 端口号
输出里面能看到占用端口的进程名和 PID。如果是自己的服务,kill 掉旧进程再启动;如果是别人的服务,别贸然杀,先确认是不是共用端口。这里有一个高频坑:Tomcat 启不起来,但端口明明没被占用,最后发现是 java 进程没有完全退出,系统里残留了一个僵尸进程。这时候看 ps -ef | grep java 就能发现端倪。
9.4 磁盘被写满:df 看分区,du 定位目录
磁盘满的排查顺序是 df -h 先看哪个分区满,再看 du -sh /data/* 找大目录,一层层往下钻到具体文件。如果 df 显示满了但 du 又找不到大文件,很可能是某个进程把一个大文件删除后还没释放句柄,文件在系统层面已经删了,但空间还被进程占着。这种情况只有重启那个进程才能释放空间,du 是查不出来的。日志文件是最常见的元凶,配合 find + mtime 清理 30 天前的旧日志,是治本的手段。
9.5 误删文件:提前备份永远比事后后悔重要
我最后想重点说这个,因为它是我自己踩过最大的坑。一次在服务器上清理临时文件,路径写错,直接 rm -rf 删掉了一个存放配置的目录。因为那是云服务器上的挂载盘,文件系统层已经从索引里消失了,恢复工具不一定能用。那次之后我就定了两条规矩:一是所有重要目录必须定时备份到异地或对象存储;二是删除前先 ls 确认,删除大目录优先用移动而不是直接删,比如先把目录 mv /data/app /tmp/to_delete/,观察一段时间没问题再清空。这个流程多花几分钟,但比出事后尝试数据恢复要省心一万倍。
写在后面
这一路写下来,我发现自己最开始学 Linux 时也是被“命令大全”吓住的,直到习惯“场景驱动”以后才真正入门。每次遇到一个问题,不要急着搜命令,先在脑子里把场景拆一遍:是查文件、看内容、查端口,还是看资源占用。把方向想清楚了,命令自然就出现在你脑海里。这八个类别里,我自己日常使用频率最高的是 grep、find、tail、ss 这四个,几乎每隔几分钟就会用到一次。如果你时间有限,先熟练这四个带来的收益会最明显。后面遇到更复杂的场景,随时回到这篇文章翻一翻,你会发现这些命令像老朋友一样越用越顺手。
