先把结论放前面Linux的基本指令不是背出来的是“用”出来的。我见过太多人抱着一长串命令列表背两天结果到了真机上连ls -l输出里那一堆字段都看不懂更别提grep、awk、tar这些每天都在用的组合。这篇文章我换个思路不按“命令大全”的方式罗列而是把基本指令拆成几个真实的使用场景从场景反推命令顺带把参数的含义、易踩的坑、排查的思路一起讲清楚。无论你是刚接触Linux的新手还是准备运维面试、想补嵌入式Linux基础的工程师这篇都能帮你把“会用”变成“用得明白”。1. 先给基本指令分个类别让命令列表吓住你Linux命令数量多到吓人随便一个发行版里都有上千个可执行文件。但实际日常使用中你真正高频调用的基本指令就那么几十个。我自己的习惯是先把命令按用途分成六类再往里填具体命令这样记忆负担会小很多。第一类目录与文件操作。cd、ls、pwd、mkdir、rm、cp、mv、ln这一类占日常操作的一半以上。第二类文件内容查看与检索。cat、less、tail、head、grep、sed、awk做日志分析、文本处理时全是它们。第三类权限与用户管理。chmod、chown、useradd、passwd、sudo、su多人协作和服务器管理绕不开。第四类进程与服务管理。ps、top、kill、systemctl、free排查系统负载、服务异常时靠这一组。第五类网络、磁盘与系统状态。ss、netstat、ping、df、du、uname日常体检服务器状态的时候用。第六类归档压缩与文件传输。tar、zip、scp、rsync部署、备份、迁移的必备工具。之所以先分类是因为命令之间的关联性比孤立记忆重要得多。比如你看到ls的时候如果能联想到ls -l、ls -a、ls -lh并且知道什么时候该用哪个比背下三十条ls参数更有价值。面试里也常考“Linux常用命令大全”但面试官其实在意的不是你会列多少条而是你知不知道在什么场景下选哪条命令、为什么选它。2. 目录与文件操作在Linux里“走路”和“搬东西”的基本功2.1 cd、ls、pwd先学会看清楚自己在哪很多人用Linux的第一天就在cd和ls上吃了亏。pwd是最容易被忽略却最实用的命令之一它告诉你当前所在的目录。每次连接服务器、切换用户或者跑完一个脚本先敲一句pwd确认自己没跑偏这是最基础的操作习惯。cd的用法里有几个隐藏细节。cd ~回到当前用户的家目录cd -回到上一次所在目录这两个快捷方式能省很多事。绝对路径和相对路径的区别也必须搞清楚绝对路径从根目录/开始写比如cd /var/log/nginx相对路径从当前位置开始写比如cd ../conf。我见过不少新手在脚本里写了相对路径结果脚本被放到另一个目录下执行就直接崩了这就是没搞懂两者的本质区别。ls的常用参数用一句话就能记牢ls -l看详细信息ls -a看隐藏文件ls -h把文件大小显示为人类友好的单位ls -t按时间排序ls -S按大小排序。实战里用得最多的组合是ls -lht按时间列出当前目录下所有文件并显示大小排查日志目录时特别好用。ls -l的输出很多人只会看第一列和最后面的文件名中间那一串其实信息量很大。比如下面这行-rw-r--r-- 1 root root 2351 Feb 20 10:30 app.log从左到右依次是文件类型和权限、硬链接数、属主、属组、大小、最后修改时间、文件名。文件类型里-是普通文件d是目录l是软链接c是字符设备。把这些看懂你就已经超过了相当一部分“背过命令但不会看输出”的人。2.2 创建、复制、移动、删除胆大心细的操作合集创建文件和目录很简单touch test.txt创建空文件mkdir mydir创建目录mkdir -p a/b/c则可以连同中间层级的目录一起创建。这个-p在很多命令里都是“递归、自动补齐父级”的意思cp -r里的-r也是一样。没有-p的时候mkdir a/b/c会报No such file or directory新手尤其容易在这里卡壳。cp和mv的区别要刻在脑子里cp是复制原文件还在mv是移动或重命名原位置就没有了。跨文件系统移动时mv的行为会退化成“先复制再删除”所以大批量移动文件时如果发现速度异常别太意外。复制目录必须加-r即cp -r src_dir dest_dir否则会提示-r未指定而失败。删除指令rm是世界上最快让人后悔的命令没有之一。rm file删普通文件rm -r dir删目录rm -f是强制删除不提示rm -rf则是“递归强制”瞬间能把整个目录树干掉。我从来不建议新手把rm -rf当成顺手敲的指令尤其不要在写脚本的时候裸用变量拼路径比如rm -rf $DIR/一旦$DIR为空变成rm -rf /后果直接是灾难级的。真要用先把路径写死再在命令前加echo打印出来检查一遍。2.3 软链接与硬链接被面试问烂的lnln -s创建软链接符号链接ln不带参数创建硬链接。软链接可以跨文件系统也可以指向目录但它本质是个指向原路径的文件原文件被删掉后软链接就失效了。硬链接不能跨文件系统不能指向目录但它和原文件共享同一个inode只要还有一个硬链接存在数据就还在。实际工作中软链接的使用频率远高于硬链接。比如在嵌入式Linux里/usr/bin/python常常是/usr/bin/python3的软链接这样上层脚本不用关心具体版本。面试题里常问“软链接和硬链接的区别”把这两段说清楚再顺带提一下inode基本就是满分回答。3. 文件内容查看与文本检索日志排查的全套手艺3.1 从cat到less只看需要的内容不要一次全倒出来cat适合查看小文件一般几百行以内的配置文件用cat没问题。但大文件千万别用cat直接刷屏打开一个几百MB的日志终端会卡到像死机。这时候用less支持上下翻页、按/搜索关键词、按q退出基本是日志查看的标配。tail和head是只查看文件开头或结尾的命令。tail -n 50 app.log表示看最后50行tail -f app.log是实时跟踪文件新增内容排查线上日志时这就是主力命令。head -n 20看文件开头经常用来快速确认日志格式或者配置文件的前几行。这里有个实用技巧排查日志时先tail -n 100 app.log | grep ERROR过滤出错误行再用sed -n 10,20p app.log按行号区间打印某一段内容。这两个组合用下来基本能应对绝大多数日志定位需求。3.2 grep文本检索的核心力量grep是最值得吃透的命令之一。最基本的用法是grep keyword file在文件里搜关键字。实际使用中我几乎总是带参数grep -i忽略大小写grep -v反向匹配排除掉某些行grep -r递归搜索目录排查代码里的调用关系很好用grep --include*.conf限定只搜索.conf文件grep --exclude*.log跳过日志文件。正则表达式是grep的进阶玩法。基础正则里^匹配行首$匹配行尾.匹配任意单个字符*匹配前一字符零次或多次。加grep -E后可以使用扩展正则、?、|、{}这些元字符就能直接用了。比如查IP地址grep -E [0-9]{1,3}(\.[0-9]{1,3}){3} access.log。我自己的习惯是先在head输出里确认日志格式再设计正则最后用小范围样本验证不会直接拿大文件跑一个自己都拿不准的正则。3.3 sed和awk文本处理的“三板斧”入门很多人一听sed和awk就发怵实际上日常用到的功能非常集中。sed主要用于替换和删除。替换的格式是sed s/old/new/g file其中g是全局替换不加g只替换每行第一个匹配。sed /pattern/d file可以删除匹配特定模式的行。注意sed默认不会修改原文件要想直接在文件上生效要加-i比如sed -i s/127.0.0.1/0.0.0.0/g app.conf。这个-i要格外谨慎因为修改是回不来的建议先不加-i跑一遍把结果打到终端检查。awk的核心功能是按列处理文本。默认按空格或Tab分隔awk {print $1, $3} file就能打印第一列和第三列。比如从ls -l的输出里提取所有文件大小可以用ls -l | awk {print $5}。再加一点条件判断awk $5 1024 {print $9}就能筛选出大于1KB的文件名。awk真正强大的是后面还能挂BEGIN、END这些块执行累加统计之类的操作但入门阶段把“按列提取条件过滤打印”这三件事练熟就完全够用。4. 权限与用户管理每个符号后面都是事故教训4.1 看一眼权限位就知道会不会被拒绝ls -l输出第一列的十个字符里第一个是文件类型后面九位分成三组分别代表属主、属组和其他人的权限。每一组三位顺序是读、写、执行。rwx都出现就是7rw-就是6r-x就是5r--就是4。这套数字换算一定要熟到像条件反射一样755属主可读写执行属组和其他人可读可执行常用于目录和可执行程序644属主可读写其他人只读常用于普通文件600只有属主可读写常用于密钥、密码文件700只有属主可读可写可执行常用于私密脚本目录。chmod可以直接用数字也可以符号方式。chmod ux script.sh给属主加执行权限chmod g-w file去掉属组的写权限。实际部署时我倾向于先想想这个文件到底要给多少人什么权限再决定用哪个数字而不是无脑复制网上的chmod 777。chmod 777在公网服务器上就是给所有用户开放写权限安全风险极大能用755、644解决的问题绝对不用777。4.2 修改属主和属组chown的规范用法chown user:group file可以同时修改属主和属组比如chown nginx:nginx /var/www/html。有时候只需要修改属组可以用chgrp不过chown user:group一条命令都能搞定我自己基本不怎么单独用chgrp。目录递归修改时chown -R user:group dir会连目录下所有子文件和子目录一起改执行后最好用ls -l抽查几个文件确认没有问题。有一个很容易被忽略的细节修改配置文件的属主时如果网站用的是Nginx和PHP-FPM不同进程要求不同的读权限。前端静态文件给Nginx用户读就行PHP文件可能需要PHP-FPM用户读日志目录往往要交给某个服务用户写。盲目地chown -R www:www处理一切后续可能会出现奇怪的权限报错遇到这种问题第一步就是检查属主属组对不对。4.3 用户管理useradd、passwd、sudo和su的区别useradd用来新建用户useradd -m -s /bin/bash alice创建用户并创建家目录、指定登录Shell。passwd alice设置密码。useradd和adduser的区别是不同发行版对后者的封装不同在Debian系的系统里adduser更像交互式向导在CentOS/Rocky里两者行为也有差异。建议直接掌握useradd表现更稳定。su和sudo都要会用但用法差异很大。su - root是切换到root用户需要输入root密码整体环境变量也切到root的sudo command是临时用root身份执行某条命令输入的是当前用户的密码前提是当前用户被加入了sudo权限组。生产环境里我最推荐的做法是不给任何人root密码日常管理全部通过sudo完成需要提升权限时用sudo visudo精确控制只给指定用户授权几条命令。比如devuser ALL(ALL) /usr/bin/systemctl restart nginx这样只允许devuser执行重启Nginx的操作其他root权限一律不给是降风险非常实用的做法。另外sudo -u anotheruser command是以某个指定用户身份执行命令这条在排查“为什么这个程序没权限”时特别有用。5. 进程、服务与系统状态一眼看出机器到底怎么了5.1 ps、top、free先看有没有“坏人”占资源排查一台变慢的服务器我不会上来就重启而是先跑三连top、free、df -h。top是动态查看进程和系统负载的利器。第一行能看到负载均值三个数字分别代表1分钟、5分钟、15分钟平均负载如果持续高于CPU核心数说明系统确实繁忙。按下P键按CPU排序按下M键按内存排序q退出。ps则是静态打快照的视图。日常够用的组合是ps aux或ps -ef配合grep筛选进程比如ps aux | grep nginx。ps输出里的STAT列很关键S表示睡眠R表示运行Z表示僵尸进程。如果看到很多Z说明父进程没有回收子进程资源这是一条重要的排查线索。内存方面输出free -h重点看available那一列。这里有个常见认知偏差free的used看起来很高并不代表内存不够因为Linux会把空闲内存用作缓存实际可用的是available数值才真正反映还有多少内存可以用来分配。5.2 kill、systemctl系统服务管理的两套思路杀掉一个进程常用kill PID默认发的是SIGTERM信号让进程自己清理后退出。如果进程不响应才用kill -9 PID强制杀掉。这里要特别提醒kill -9不要一上来就使有些程序被强制杀掉后缓存数据没落盘直接会损坏文件。systemctl start/stop/restart nginx是管理系统服务的方式。改完配置文件后需要systemctl daemon-reload让systemd重新加载配置再systemctl restart nginx生效。排查服务状态时systemctl status nginx会显示进程PID、最近日志和当前状态比单纯用ps判断“进程在不在”信息量更大。实际运维里我遇到更多的情况是这样进程明明还在但服务就是访问不了。这时候优先查端口监听状态再看日志输出一步步缩小范围而不是直接重启大法。5.3 ss和netstat端口的真相都在这排查端口监听老派命令是netstat -tlnp现在很多新系统里更推荐ss -lntp原因是大数据量连接下ss更快。ss -lntp里的参数含义是-l只看监听状态的端口-n不做域名反解直接显示数字-t只显示TCP连接-p显示进程信息。输出里如果看到0.0.0.0:80说明这个端口监听在所有网卡上127.0.0.1:3306则只监听本机回环地址外部无法访问。很多数据库默认只允许本机连接外部连不上时先查这里就会发现原因。查看完整连接状态时还能看到ESTAB、SYN_SENT、TIME_WAIT等状态。如果出现大量的SYN_SENT连接往往意味着目标端口不通或者防火墙拦截TIME_WAIT过多一般跟短连接高并发有关。这些状态背后都对应着典型的网络故障模型值得单独记一下。6. 归档压缩与文件传输部署和备份的基本功6.1 tar一条命令搞定打包和压缩tar命令的常用组合基本是固定的# 打包压缩 tar -czvf backup.tar.gz /var/www/html # 解压 tar -xzvf backup.tar.gz # 解压到指定目录 tar -xzvf backup.tar.gz -C /tmp/restore参数拆开理解-c创建归档-x解压-z使用gzip压缩-v显示过程-f指定归档文件名。为什么-f总是放在最后因为-f后面跟着的是文件名如果写成tar -cfzf后面会被当成文件名的开头命令就会错乱。有几个实用变体也要记住。打包时排除某些文件tar -czvf backup.tar.gz --exclude*.log --excludecache /var/www/html。只查看归档内容不解压tar -tzvf backup.tar.gz。处理.tar.gz时用-z处理.tar.bz2时用-j处理.tar.xz时用-J。6.2 scp和rsync传文件别只靠rz/sz复制文件到远端服务器scp file userhost:/path是最直接的方式。递归复制目录需要加-r指定端口则加-P。scp -P 2222 app.tar.gz root192.168.1.10:/opt/。rsync则更强大它最大的价值是增量同步只传输差异部分文件多的时候性能优势明显。基本用法rsync -avz src_dir/ userhost:/dest_dir/其中-a保留权限、属主、时间戳等元信息-v显示过程-z传输时压缩。注意src_dir/和src_dir末尾的斜杠有个坑带斜杠表示同步目录里的内容不带斜杠会把目录本身也同步过去。这个细节不搞清楚经常会把目录层级同步错。rsync加--delete可以删除目标目录里源端没有的文件让两边完全一致但这条参数一定要经过演习再用因为误删是无法挽回的。备份场景里我更常用的是rsync -avz --backup配合备份目录避免覆盖旧文件。7. 我这些年踩过的坑Linux基本指令现场实战笔记7.1 命令找不到先检查PATH和环境变量新装的Linux系统里有些命令输入后提示command not found第一反应不是“命令不存在”而是确认它是不是有名但不在PATH里。比如ifconfig在较新发行版上默认不存在替代者是ip addrnetstat不在的话可以用ss。真需要安装时Debian系执行apt install net-toolsRHEL系执行dnf install net-tools。echo $PATH可以查看当前在哪些目录里找命令。如果自己安装的软件比如Python或Node装完还是执行不了大概率是它的可执行目录没有加进PATH。修改/etc/profile或者当前用户的~/.bashrc然后source生效。这类问题在面试题的实践环节经常出现不要只背命令要真的动手装一次。7.2 rm之后后悔了别慌先说预防方案删除文件之后才发现自己删错了如果是用普通方式删的在大部分情况下已经没法直接恢复。能救的可能是临时占用情况下的文件句柄但那需要进程还在运行的特殊场景。现实做法是提前备份或者在操作前用mv把文件移到临时目录而不是直接rm。我现在养成了一个习惯在删除目录前先执行ls -la看清目录里有什么再执行du -sh看清目录大小最后把完整的路径拼好用echo打印一下确认无误再真的执行。禁止在环境变量没有验证的情况下使用rm -rf $VAR/这种写法。这不是胆小是吃过亏以后的肌肉记忆。7.3 磁盘显示没问题但还报No space leftdf -h显示使用率不高但系统仍然提示磁盘空间不足这种情况大概率是inode耗尽了。df -i可以查看inode使用率如果到100%即使还有剩余块也无法新建文件。出现这种情况通常是某个目录下堆积了大量小文件比如邮件队列、缓存目录或者/tmp下的碎片。定位方法是对每个目录执行find / -xdev -type f | wc -l对比统计找到文件最多的目录再做清理。另一个常见坑是删除了文件但空间没释放。原因是文件被某个进程占用删除后空间要等进程关闭文件句柄才释放。用lsof | grep deleted找出这些文件对应进程重启该进程后空间就能正常回收。7.4 端口占用除了换端口还要找到谁占的服务启动时报Address already in use先查谁占了这个端口lsof -i:8080或者ss -lntp | grep 8080。查到PID后用ps -fp PID看是什么进程。如果确认是残留的旧服务可以kill PID清理但如果不是你的服务不要看到端口就是杀先确认进程归属避免误伤。7.5 权限被拒Permission denied的万能排查顺序遇到权限相关的报错我从来不慌按顺序排查基本都有答案。第一步ls -ld看完文件类型和权限第二步确认当前用户和文件属主属组第三步检查父目录有没有执行权限第四步看是否有SELinux或AppArmor策略在拦截。比如网页目录里文件权限明明是644但Nginx就报Permission denied被忽略的往往是父目录没有执行权限。没有--x权限时即使文件可读也无法通过父目录进入访问路径。SELinux开启时会出现更隐蔽的拒绝先getenforce确认SELinux状态再用ausearch -m avc -ts recent查看拒绝日志比盲目chmod 777靠谱一百倍。7.6 常用命令速查表贴键盘旁边比收藏夹好用场景命令备注查看当前路径pwd脚本里建议先执行查看文件详情ls -lht按时间排序递归创建目录mkdir -p a/b/c自动补父目录查找文件find /path -name *.log按文件名检索搜索文件内关键词grep -rn error /var/log/递归加行号实时看日志tail -f app.log排查线上问题主力复制目录cp -r src dest别漏-r移动或重命名mv old new测试环境可用生产慎用删除目录rm -rf用前先echo拼好路径打包目录tar -czvf backup.tar.gz dir排除文件用--exclude解压tar -xzvf backup.tar.gz -C target-C指定目录查看端口ss -lntp替代netstat查看进程ps aux | grep nginx加-ef展示全格式实时状态topP按CPU排序M按内存排序修改权限chmod 755 script.sh普通文件用644脚本用755修改属主chown -R user:group dir递归需确认最后再分享一个我自己的习惯每一个命令敲下去之前先在心里回答三个问题——我现在在哪个目录这条命令要操作的文件全路径是什么操作能不能撤销三个问题都答得上来再按回车。这听起来慢实际上比敲错以后花半小时排查要快得多。把这些指令内化成条件反射以后你再看Linux基本指令就不是一堆零散的命令而是一张随时能调用的解决问题的地图。