
刚接触Linux的人问得最多的问题永远是同一个命令太多了到底该先学哪些这个困扰我太理解了。当年我第一次坐在服务器前面面对黑底白字的终端脑子里全是rm能不能删目录chmod后面到底跟三个什么数字手足无措。后来带过不少新人我发现一个规律Linux命令虽然多到上千条但真正每天高频使用的撑死也就几十个。把这几十个按用途分成几类每类记住几个核心命令和参数你就能应付绝大多数日常工作。这篇文章不讲虚的直接按8类高频指令来拆。每一类我会列出最常用的命令、参数、适用场景以及我这些年踩过的坑。你不需要死记硬背先把框架搭起来知道遇到什么问题该去哪一类里找命令剩下的交给肌肉记忆。写这篇东西的目标读者很明确刚入行或者转行做运维、开发的Linux新手以及在服务器上操作时总觉得自己手生的人。1. 先把目录和文件玩明白ls、cd、mkdir、rm 的地基操作1.1 从 pwd 到 cd先搞清楚自己在哪登录Linux服务器后的第一个动作我建议永远是pwd。这个命令全称是 print working directory就干一件事告诉你当前在哪个目录。听起来简单但很多人栽跟头就是因为不知道自己在哪然后rm -rf删错了地方。我见过有人部署项目时以为自己在 /home/project 下实际却在 /root 下执行了清空命令场面相当惨烈。定位之后是切换目录cd命令配合几个快捷键效率能翻倍cd /etc绝对路径跳转无论当前在哪直接去 /etccd ..回到上一级目录注意两个点一个点是当前目录cd ~回到当前用户的 home 目录等价于cd不带任何参数cd -回到上一次所在的目录。这个参数容易被忽略但极其好用在两个目录之间来回切换时少敲一堆路径列目录内容用ls。我的日常习惯是ls -lh-l 表示长格式显示能看到权限、属主、大小、时间-h 让大小以人类可读的方式显示K、M、G不然你只能看到一堆以字节为单位的数字读起来费劲。想看隐藏文件就加-a隐藏文件的特征是文件名以点开头比如 .bashrc、.ssh 这种。还有一个用得多的组合是ls -lt-t 按修改时间从新到旧排序排查哪个日志文件刚被更新过时非常顺手。1.2 新建、复制、移动、删除动作要稳创建目录用mkdir我最常用的参数是-p代表 parents也就是递归创建。比如mkdir -p /data/logs/nginx如果 /data 和 /data/logs 都不存在它会一口气全建出来。没有 -p 的话一层层创建会把人逼疯。创建空文件用touch但请注意如果文件已经存在touch 不会清空内容只会把修改时间刷新成当前时间。这个特性偶尔会被拿来假装文件刚被改过但更多时候它的价值就是快速建一个占位文件。复制文件夹cp -r是标准答案。-r 代表递归复制。不光是整个目录树带着权限一起复制还得加-p也就是cp -rp否则新文件的时间戳和属主属性会变。这个细节在迁移配置时容易踩坑。移动文件用mv。它同时承担重命名功能——把mv oldname.txt newname.txt就是重命名了。mv 在同一个文件系统内是纯搬移瞬时完成跨文件系统移动时会先复制再删源文件大文件会有延迟这是正常现象。删除命令rm是新手期最容易出事的命令。rm -rf几乎是默认操作但这里面有个致命细节-f是 force 强制删除不提示-r是递归。我个人的安全习惯是小范围删除文件时先用ls确认自己要删的路径再执行rm -rf而且宁可多打几个字也尽量写完整路径而不是.或者../加通配符。这里还有一个血泪教训——路径里带空格的话必须加引号或者用转义符否则 shell 会把空格当成路径分隔符删掉的东西可能会超出你的预期。提示实在拿不准删除后果时先把rm换成mv移到 /tmp 目录观察几天确认没问题再决定是否清掉。这个操作成本极低但能救命。1.3 文件路径绝对路径与相对路径的意义很多人刚开始分不清绝对路径和相对路径其实一句话就能讲清楚绝对路径从根目录/开始写比如/etc/nginx/nginx.conf相对路径从当前位置开始写比如当前在 /etc/nginx 下想引用同一个配置文件直接写nginx.conf就行。我的建议是写脚本和配置文件里一律用绝对路径避免执行环境不同导致找不到文件交互式敲命令时相对路径加上 Tab 键补全效率更高。Tab 补全这个习惯一定要养成——输入一半路径按 Tabshell 会帮你补全如果有多个匹配再按两下 Tab 会列出所有候选项。这个功能配合cd使用能极大减少拼写错误。2. 读文本是日常cat、less、tail、grep 的组合打法2.1 小文件用 cat大文件用 less服务器上的配置文件和日志几乎全是文本所以看文件是最高频的操作。小文件直接cat。全称 concatenate原本是拼接文件用的但大家最常拿它看内容。cat -n会给每行加行号查看代码或配置时方便引用某一行。多个文件顺序拼接输出用cat file1 file2 merge.txt这个用法适合快速合并几个小配置文件。文件一长cat 会把内容哗啦啦全刷到屏幕上你根本来不及看。这时候用less代替 cat 是正确选择。less 支持上下翻页方向键、PageUp/PageDown支持搜索直接敲/加关键字回车后按 n 跳到下一个匹配。按 G 跳到最后一行按 g 跳到第一行。退出按 q。这些操作看着简单但每一招在实战里都很有用。2.2 看日志核心技能tail -f运维和开发排查问题时tail -f是无可争议的主角。这个命令实时滚动显示文件新增内容比如你在 tail 一个应用日志文件程序每往文件里写一行屏幕上立刻就会出现一行。tail -n 50表示只显示倒数50行适合看日志的尾部。很多线上排查路径都是先tail -n 100 app.log看最近的报错然后用grep过滤关键字最后再用tail -f跟踪实时输出。这三个命令组合起来能解决80%的日志排查需求。顺便说一句grep后面会专门讲但这里提前说一个基础用法——grep ERROR app.log能帮你快速定位所有包含 ERROR 的行配合tail -n使用比人肉翻日志高效得多。2.3 编辑文件至少会 vim 的基本四键看完了得能改这就绕不开编辑器。生产环境上装图形化编辑器不现实最普适的就是 vim。新手别被 vim 的学习曲线吓到核心就四个操作i进入插入模式开始写内容Esc退出插入模式回到普通模式:wq保存并退出:q!不保存强制退出这四个键能解决你80%的临时编辑需求。如果 vim 实在不顺手很多系统也自带 nano界面底部直接显示快捷键提示对新手更友好。但我的建议是vim 的这四个操作必须练熟因为你不知道哪天要上的机器是不是只装了 vim。这里有个推荐思路能用工具处理的文本操作尽量别打开编辑器。比如批量替换文件内容用sed -i s/old/new/g file删除第多少到多少行也可以用 sed。这些命令熟练之后你在处理几百个文件时效率远超手动编辑。3. 权限这件事chmod、chown 和服务器的安全底线3.1 先看懂 ls -l 输出里的10个字符权限操作是Linux新手最懵的部分但如果搞懂了很多服务器安全问题就能理解。执行ls -l后第一列是类似-rw-r--r--的字符串共10个字符。第一个字符表示文件类型-是普通文件d是目录l是软链接。后面9个字符分成三组每组3个分别代表文件属主user属组group其他人others的权限。每组里的位置固定第一个是读权限 r第二个是写权限 w第三个是执行权限 x。权限为空时显示为-。举个例子-rw-r--r--表示这是一个普通文件属主可以读写属组和其他人只能读。-rwxr-xr-x表示属主可读可写可执行属组和其他人可读可执行、但不可写。3.2 chmod用数字修改权限Linux 把读、写、执行分别对应数字 4、2、1三种权限相加得到一个0到7的数字。所以4 2 1 7表示 rwx4 2 6表示 rw-4 1 5表示 r-x1 1表示 --x于是chmod 755 file的意思就是属主7rwx属组5r-x其他人5r-x。这是最常见的可执行文件权限配置。chmod 644 file是常用的普通文件权限属主可读写其他人只读。给脚本文件加执行权限最简单的是chmod x script.sh它只添加执行位不动其他权限位比较好用。目录的执行权限和文件略有不同目录的 x 权限表示能否进入该目录r 权限表示能否列出目录内容。所以如果某个用户进不了目录不要光看 r 有没有没 x 也一样进不去。3.3 chown、useradd、sudo 的配合改属主和属组用chown。比如chown -R nginx:nginx /data/www-R 是递归把 /data/www 下所有文件和子目录的属主和属组都改成 nginxnginx。冒号两边分别代表用户和组。新建用户用useradd设置或修改密码用passwd。比如useradd zhangsan再passwd zhangsan系统会提示你输入两次密码。日常管理建议给每个需要登录的人单独建账号而不是所有人共享 root否则出了问题没法追溯是谁的操作。需要临时提升权限执行管理命令时用sudo。给用户授权 sudo 权限是把该用户加入 sudo 组Debian/Ubuntu 系或 wheel 组CentOS/RHEL 系执行usermod -aG sudo zhangsan。注意-aG里的 a 是 append 追加G 指定附加组。少了 a 的话这个用户会被移出其他所有附属组这是个容易出问题的细节。su和sudo的区别也值得说清楚su - root是直接切换成 root 用户需要知道 root 密码sudo command是当前用户使用自己的密码提升权限执行单条命令密码验证后短时间内有效。生产环境中尽量用sudo而不是su切到 root因为 sudo 有更完整的审计记录能知道谁在什么时间执行了什么命令。提示不要动不动就chmod 777。让所有用户对文件都有写权限等于把服务器的大门钥匙复制粘贴给所有人。先想清楚谁需要什么权限再动手。4. 进程管理ps、top、kill、systemctl 的实战4.1 看进程ps 和 top 的区别服务器上跑着什么程序、状态如何是运维最关心的问题之一。ps是静态查看当前进程的快照。我的标准操作是ps -ef或者ps aux两者的输出的侧重点略有不同但都能看到 PID进程ID、CPU、内存、启动时间、命令行等关键信息。配合grep过滤某个程序比如ps -ef | grep nginx如果看到 nginx master 和 worker 进程都活着说明 nginx 运行正常。这里有个小坑grep 本身也会作为一条进程出现在结果里导致你看到一个grep nginx的假进程别被它误导。top是实时动态的默认按 CPU 占用率排序按M切到按内存排序按P切回按 CPU 排序按q退出。当服务器卡顿第一件事就是跑top看哪个进程在吃 CPU 或内存。如果你发现某个 Java 进程占了300%的 CPU说明它开了多线程在疯狂计算可能是代码里有死循环或者 GC 异常。注意 top 第一行 Load average 三个数字分别表示1分钟、5分钟、15分钟的负载如果三个数都高得离谱说明系统长期过载只有1分钟高说明可能刚有一波突发任务。4.2 结束进程kill 的合理姿势找到不正常的 PID 之后kill PID是标准操作。注意 kill 默认发送 SIGTERM信号15给进程一个优雅退出的机会让它自己清理资源。如果等了几秒进程还在再执行kill -9 PID发送 SIGKILL强制内核直接干掉它。这个顺序很重要直接 kill -9 有一定概率导致文件损坏或数据残留因为进程没机会做清理。还有一种常见场景程序在终端前台跑着你想暂停它。按CtrlZ可以挂起当前进程然后用jobs查看挂起的任务编号bg %1让它转到后台继续运行fg %1把它拉回前台。这个组合适合在用tar解压大文件或编译代码时需要临时占住终端干别的事的情况。4.3 systemctl现代 Linux 的服务管理老一代 Linux 用service nginx start这种 sysvinit 方式管理服务现在主流的 CentOS 7、Ubuntu 16 都换成了 systemd配套命令是systemctl。日常高频的四个操作systemctl start nginx启动服务systemctl stop nginx停止服务systemctl restart nginx重启服务改完配置后经常用systemctl status nginx查看服务运行状态同时能看最近几条日志systemctl enable nginx设置开机自启注意区分start和enablestart 是立即启动不保证下次开机自启enable 是设开机自启不立即启动。两者同时需要时可以直接systemctl enable --now nginx一条命令搞定。5. 磁盘、内存与系统信息df、du、free 快速体检5.1 磁盘满没满df 和 du 说了算磁盘满了是运维的常用口头禅。判断依据就是df -h-h 以人类可读格式显示。输出里有 Filesystem、Size、Used、Avail、Use% 和 Mounted on重点看 Use% 是否快到100%。如果根分区的 Use% 是88%意味着你的系统盘随时可能因为写不进日志而出问题。df是看整体磁盘空间du是看某个目录具体占用多大。排查哪个目录把磁盘塞满了我常用的命令是du -sh /var/*-s 只显示每个子目录的总大小-h 人类可读。然后du -sh /var/log/*一层层往下定位。更高效的做法是du -sh /* 2/dev/null | sort -rh | head -n 10一次性列出根目录下最大的10个路径。磁盘满的常见元凶日志文件、core dump 文件、Docker 的 overlay2 存储层。日志文件通常因为没配 logrotate 轮转越积越大Docker overlay2 则是长期运行容器后残留的旧层内容。处理方式是找到大文件后确认内容再决定清空还是删除。5.2 内存看 free别被 buff/cache 吓到free -h输出里有 total、used、free、shared、buff/cache 几列。新手常犯的错误是看到 free 很小就以为内存不够然后折腾优化。其实 Linux 的内存管理策略是闲着也是闲着把空闲内存拿来做文件缓存buff/cache一旦有程序需要内存系统会自动回收这部分缓存分配出去。所以真正该看的是 available 这一列表示在不交换的情况下还能给新程序分配多少内存。如果 available 持续偏低程序才会真正感受到内存压力表现为 OOMOut Of Memory或者 Swap 使用率飙高。排查内存大户还是top按 M 排序看哪个进程占用了 RES常驻内存多。5.3 用 uname 和 /etc/os-release 快速了解系统新接手一台服务器先摸清楚它的底细uname -a显示内核版本、主机名、架构等。内核版本和某些软件兼容性直接相关比如 Docker 老版本对旧内核支持不好cat /etc/os-release显示发行版信息比如 Ubuntu 22.04 LTS、CentOS Stream 9lscpu查看 CPU 型号、核心数、线程数uptime显示系统已运行多久、当前负载这些命令组合起来5分钟内可以给一台陌生服务器做完体检。我接手历史遗留服务器时第一步永远是这几条命令了解基础环境后再决定后续操作方案。6. 网络命令真正常用的只有几个ping、curl、ss 就够了6.1 ping测连通性别一直按 CtrlCping用来测试到目标主机是否通。Linux 默认的 ping 会一直发包直到你手动停止所以建议加上-c指定次数比如ping -c 4 baidu.com发4个包就自动结束。输出里有 time 字段可以大致判断网络延迟如果出现 100% packet loss基本可以判断网络不通或者对方禁 ping。ping 不通只说明 ICMP 不通不代表服务不可用。很多云服务器和防火墙默认屏蔽 ICMP 报文所以 ping 不通时别急着下结论接着用下面的方式验证端口。6.2 curl 和 wget发请求和下载文件的主力curl的功能非常强大日常排查最常用的参数curl -I https://example.com只请求 HTTP 头快速查看状态码和响应头。状态码 200 是正常301/302 是重定向403 是权限拒绝502/504 通常是后端问题curl -v https://example.com详细模式打印整个请求和响应的全过程排查 HTTPS 握手、DNS 解析、连接建立时很有用curl -L https://example.com/download-L 表示跟随重定向下载重定向后的文件curl -o file https://example.com/file把响应内容保存成文件wget偏向下载工具支持递归下载、断点续传。比如wget -c https://example.com/big.iso-c 表示继续之前未完成的下载。curl 和 wget 的共同点是都适合在无图形界面环境下完成文件获取比如服务器上下载软件包。6.3 ss 和 telnet查端口和测端口服务启动后怎么确认它真的在监听端口答案是用ss -tlnp。-t只看 TCP-l只看 LISTEN 状态的端口-n不解析服务名直接显示端口号-p显示对应进程比如执行完ss -tlnp | grep 3306如果看到 MySQL 进程监听在 3306 端口说明数据库对外服务正常。老机器上的netstat命令也能干类似的事但新系统普遍推荐 ss性能更好输出更直观。测试某个端口通不通最传统的是telnet IP 端口。比如telnet 192.168.1.100 3306如果端口开放会进入一个空终端界面说明已连接如果连接被拒会提示 Connection refused 或者超时。现在很多系统默认不装 telnet 客户端可以用nc -vz IP 端口代替效果一样。需要明确的是这些命令都只用于正常的网络连通性测试别用它们去做任何不符合规定的事。7. 搜索与管道联动find、grep、xargs 组成的数据流水线7.1 find按条件定位文件find是在文件系统里按条件找文件的唯一正统工具也常被用于找出来批量处理。最常见的用法是find /data -name *.log在 /data 下找所有以 .log 结尾的文件。-name 区分大小写如果想忽略大小写用-iname。按类型过滤用-type d目录或-type f普通文件。比如find / -type d -name nginx可以快速定位 nginx 的所有相关目录。按时间过滤是清理日志时的利器find /var/log -name *.log -mtime 7表示找修改时间在7天前的日志文件。-mtime按天-mmin按分钟7表示超过7天-7表示7天以内。按大小过滤可以定位大文件find / -type f -size 500M找出所有超过500MB的文件。磁盘报警时这条命令能帮你快速揪出占用大户。7.2 grep文本内容过滤grep用来在文件内容里搜关键字。最基础的用法是grep ERROR app.log。几个高频参数-r递归搜索目录下所有文件比如grep -r timeout /etc/nginx/-i忽略大小写-v反向匹配输出不含关键字的行-c只输出匹配行数--colorauto匹配内容高亮显示建议直接配置进 alias 里看日志时最常用的组合是grep 关键字 文件 | tail -n 30先过滤出感兴趣的行再取最后30条。7.3 管道和 xargs把命令串成流水线管道符|是 Linux 命令组合的精髓把左边命令的输出作为右边命令的输入。比如ls -l | grep ^-只列出当前目录下的普通文件。xargs解决的是把标准输入转成命令行参数的问题。前面说过find的结果是一堆文件名一堆文件名本质是换行文本不能直接作为rm的参数。但find /tmp -name *.tmp | xargs rm就能让 find 找到的每个 .tmp 文件都被 rm 删掉。文件名带空格时xargs 默认按空白分割会出问题。解决办法是find /tmp -name *.tmp -print0 | xargs -0 rm。-print0 和 -0 配合用 null 字符分隔空格就不再是障碍了。举一个完整场景你想找出所有正在运行的 Java 进程并拿到它们的 PID可以这样组合ps -ef | grep java | grep -v grep | awk {print $2}。其中 grep -v grep 是过滤掉那条 grep 自身进程awk {print $2} 是取第二列PID。这段组合是我在排查多个 Java 服务时的高频操作一次性拿到所有 PID后面想 kill 哪些就一目了然。8. 打包压缩与远程传输tar、zip、scp、rsync 的实用姿势8.1 tar 一条命令读懂压缩和解压服务器上打包压缩几乎绕不开tar。tar 本身是归档工具把一堆文件合并成一个文件通常配合 gzip 压缩扩展名是 .tar.gz 或 .tgz。打包压缩的关键命令tar -czvf backup.tar.gz /data拆解参数-c创建归档-z用 gzip 压缩-v显示处理过程-f后面必须紧跟归档文件名。注意-f一定要放在最后因为-f的下一段必须是文件名比如tar -czf backup.tar.gz /data也是对的但如果你写成tar -cvfz /data backup.tar.gz系统会把 /data 当成归档名。这个顺序问题坑过很多人。解压命令tar -xzvf backup.tar.gz -C /target/dir-x提取-z解 gzip-v显示过程-f指定文件-C指定解压目标目录。只是查看压缩包内容而不解压用tar -tzvf backup.tar.gz。8.2 zip 和 unzip和 Windows 打交道的格式tar.gz 在 Linux 世界最普遍但和 Windows 用户交换文件时zip 更友好。压缩命令zip -r archive.zip /data-r 递归压缩目录解压命令unzip archive.zip默认解压到当前目录。给压缩包加密是zip -P 密码 archive.zip file但注意这种加密强度有限别存太机密的东西。8.3 scp 和 rsync文件怎么搬到别的机器搬文件到远程服务器scp是最直接的方式。scp /local/file.txt userremote_host:/remote/path/这是把本地文件上传到远程。反过来下载scp userremote_host:/remote/path/file.txt /local/path/目录用 -rscp -r /local/dir userremote_host:/remote/path/。scp 是全量复制每次都会把所有文件重新传一遍。文件多、量大时rsync是更优选择。rsync -avz /local/dir/ userremote_host:/remote/path/-a 归档模式保留权限、时间戳等-v 显示详情-z 传输时压缩。rsync 的核心价值是增量同步只传输有变化的部分。比如第一次同步了100GB第二次只改了其中1个文件rsync 只传这1个文件而 scp 会把100GB全部再来一遍。日常备份就用 rsync配合 crontab 定时任务可以实现轻量的数据同步方案。回到我自己用这些命令的体会Linux 命令不是靠背的是靠用的。你不需要一次记住所有参数只要记住哪一类问题去找哪类命令然后用man 命令或命令 --help现查参数用多了自然就刻在脑子里了。这里也建议你花10分钟把下面几个 alias 写进 ~/.bashrc能让你每天少打很多字alias llls -lht alias lals -ah alias grepgrep --colorauto alias ..cd .. alias ...cd ../..最后再分享一个小技巧把history命令变成你的命令库。history会显示你执行过的所有命令配合!序号能重新执行某条历史命令。养成敲过的复杂命令不重复手打的习惯效率会明显提升。这套8类指令的框架足够你应付绝大多数日常操作剩下的就交给实战去积累吧。