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/GB),t是按修改时间倒序排序,这样最新改过的文件永远排在最上面。排查问题时,你往往需要第一时间看到刚刚生成的日志文件,这个组合命令非常顺手。
cd和pwd没什么好讲的,但有一个技巧:cd -可以直接回到上一次所在目录。这个命令在A目录和B目录之间频繁切换时特别省事,比反复输入全路径快得多。很多人不知道,cd其实也可以直接接完整路径,比如cd /etc/nginx/conf.d/,没有加引号也完全没问题,因为Linux路径默认不带空格,带空格才需要转义或加引号。
cp和mv是文件操作里最常用的两个,但它们的细节特别值得注意。cp默认不会复制隐藏文件,如果你要复制整个目录连同隐藏配置,得用cp -a,a是归档模式,会保留权限、时间戳和所有者。类似的,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 file,4+2+1=7是读+写+执行,给文件所有者;5=4+1是读+执行,给所属组;4只读,给其他用户。另一种是符号法,比如chmod u+x file,给所有者加执行权限。日常工作用数字法最多,因为三个数字摆在一起,权限一目了然。但要注意,对于配置文件,尤其是nginx、redis之类的配置,权限千万别随便给777,否则存在较大的安全风险。一般644就够了,特殊需要执行权限的脚本才给755。给某个目录设权限时,还要同时考虑目录的可读可写可进入,比如chmod 755 /data,就是每个用户都能查看目录列表,但只有所有者能写入里面。
chown则是改属主和属组,比如chown www:www /var/www/html,把网站目录所有权交给www用户。很多人忽略了属主问题,遇到“Permission denied”就懵了。其实大部分时候不是权限码不够,而是文件属主不对。比如你用root上传了一个nginx.conf,nginx主进程以root身份启动后,会自动把worker进程切到nginx用户,但用户nginx并没有权限读root属主的文件,就会报403。这种情况一句话点破:chown nginx:nginx /etc/nginx/nginx.conf。
sudo也是一个很关键的指令。很多人以为sudo就是一个“升级成root”的开关,其实它更像一种授权机制。你可以在/etc/sudoers文件里精确控制,让特定用户只能执行某些命令。比如让zhangsan只能重启nginx:zhangsan 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 aux,a是显示所有用户的进程,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 2>&1,然后慢慢看,避免日志刷屏。
进程名称修改这个问题,热搜里也有人问。很多人以为进程名只能由可执行文件名决定,其实很多程序会在启动时用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 root@ip:/tmp/注意,-P必须大写,它不是cp的小写-p。和scp类似的还有rsync,rsync支持断点续传和增量同步,大文件传输优先用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 update,CentOS的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 2>&1 &是最传统的保活方式。nohup让进程忽略挂断信号,所以即使SSH窗口关掉,进程也能继续跑。注意后面那个&是放到后台执行。日志重定向用>和2>&1,前者将标准输出写入文件,后者将错误输出同样写入文件,这样无论正常打印还是异常堆栈都能保住。很多人只写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 vers=4 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基本指令的实操分享,能帮你在自己的一亩三分地里,少踩几个明坑暗坑。