简介:一份面向Linux初学者、运维人员和开发者的《10分钟让你掌握Linux常用命令》PDF速查手册,聚焦快速掌握高频命令的目标,系统梳理了目录操作、文件增删改查、日志查看、压缩解压、软连接、Docker容器、用户权限、端口检查与内核优化等应用场景。资源共1个PDF文件,包体约796KB,轻量易携,适合日常查阅。目前已有6169人学习使用。内容依据实际运维场景分类,并给出大量命令实例,例如find搜索文件、split拆分大文件、tar归档压缩、systemctl查看系统日志、docker ps/run管理容器、netstat检测端口、yum安装软件、useradd/groupadd管理用户、chmod调整权限,每个命令均结合典型参数说明,便于对照练习。手册还特别提示rm -rf等高风险命令的适用场景与误操作后果,帮助读者在提升Linux操作效率的同时规避误操作风险,是一份实用的入门与速查资料。
1. Linux常用命令不是背出来的:这份万赞手册解决什么问题
Linux 常用命令这套东西,资料不难找,难的是把命令落到真实环境里。这份被收藏超过一万次的 PDF,把目录操作、文件内容、日志查看、压缩解压、软连接、Docker、进程排查、用户权限这些场景拆成了十五个部分,每一条命令都带着可直接复制的参数。我拿到后没有从头背,而是直接跳到日志查看和端口排查两节,跟着命令敲一遍,把服务器上正在跑的服务理清楚了。它不解决“Linux 是什么”的理论问题,解决的是你登录服务器后下一步该敲什么的问题。适合刚接触 Linux 服务器、又需要马上干活的人,也适合已经写脚本但偶尔要查参数的老手。
2. 文件与目录操作:从相对路径到递归清理的完整命令链
2.1 目录创建与切换:相对路径、绝对路径和 -p 递归
cd、pwd 这类命令是每天登录服务器最先敲进来的。先把它们记牢,后面组合命令时少很多返工。
pwd # 查看当前工作目录 clear # 清除屏幕 cd ~ # 进入当前用户家目录 cd / # 进根目录 cd - # 回到上一次访问的目录 cd .. # 上一级目录cd - 是容易被忽略但很顺手的一个。在 /usr/local/app 下看完配置,又跑到 /etc/nginx 改文件,想回原来目录,一条 cd - 就搞定。脚本里在不同目录之间切换时,用它比反复写绝对路径省事。cd ~ 则相当于回到当前用户的家目录,配合 ssh 登录后第一时间用来确认自己在哪里。
创建目录的核心命令是 mkdir,区别主要在路径写法:
mkdir aaa # 当前目录下创建 aaa,相对路径 mkdir ./bbb # 在当前目录下创建 bbb,相对路径 mkdir /ccc # 在根目录下创建 ccc,绝对路径 mkdir -p temp/nginx # 递归创建,temp 不存在时会一并建出来相对路径以当前目录为起点,绝对路径以 / 为起点。很多新手在脚本里把绝对路径写错,导致部署时目录建到了预期之外的地方。我一般在脚本里优先用绝对路径,因为可读性好,别人接手时一眼能看出目录在哪;交互式操作时用相对路径,因为敲得快。
mkdir -p 是递归创建的开关。部署项目时经常要一次建多层目录,比如 /data/logs/nginx,如果 /data/logs 还没建过,不带 -p 会直接报“无法创建目录”。加 -p 后,父目录缺失的部分会自动补全,脚本不会在中间步骤断掉。查看目录内容用 ll,很多发行版里它就是 ls -l 的别名,会显示权限、属主、大小和修改时间;遇到精简安装的机器没有 ll 时,退回 ls -l 即可。
2.2 复制、移动与重命名:cp 和 mv 各自的能力边界
文件复制和移动是发布版本时用得最多的操作。区别一句话能说清:cp 保留原文件,mv 移动后原路径不再存在。
cp -r /aaa /bbb # 将 /aaa 复制到 /bbb 目录下 cp -r /aaa /bbb/aaa # 复制到 /bbb 下并指定名称 mv tomcat001 tomcat # 重命名 tomcat001 为 tomcat mv /aaa /bbb # 将 /aaa 移动到 /bbb 下 mv bbbb usr/bbb # 移动到 usr 目录下并改名 bbbcp 复制目录必须带 -r,否则会提示“略过目录”。递归复制时,目标路径写 /bbb 和写 /bbb/aaa 结果不同:前者把 aaa 原样放进 bbb 下,后者把目录名改掉。mv 不需要 -r,目录文件都能直接移动。
mv 的第二个参数如果是一个已存在的目录,目标会被移动到该目录内;如果第二个参数不存在,则效果是重命名。比如 mv bbbb usr/bbb,只有当 usr/bbb 这个路径不存在时,它才表示“移动到 usr 下并改名为 bbb”;如果 usr/bbb 已经存在,结果会变成把 bbbb 塞进 usr/bbb 里面。这个规则容易绕晕,我自己记的方式是:不确定时,先 ls 看目标路径是否已经存在。
cp 还有一个实用参数:cp -a 在做目录整体备份时比 -r 更稳,除了递归复制还会保留链接、权限和时间戳。发布代码时我一般先用 cp -a 备份当前版本,再覆盖新包,出问题时能快速回滚,这个习惯帮我避免过不止一次事故。
2.3 find 查找与批量清理:-name 和 -size 的组合用法
find 是定位文件和批量操作的工具。它的语法拆成三块:从哪找、找什么、找到后干什么。
find / -name 'b' # 在根目录下查找名为 b 的文件和目录 find / -name 'b*' # 查找以 b 开头 find . -name '*.pyc' -exec rm -rf {} \; # 递归删除所有 pyc 文件 find . -name "*" -size 145800c -print # 打印指定字节大小的文件 find . -name "*" -size 145800c -exec rm -rf {} \; # 删除指定大小文件-name 后面跟文件名模式,单引号能防止 shell 提前展开 *。-size 后面的单位用 c 表示字节,也可以写 k、M、G,比如 -size +100M 表示查找大于 100M 的文件。145800c 这种精确字节数一般用来找某个特定大小的临时上传文件,实际场景里我更常用 -size +500M 这类范围写法。
-exec 是 find 的关键能力。{} 是当前结果的占位符,; 是命令结束符。执行删除前,我通常先把 -exec rm -rf {} ; 换成 -print 跑一遍,确认列出来的文件确实可以删。这个习惯能挡掉大部分误删,尤其是配合通配符使用时。
提示:用 find 执行批量删除前,先加 -print 输出结果,确认目标无误后再接 -exec 删除。
2.4 split 拆分大文件:-b 按大小、-l 按行数
日志文件太大没法用编辑器打开,或者需要把大文件拆成小块传输时,split 是一个被低估的命令。
split -b 10k date.file # 按 10KB 大小分割 split -b 10k date.file -d -a 3 # 数字后缀,后缀长度 3 split -b 10k date.file -d -a 3 split_file # 自定义前缀 split -l 10 date.file # 每 10 行分割成一个文件-b 指定每个文件的字节数,-l 指定行数。-d 让后缀从字母变成数字,-a 控制后缀长度。比如 date.file 按 10KB 分割后,默认生成 xaa、xab 这样的字母后缀;加上 -d -a 3 后变成 x000、x001,排序更直观。自定义前缀时,生成的文件就是 split_file000、split_file001。
分割出来的文件不需要特殊工具合并,直接 cat 拼回去:
cat split_file* > date.file.bak # 按顺序合并这里依赖 shell 对通配符的字典序展开,x000、x001 的自然顺序正好等于文件切割顺序,所以能正确还原。
3. 日志与文件内容处理:tail/grep/vim 是排查问题的三件套
服务器出问题时,第一件事是看日志。这份 PDF 里这部分命令看着多,实际上围绕三件事展开:怎么把文件内容翻出来、怎么过滤关键词、怎么改配置。
3.1 cat / more / less:三种查看器的选择逻辑
查看文件内容有不同的粒度。cat 适合小文件,more 和 less 适合分页查看。
cat a.java # 一次性输出全文 more a.java # 分页显示,回车一行一行看,空格一页一页翻,q 退出 less a.java # 分页显示,支持上下方向键、PageUp/PageDown,q 退出 head -n 7 a.java # 只看前 7 行 tail -n 7 a.java # 只看后 7 行cat 会把整个文件打进终端,文件几百行甚至几千行时,前面的内容直接滚出屏幕,用起来很被动。more 能做基本分页,但有局限,不支持上下方向键回看。less 是两者里功能最全的,支持方向键和翻页键,而且它是按需加载,不用把整个文件读进内存,大日志文件用 less 明显比 more 快。
more 和 less 还有一个容易被忽略的差别:more 退出后,刚才显示的内容还留在 shell 里;less 退出后会清掉。我用 less 看配置文件,退出后终端干干净净,继续敲命令不会眼花。head 和 tail 是“只看两头”的快速通道,排查日志时不会上来就 cat 全文,而是 tail -n 先看最后几十行,再决定往哪个方向追。
查看操作系统版本时,用 cat /etc/redhat-release 或 cat /etc/os-release 都行。实际排错中,系统版本决定了软件源怎么配、某些包能不能装,是一个值得顺手记下的命令。
3.2 tail -f 跟踪日志,grep 过滤关键词
日志是动态增长的,tail -f 的作用是持续跟踪文件末尾,新写入的内容会实时出现。
tail -f a.java # 实时输出文件后 10 行 grep under 123.txt # 搜索 under,大小写敏感 grep -n under 123.txt # 显示行号 grep -v under 123.txt # 显示不匹配的行 grep -i under 123.txt # 忽略大小写 tail -f /var/log/messages | grep -i error # 实时过滤日志中的错误grep 的默认行为是大小写敏感。日志里经常出现 Error、ERROR、error 混用的情况,排查时我会直接加 -i,避免漏掉关键信息。-n 显示行号,定位到问题后能精确告诉同事去第几行看。-v 是反向选择,常用来过滤掉满屏的 INFO 日志,让 ERROR 和 WARN 浮出来。
管道 | 把上一个命令的输出作为下一个命令的输入,tail -f 配合 grep 是看实时日志的常用组合。注意 tail -f 会一直挂着,退出用 Ctrl+C。如果想把日志保留一份到文件,可以用 tee 或重定向,但在终端里临时过滤时,管道是成本最低的方式。
3.3 vim 修改配置文件:模式切换与保存退出
改配置绕不开 vim。这里不展开全部操作,只说进出模式。
vim /etc/nginx.conf # 进入后是一般模式 # 按 i 进入插入模式,左下角显示 -- INSERT -- # 编辑完按 ESC 返回一般模式 # 输入 :wq 保存并退出 # 输入 :q! 不保存强制退出 # 输入 :q 没有改动时直接退出新手在 vim 里按了一堆字母没反应,或者想退出退不掉,基本都是因为没搞清模式。打开文件默认是一般模式,此时按键是命令不是输入;按 i 后才进入插入模式可以打字;编辑完按 ESC 回到一般模式,再敲冒号进入底行模式执行 :wq。
如果改乱了想反悔,:q! 是后悔药,直接放弃改动退出。没有改动时用 :q 即可。注意冒号是英文冒号,输入法在中英文状态下按出来的字符完全不同,这也是一个隐蔽的坑。
3.4 系统日志位置:先知道去哪里找
日志文件位置是这份 PDF 里一个很实用的模块,整理成表:
| 日志路径 | 记录内容 |
|---|---|
| /var/log/messages | 系统启动后的信息和错误日志 |
| /var/log/secure | 安全相关,登录认证记录 |
| /var/log/cron | 定时任务执行记录 |
| /var/log/maillog | 邮件收发记录 |
| /var/log/boot.log | 守护进程启动和停止记录 |
| ~/.bash_history | 当前用户执行过的命令历史 |
messages 是排查系统级问题最先看的地方,网络、服务、内核的很多信息都会写到这里。secure 文件里能看到 ssh 登录成功或失败的记录,服务器被暴力尝试时,这个文件是重要证据。cron 记录定时任务每次执行的情况,任务没跑或者报错,先来这里看。
用户自己的操作记录在 ~/.bash_history,直接 cat 就能看到。我常用 history | grep 关键字来过滤以前执行过的命令,避免重新想参数。比如想找之前跑过的某个 java 启动命令,一条 history | grep java 就够了。
4. 压缩打包、软连接与文件权限:tar/zip/ln/chmod 的常用姿势
4.1 tar 打包解包:-cvf/-xvf/-z 的参数拆解
发布代码、迁移目录,tar 是最常用的打包工具。参数看着多,记住三组就够用。
tar -cvf start.tar a.java b.java # 打包两个文件,不压缩 tar -zcvf start.tar.gz a.java b.java # 打包并 gzip 压缩 tar -xvf start.tar # 解包到当前目录 tar -xvf start.tar -C /usr/local # 解包到指定目录,C 必须大写 tar -zxvf start.tar.gz # 解压 gz 格式 tar xf node-v12.18.1-linux-x64.tar.xz # 解压 xz 格式c 是创建、x 是解包、v 是显示过程、f 是文件名、z 是 gzip 压缩。-C 指定解包目标,C 必须大写,而且和参数之间要有空格。tar 本身能自动识别 .tar.gz、.tar.xz 等格式,直接 tar xf 就能解压,不一定要写 z。
tar.xz 这类文件在实际工作中很常见。比如官方发布的二进制包经常是 .tar.xz 格式,解压后放到 /usr/local 下,再做软连接就能直接用。如果解压时遇到“Cannot open: No such file or directory”,先检查包名路径是否写错,再确认文件确实存在。
4.2 zip 和 unzip:压缩目录、指定解压路径
跨平台传文件时 zip 比 tar 更通用,尤其是在和 Windows 环境打交道时。
zip lib.zip tomcat.jar # 单个文件 zip -r lib.zip lib/ # 压缩整个目录,必须 -r zip -r lib.zip tomcat-embed.jar xml-aps.jar # 多个文件 unzip file1.zip # 解压到当前目录 unzip -d /usr/app/english.zip # 解压到指定目录zip 压缩目录必须加 -r,不加的话目录只会被当成空目录打进去,里面的文件不会包含。-r 是递归的意思,和 cp -r、mkdir -p 一样,都是这类工具里“递归”语义的体现。如果压缩后文件数量对不上,先检查有没有漏掉 -r。
unzip -d 指定解压路径,目录不存在时会自动创建。我习惯强制加上 -d,避免 zip 包里的文件直接铺在当前目录,尤其是接手别人打包的压缩包时,先解压到一个临时目录里看结构,比直接解压到工作目录安全得多。
4.3 软连接 ln -s:创建与删除时斜杠的区别
软连接相当于快捷方式,常用于把应用目录映射到固定路径。
ln -s /usr/local/app /data # 创建软连接 /data -> /usr/local/app # 源目录末尾不要加斜杠 rm -rf /data # 删除软连接本身,末尾不要加斜杠创建时源目录加斜杠,部分环境会把目标解析成源目录下的下一级,导致软连接指向不对。删除时如果写成 rm -rf /data/,外壳会把它当成真实目录去删,结果删掉的是目标目录里的内容,软连接还在。这个坑在下一章会专门展开。
4.4 权限位怎么读:rwx 三段与 chmod
ls -l 的第一列不是乱码,它拆成四段:第一个字符是文件类型(- 普通文件,d 目录,l 软连接),后面三段分别是属主、属组、其他人的权限。
ls -l bootstrap.jar # -rw-r--r-- 1 root root 34942 Jan 19 2018 bootstrap.jar chmod u+x web.xml # 给属主加执行权限 chmod 444 web.xml # 所有人只有读权限去掉第一个字符后,rw-r--r-- 表示属主可读写,属组和其他人只读。chmod 的数字写法是把 r=4、w=2、x=1 相加,644 是文件默认权限,755 是属主完整权限、属组和其他人读加执行,适合脚本和目录。给脚本加执行权限时,常见做法是 chmod 755 xxx.sh 或直接 chmod +x xxx.sh。
5. Linux 命令避坑:五个真实翻车现场与排查方法
这一章不是讲命令怎么写,而是讲实际踩过或者看别人踩过的坑。每条按现象、原因、解决三步走,方便直接对着排查。
5.1 rm -rf 跟通配符:误删现场如何止损
现象:执行 rm -rf ./* 后,当前目录下业务文件被清空,shell 没有任何提示。
原因:* 会被 shell 展开成当前目录下所有文件(隐藏文件除外),rm -rf 直接递归删除,不带任何二次确认。
解决:批量删除前先 ls 看一眼通配符会展开成什么;在脚本里尽量用 find ... -print 先打印;删除配置文件或备份目录前先 tar 打包留底。我自己的习惯是,涉及通配符的删除命令先用 echo 开头跑一遍,输出没问题再执行真命令。
5.2 软连接删除:末尾加不加斜杠差别很大
现象:删除软连接时执行 rm -rf /data/,结果源目录内容被清空。
原因:路径以斜杠结尾时,rm 按目录处理,/data/ 会落到软连接指向的真实目录。
解决:删除软连接用 rm -rf /data,不带斜杠,只删连接本身。判断路径是不是软连接,用 ls -l 看第一个字符是不是 l。创建软连接时,源路径同样别加斜杠,这一点在创建时就要养成习惯。
5.3 tar 解压不指定目录:文件散落一地
现象:执行 tar -xvf 解压一个包后,文件直接铺在当前目录,覆盖了同名配置。
原因:tar 默认解压到当前目录,如果包内不是统一放在一个顶层目录,文件就会散开。
解决:解压前先执行 tar -tvf start.tar 看包内结构;解压时养成加 -C 的习惯,指定一个干净的目录;完全不知道里面是什么时,先 mkdir /tmp/xxx 再解压进去检查结构,确认没问题再移动。
5.4 Ctrl+Z 和 Ctrl+C:挂起与终止不能混用
现象:在终端运行服务时按 Ctrl+Z,本以为退出了,结果服务没停,shell 还被占住。
原因:Ctrl+Z 不是终止而是挂起,进程进入 stopped 状态,相当于暂停;Ctrl+C 才是向进程发送中断信号。
解决:误按 Ctrl+Z 后,用 fg 把任务拉回前台,再用 Ctrl+C 终止;或者用 bg 放到后台继续跑。需要彻底停掉服务时,直接 Ctrl+C 或者 kill 对应 PID。区分这两个动作,能避免很多“服务明明停了你却说没停”的争论。
5.5 useradd 不创建家目录:用户建好了却登录不了
现象:执行 useradd sum 创建用户后,su - sum 登录进去,家目录不存在,环境变量也不对。
原因:useradd 默认不创建家目录,只有加 -m 参数时才会生成 /home/sum。很多发行版对“是否创建家目录”的默认策略不一样,不看参数直接建用户,迟早进这个坑。
解决:创建可登录用户用 useradd -m -d /home/sum sum,再执行 passwd sum 设置密码。如果需要 sudo 权限,用 visudo 打开权限配置文件,给对应用户加一条和 root 类似的授权行,比如 sum ALL=(ALL) ALL。删除用户时,userdel sum 不会清家目录,要一并清理就 userdel -r sum。
6. 用 top 和 netstat 读取系统状态:一个运维组合技巧
6.1 top 的输出先看两个区
top 是实时刷新系统状态的命令,输出分统计信息区和进程信息区。统计信息区第一行跟 uptime 一样,load average 三个数分别代表最近 1、5、15 分钟的平均负载,数值超过 CPU 核数说明任务在排队。Tasks 行里 zombie 不是 0 要留意,说明有进程没被正确回收。%CPU(s) 里 id 是空闲 CPU,wa 高说明系统在等 IO,常见诱因是磁盘慢或日志写入过大。进程信息区里 VIRT 是虚拟内存,RES 是物理内存,%MEM 看内存占比,S 列 R 表示运行、S 表示睡眠、Z 表示僵尸。
top -b -n 1 | head -20 # 一次性输出当前 top 快照-b -n 1 让 top 以批模式输出一次就退出,方便脚本采集当前状态,不需要开一个交互终端挂着。
6.2 netstat 统计连接状态,awk 一行搞定
端口和连接状态排查用 netstat。查端口占用是 netstat -tulpn | grep 8080,-t 是 TCP,-u 是 UDP,-l 只显示监听,-p 显示 PID 和进程名,-n 不反解域名。统计各种连接状态的数量,用这一条:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'$NF 取每行最后一列,也就是连接状态字段,awk 按状态名累加输出。假如出现大量 CLOSE_WAIT,通常是应用没正确关闭连接;大量 TIME_WAIT 常见于短连接多的场景,多半属于正常回收范围。这份 PDF 里还顺带整理了 ping、ps、jstack 查看线程等命令,遇到类似排查场景都可以直接翻。
从那以后,我每次发布前都会先跑 netstat -tulpn | grep 端口确认服务已监听,再看一眼 top 的负载确认没有异常,这两步过了才继续操作。希望帮到你。
本文还有配套的精品资源,点击获取