1. 为什么Linux基本指令是绕不开的基本功说真的Linux基本指令这个东西你不管做运维、开发还是搞测试、数据分析只要天天跟服务器打交道就躲不开它。很多人一上来就想着装图形界面、用宝塔面板、套一层Web管理工具结果遇到线上环境没有图形界面的服务器就彻底抓瞎了。我自己带过不少新人他们最常说的一句话是“图形界面能干的命令行为什么非得敲单词”答案很简单生产环境的Linux服务器十台里有九台是不装图形桌面的而且出问题时你唯一能依靠的就是那几十条最基础的指令。与其说“学指令”不如说是在学“怎么跟操作系统对话”。你敲一条ls系统就回你一个文件列表你敲一条ps系统就把当前运行的进程摆在你面前。这种一问一答的模式看起来原始其实特别高效。尤其现在网上随便一搜就是“linux常用命令大全”动辄100条、200条但真正日常用到的也就三四十条。把这三四十条练到肌肉记忆比下载一个1000条的速查手册有用得多。这篇文章不是把命令抄一遍给你而是从实际使用场景出发把那些天天要用的指令拆开讲清楚顺便穿插一些踩坑经验。适合谁看呢第一类是刚转行做运维或者刚进公司的实习开发你需要在最快时间内能独立部署环境、查日志、看进程第二类是准备Linux面试的求职者我可以告诉你哪些问题面试官真的会问第三类是那些已经在用Linux但全靠图形界面想摆脱“点击者”身份的老用户。如果你属于其中任何一种往下看基本没有废话。2. 高频Linux指令全拆解2.1 文件与目录操作比你想的更有讲究文件操作是Linux的“看家功夫”也是面试时最容易被问出细节的部分。比如最简单的ls大多数人只会用ls或者ls -l但实际工作中ls -lht是看文件列表最高频的用法h是让人能看懂的大小KB/MB/GBt是按修改时间倒序排序这样最新改过的文件永远排在最上面。排查问题时你往往需要第一时间看到刚刚生成的日志文件这个组合命令非常顺手。cd和pwd没什么好讲的但有一个技巧cd -可以直接回到上一次所在目录。这个命令在A目录和B目录之间频繁切换时特别省事比反复输入全路径快得多。很多人不知道cd其实也可以直接接完整路径比如cd /etc/nginx/conf.d/没有加引号也完全没问题因为Linux路径默认不带空格带空格才需要转义或加引号。cp和mv是文件操作里最常用的两个但它们的细节特别值得注意。cp默认不会复制隐藏文件如果你要复制整个目录连同隐藏配置得用cp -aa是归档模式会保留权限、时间戳和所有者。类似的mv在跨文件系统时会先复制再删除所以如果你把一个文件从挂载盘移动到本地目录如果文件特别大你会觉得卡了一下其实是cp的过程。这不是bug是mv的正常行为。rm倒是简单粗暴但一个小心得rm -rf的威力太大我自己的习惯是在需要递归删除的目录前先cd进该目录用ls -la确认无误再退回来用绝对路径执行删除。这样可以避免因为相对路径输错导致误删。文件查找有两个命令find和grep经常被混在一起。find用来按文件名、大小、时间查找文件比如find /var/log -name *.log -mtime -7意思是在/var/log下找7天内修改过的日志文件。grep是文本内容搜索比如grep -r error /etc/nginx/递归查找配置文件里出现error的行。很多新手搞不清两者的区别记住一句话find查的是“文件叫什么/文件多大”grep查的是“文件内容里有什么”。排查问题时find和grep经常连着用先定位文件再看内容。2.2 用户与权限别再用root裸奔了权限管理是Linux安全的核心但也是很多初学者的盲区。最常见的场景是拿到一台测试服务器管理员直接给你一个root账号你也图省事一直用root操作。这在校验环境能跑通但上了生产环境就是大忌。尤其杀进程、改文件、跑脚本一个手误就是事故。所以第一条指令我建议你熟悉useradd建一个自己的普通用户日常操作都用普通用户做需要提权时再加sudo。useradd和adduser在某些发行版上行为不一样CentOS和Ubuntu就不同。CentOS上的useradd要配合passwd username来设置密码Ubuntu上的adduser更像一个交互式工具会顺便帮你建家目录、设置密码、填用户信息。实际运维中大家更常用useradd因为参数明确可以一步到位useradd -m -s /bin/bash zhangsan-m是自动建家目录-s是指定登录shell。没有-m的话用户没有家目录登录后会在根目录下很多配置会出问题。权限管理绕不开chmod和chown。chmod的常用写法有两种一种是数字法比如chmod 754 file4217是读写执行给文件所有者541是读执行给所属组4只读给其他用户。另一种是符号法比如chmod ux file给所有者加执行权限。日常工作用数字法最多因为三个数字摆在一起权限一目了然。但要注意对于配置文件尤其是nginx、redis之类的配置权限千万别随便给777否则存在较大的安全风险。一般644就够了特殊需要执行权限的脚本才给755。给某个目录设权限时还要同时考虑目录的可读可写可进入比如chmod 755 /data就是每个用户都能查看目录列表但只有所有者能写入里面。chown则是改属主和属组比如chown www:www /var/www/html把网站目录所有权交给www用户。很多人忽略了属主问题遇到“Permission denied”就懵了。其实大部分时候不是权限码不够而是文件属主不对。比如你用root上传了一个nginx.confnginx主进程以root身份启动后会自动把worker进程切到nginx用户但用户nginx并没有权限读root属主的文件就会报403。这种情况一句话点破chown nginx:nginx /etc/nginx/nginx.conf。sudo也是一个很关键的指令。很多人以为sudo就是一个“升级成root”的开关其实它更像一种授权机制。你可以在/etc/sudoers文件里精确控制让特定用户只能执行某些命令。比如让zhangsan只能重启nginxzhangsan ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx。这种细粒度控制在企业环境里很常见也面试爱考。自己练手时可以简单一点直接把用户加到wheel或sudo组里就行usermod -aG wheel zhangsan。2.3 进程与系统管理让机器听你的话系统管理指令里最先要搞明白的是systemctl因为现在的CentOS、Debian、Ubuntu主流版本统一用systemd作为初始化系统。以前那些service命令基本成了兼容层真正起服务的是systemctl start nginx、systemctl enable nginx、systemctl status nginx。enable很关键它决定服务是否开机自启很多新手配好服务后一重启机器服务就没了就是忘敲了enable。查进程最常用的立志命令是ps auxa是显示所有用户的进程u是显示用户和资源占用x是显示没有终端控制的进程。ps aux的输出里PID是进程号kill可以结束但更推荐先用kill -15让进程优雅退出等它自己清理资源如果它不听话再上kill -9强杀。很多新手直接kill -9副作用是进程的临时文件和锁可能没来得及清理下次启动可能报“Address already in use”之类的错。实时监控系统状态有两个老牌工具top和free。top可以看到CPU、内存、进程占用按P键按CPU排序按M键按内存排序。如果只看内存free -h更直接可以看到总内存、已用、可用、buff/cache。还有一个很多人忽略的vmstat 1每隔1秒刷新一次系统整体的运行队列、CPU切换、内存页交换排查性能瓶颈时比top更宏观一些。日志查看也是日常刚需。tail -f /var/log/messages或者journalctl -u nginx用systemd的统一日志可以实时滚动输出看到新日志报错就能立刻定位。相反如果想查最近一次错误可以用journalctl -u nginx -xe-x是附带系统提示-e是跳转到日志末尾附近。排查崩溃问题我个人习惯先把关键服务的日志文件全部定向到同一个临时文档里比如journalctl -u nginx /tmp/nginx.log 21然后慢慢看避免日志刷屏。进程名称修改这个问题热搜里也有人问。很多人以为进程名只能由可执行文件名决定其实很多程序会在启动时用prctl设置名字比如Java进程会显示java如果你想改成自定义的名字可以用exec -a比如exec -a my_process /usr/bin/myapp。但这种改法在ps里未必完全生效因为很多进程会继续更新自己的cmdline。真正稳妥的方式是在应用代码里调用prctl但普通运维场景下不必太执着大多数时候知道怎么看进程、怎么杀进程就够了。2.4 网络与远程操作不迷路的第一桶金网络指令里最基础的是ping判断网络通不通。但更建议不再用ping做唯一依据因为它只能测ICMP通不通防火墙可能屏蔽ICMP。更常用的排查组合是ss -lntp或者老的netstat -lntp查看端口监听状态和对应的进程PID。比如你启动了一个服务却发现访问不了第一反应就该是ss -lntp | grep 8080看8080端口到底有没有进程在听。如果没有服务没起来如果ss显示监听但浏览器还是打不开就要继续想防火墙、安全组、绑定的IP地址有时候服务只绑了127.0.0.1外网当然访问不到。远程操作主要靠ssh和scp。ssh登录服务器就不用多说了公钥免密登录建议尽快配好用ssh-keygen生成密钥对然后把公钥追加到服务器上的~/.ssh/authorized_keys里。这样每次登录不用输密码脚本和自动化任务也能省事。scp传文件也常见scp -P 2222 ./a.txt rootip:/tmp/注意-P必须大写它不是cp的小写-p。和scp类似的还有rsyncrsync支持断点续传和增量同步大文件传输优先用rsync -avz --progress。curl是调试HTTP接口的神器。curl -I https://example.com可以看到响应头用来判断服务是否正常curl -X POST -d {key:value} -H Content-Type: application/json url可以模拟POST请求。面试时候会问“你怎么测试一个接口是否可用”你回答用curl -I和curl -v对方会觉得你很实在。3. 典型实操场景与指令组合3.1 新服务器到手的第一件事很多人一拿到新服务器就急着装软件其实有几个基础检查没做的后面全是坑。我的固定流程是这样的首先cat /etc/os-release确认系统版本是CentOS 7还是Ubuntu 22.04因为包管理器和后续指令会不一样。然后ip addr看网卡IP确认是不是自己印象里的内网地址。再ping一下网关或DNS确认网络通。如果公司要求安全基线还要马上新建一个普通用户并且用usermod -aG wheel把它加进管理员组然后测试sudo -s能不能顺利切到root。接下来配置软件源。国内服务器或者网络环境受限时yum或apt默认的源可能速度很慢甚至超时。操作方法是把源配置里的地址换成可用的镜像地址比如Ubuntu的/etc/apt/sources.list换源后执行apt updateCentOS的yum源则在/etc/yum.repos.d/里修改。这里我遇上过一个问题换好源之后安装软件包报错“No module named apt_pkg”后来确认是Python版本太杂导致apt模块混乱处理办法是重装python3-apt。这件事提醒了我系统自带的Python不要乱动除非你很清楚自己在做什么。安装常用工具也是必做项。比如CentOS上先yum install -y vim net-tools wget curl lrzsz其中lrzsz提供了rz/sz指令方便上传下载小文件。Ubuntu则是apt install -y vim net-tools wget curl。很多人以为这些工具系统自带其实不是很多最小化安装的服务器连ifconfig都没有只能靠ip addr。3.2 部署服务时的“老三样”端口、服务、日志部署Web服务、数据库、消息队列不管哪个中间件排障思路都差不多。我最常执行的三条指令是systemctl status xxx、ss -lntp | grep 端口、tail -f 日志路径。比如部署Nginx先systemctl start nginx再systemctl status nginx看一下有没有Active: active (running)如果没起来就journalctl -u nginx -xe看具体报错。比如常见的端口被占用错误nginx启动日志会明确告诉你bind() to 0.0.0.0:80 failed那你就要用ss -lntp找到占用程序决定是kill掉它还是改nginx.conf端口。Java应用部署除了systemctl外经常要直接跑jar包。此时nohup java -jar app.jar app.log 21 是最传统的保活方式。nohup让进程忽略挂断信号所以即使SSH窗口关掉进程也能继续跑。注意后面那个是放到后台执行。日志重定向用和21前者将标准输出写入文件后者将错误输出同样写入文件这样无论正常打印还是异常堆栈都能保住。很多人只写nohup java -jar app.jar 结果日志打印到终端上断开后找不到任何记录吃了亏。部署服务后一定要检查一下防火墙。所以iptables -L -n或firewall-cmd --list-all也要熟练。云服务器上还会遇到安全组规则的问题其实本质上就是在云平台层面做了一次防火墙放行。如果你的服务在服务器内部已经监听但外部访问超时先确认服务器防火墙再查安全组。3.3 写脚本绕不开的文本处理三剑客如果你到写脚本阶段还只会在命令行敲命令不算真懂Linux。Linux的强大之处就在于把简单指令串成管道。我工作里最常用的三把刀是grep、sed、awk。grep做过滤sed做替换awk做格式化输出。举个实际例子把日志里所有ERROR行提取出来只要时间、消息和进程号。可以用grep ERROR app.log | awk {print $1, $2, $NF} /tmp/error.txt。awk默认按空格拆分字段$1是第一个字段$NF是最后一个字段这个脚本能在一秒内完成一个Excel表格几个小时的工作。sed最常见的用法是替换文本sed -i s/old/new/g config.conf-i直接改文件g是全局替换。很多人在替换含特殊字符时出问题比如路径/因为sed默认用/作为分隔符遇到/需要转义但更推荐用其他分隔符比如把/换成#sed -i s#/usr/local#/opt#g file.conf这样就省去一堆反斜杠。awk更进一步可以做数学运算、条件判断。比如awk {if ($3 100) print $1} file按第三列数值过滤。写脚本时这三个命令的嵌套组合能解决绝大部分日志统计问题。另外还有一个容易被忽视的sort和uniq。比如统计一个文件里哪些IP访问量最大cat access.log | awk {print $1} | sort | uniq -c | sort -nr | head -20。这个组合几乎是运维面试的默认题理解它并不难先取第一列IP排序让相同IP聚在一起uniq -c去重并计数再按计数倒序取前20个。你只要亲手敲一遍这个管道就会对“Linux一切皆文本”有真切体会。4. 面试题与常见问题实录4.1 高频面试题怎么答面试官问Linux指令从来不问“ls是干什么的”这么简单而是会追问细节。比如“查看文件内容有哪些命令各自有什么区别”你要说出来cat是将整个文件一次性输出适合小文件less可以分页查看支持上下键翻行适合大文件head -n 10看头十行tail -n 10看尾十行尤其tail -f可以实时滚动适合看日志。这样回答比只说“用cat”显得专业得多。另一个高频题是“如何查找一个大文件”大多数人马上说find / -size 1G但这还不够。面试官希望听到你还能排除掉一些系统目录比如find / -type f -size 1G -not -path /proc/ -not -path /sys/或者你用du -sh *在某个目录下查各个子目录占了多少空间。更进一步的回答是“先df -h看哪个分区快满了再du -sh /var/log/*找具体日志”这种系统化排查思路很加分。“软链接和硬链接的区别”也是经典题。软链接ln -s相当于Windows的快捷方式指向原文件的路径原文件被删了链接就失效硬链接ln则是原文件名的另一个别名多个硬链接指向同一个inode只有当所有链接都删除后文件才真的消失。这个概念面试里被反复问我建议你亲手建一个test.txt、ln test.txt hard、ln -s test.txt soft然后ls -i看inode再删掉原文件观察两个链接的区别一次就能记住。“如何判断系统是CentOS还是Ubuntu”这个问题其实考的是你知道cat /etc/os-release和lsb_release -a。如果你能更进一步说“统一看Systemd的版本systemd --version或者看hostnamectl”面试官会觉得你不是背的而是真装机装得多。4.2 新手常踩的坑与排查技巧很多人学Linux时直接在Windows上装虚拟机安装了虚拟机之后发现弹蓝屏。这个热搜词“虚拟机安装linux蓝屏”确实很常见。我遇到的绝大多数情况是VMware或VirtualBox的“虚拟化引擎”设置和Windows Hyper-V冲突。解决办法是在虚拟机设置里关掉“Virtualize Intel VT-x/EPT”和“Virtualize IOMMU”或者你反过来开启Windows的Hyper-V但使用WSL2看你怎么方便。另一种情况是下载的Linux镜像和虚拟机版本不匹配比如VirtualBox对最新内核支持滞后不如换用VMware Workstation。最稳妥的排查手段是先看蓝屏截图上的错误码然后搜索而不是一上来就改设置。Linux系统安装Python也是个高频踩坑点。系统源里的python3版本往往偏旧但不要直接去python官网下载源码编译安装然后一股脑替换系统python因为很多系统工具比如apt、yum依赖自带python。我的做法是使用pyenv或者conda管理独立的Python环境把新Python装到用户目录下然后在.bashrc里配好PATH这样既安全又省心。你如果一定要编译安装记得在执行make altinstall而不是make install前者不会覆盖系统原本的python3可执行文件。挂载NAS存储也是热搜常客。核心指令是mount -t nfs -o vers4 192.168.1.10:/data /mnt/nas但更重要的是一旦重启就失效得写进/etc/fstab。我吃过一次亏写fstab时格式不对导致开机卡在“A start job is running for /data”长达90秒后来才知道是因为NFS在network服务没起来之前就挂了。解决办法是在fstab里给这一行加上,noauto,x-systemd.automount或者延迟挂载具体看systemd文档。这个坑很典型不是指令不会写而是对启动顺序不了解。所以遇到开机卡住别急着重装系统先想想是不是fstab的问题。进程通讯IPC这个问题很多面试者说不好。Linux进程间通信有管道|、信号kill其实就是在发信号、消息队列、共享内存、socket等。日常运维最常用的是管道和信号。比如nginx重载配置用kill -HUP PID实际上就是发信号。如果你能举这个例子说明你干活干得扎实。还有锁文件很多服务用/var/run/xxx.pid记录PID它本质上就是进程间通信的一种简化形式通过文件协商。关于“linux密码过期提醒通知”我实际遇到过。生产环境的服务器半年左右强制改密用户发现自己登录时报“password expired”一头雾水。管理员可以提前用chage -M 180 zhangsan设好最大有效期再用chage -W 7 zhangsan提前7天警示。另外还可以配合系统邮件给用户发通知但服务器未必装了邮件客户端更简单的是在/etc/motd里写一句“你的密码将在xx天后过期请及时修改”。这里注意motd是登录后显示的提示改完要测试一下效果。5. 说到底指令是死的场景是活的我有一次面试时让候选人说说他用过哪些Linux指令他说得头头是道什么sed、awk、awk的map但让他“在/var/log/nginx下找出访问量最大的前十个IP”他却先愣了几秒然后开始一个个翻文件。这就说明背指令和真正会“组合指令”之间差了十万八千里。Linux指令的价值不在单个命令而在管道里的串联。就像你认识每一个汉字但能不能写出一篇通顺的文章是另一回事。所以我的个人建议是不要拿着1000条命令大全去背。你先把自己最常遇到的十个业务场景列出来比如“查看服务是否在运行”、“查看端口占用”、“查找大文件”、“查看最近登录记录last命令”、“统计日志里某个关键词出现次数”然后针对每个场景自己上网找3种解决方案再亲手敲上十遍。敲到不需要看笔记时这个指令基本就长在你身上了。另外一个小技巧每解决一次问题就花5分钟把它记到自己的命令笔记里格式可以是“问题描述完整命令易错点”。坚持半年你就会拥有一份比网上任何速查手册都更适合自己的Linux笔记。我从第6个月开始遇到不会的命令就翻自己的笔记而不是百度效率反而更高。因为我记下的每一个命令背后都有一个真实的问题场景这种联想记忆远胜于死记硬背。最后再分享一个习惯永远保持对指令的好奇心。看到一个命令的某个参数不了解马上man一下或者info一下别嫌麻烦。比如我就因为好奇而搞懂了rsync的--delete参数影响避免了一次灾难性的同步事故。Linux是个活的东西你每次深入一点它就会回报你多一分掌控力。希望这篇关于Linux基本指令的实操分享能帮你在自己的一亩三分地里少踩几个明坑暗坑。