很多人第一次打开Linux终端时面对黑底白字的界面都会有点发懵没有熟悉的桌面图标也没有鼠标点击的反馈所有操作全靠“打字”。这很正常我刚开始也一样。但真正跑起来之后你会发现Linux系统的核心操作本质上就是围绕文件、权限、进程、网络和自动化这五条主线展开的。把这些高频动作吃透你就能在命令行环境里应付绝大多数日常场景。这篇文章的价值在于我不会把man手册抄一遍给你看而是站在一个踩过不少坑的从业者角度把真正用得上的核心操作拆开揉碎讲清楚每条命令为什么这么用、什么时候用它、有哪些容易翻车的细节。无论你是准备入行运维、正在做日常开发还是只想把一台云服务器管理得明明白白这些内容都能直接照抄。1. 文件系统导航与文件操作一切从目录开始Linux世界里有一句老话一切皆文件。这句话听着玄乎但实际上文件系统确实是你每天打交道最多的地方。把文件操作搞顺了Linux就算学会了一半。1.1 先搞懂Linux文件系统的目录层级和Windows的C盘、D盘不同Linux只有一个逻辑根目录符号是/。所有设备、分区、虚拟文件系统都会挂载到这个根目录下的某个位置。所以你在Linux里不会看到盘符而是看到一堆标准化的目录名称。常见的目录分工大概是这样的目录主要用途/etc系统配置文件集中地比如网络、用户、软件源配置都在这里/var经常变化的文件日志、缓存、邮件等比如/var/log/home普通用户的家目录类似Windows的“用户”文件夹/tmp临时文件目录重启后可能被清理/usr系统软件和可执行文件的分布区域但不是用户个人数据/opt第三方软件、附加应用的可选安装目录为什么需要关心这个因为定位问题和配置文件时你会经常在这些目录里来回跑。比如排查服务启动异常第一反应就是去/var/log看日志修改网络配置大概率会碰/etc/network或/etc/sysconfig/network-scripts这类路径。熟悉层级之后即使碰到没见过的目录也能根据命名猜出它的用途效率会高很多。1.2 高频文件操作命令用的频率最高的几个这些命令没有太多花哨技巧关键是做到“不加思考就能写对”。pwd显示当前所在目录。迷路的时候先敲一下确认自己在哪里。ls列出目录内容。常用组合ls -lah-l看详细属性-a显示隐藏文件-h把文件大小换成人类易读的单位。cd切换目录。cd /etc绝对路径cd ../回到上级目录cd ~回家目录。mkdir创建目录。创建多层目录加-p比如mkdir -p /data/logs/2025。cp复制文件或目录。复制目录要加-r保留属性加-a。mv移动或重命名。同一个目录里操作就是改名跨目录就是移动。rm删除文件或目录。删目录加-r强制删除加-f。这是最危险的一条建议你养成先用ls确认路径的习惯。touch创建一个空文件或者刷新已存在文件的时间戳。ln创建链接。ln -s创建软链接相当于Windows的快捷方式。我自己的习惯是凡是涉及删除或覆盖的操作先把命令打印出来看一遍或者在末尾用-i参数让系统交互确认。看着慢但真的能救命。1.3 文件查找与内容检索别用肉眼翻目录文件一多找不到东西是常态。此时别一个个目录cd进去看用查找命令快速定位。find是真正的搜索利器可以按文件名、大小、时间、权限等条件查找。比如find /var/log -name *.log -mtime -7找出七天内改过的日志文件。locate依赖数据库速度飞快但数据可能不是实时的。刚创建的文件有时候搜不到需要先执行updatedb。grep处理文件内容配合管道符号可以实现在一堆日志里捞关键信息比如grep error /var/log/messages | head -20。这里有个很实用的点find和grep是两套不同的匹配逻辑。find的通配符匹配文件名grep使用的是正则表达式匹配文本内容。刚开始容易混记住一句话找文件用find找内容用grep。1.4 文件操作中最容易翻车的三个坑第一rm -rf误删。网上的段子不是开玩笑一旦敲了rm -rf /后果无法挽回。我的应对方法是重要数据目录里尽量不用rm而是用mv把文件移动到一个名为.trash的目录里定期手动清理。第二文件名带空格或特殊字符。比如一个文件名是my file.txt直接rm my file.txt会变成删两个文件。正确做法是用引号包住文件名或者用反斜杠转义空格rm my file.txt或rm my\ file.txt。第三软链接和硬链接的区别。软链接像快捷方式原文件删了链接就失效硬链接则是多个文件名指向同一份数据原文件名删了还能通过硬链接访问。日常使用中软链接更常见创建时记得用绝对路径避免有些程序解析相对路径时出错。2. 用户与权限管理Linux安全的基石权限体系是Linux和Windows体验差异最大的地方。很多人觉得权限管理复杂其实只要理解“谁、对什么、能做什么”这套模型所有命令就都顺理成章了。2.1 用户、用户组和文件所有者的基本概念Linux里每个进程都是某个用户身份运行的每个文件都有一个所有者user和所属组group其他人叫其他人other。用户的账号信息存在/etc/passwd文件里一行一个用户。用户的密码哈希和密码策略存在/etc/shadow文件里。用户组信息存在/etc/group文件里。新增用户的命令是useradd比如useradd -m -s /bin/bash zhangsan-m表示创建家目录-s指定默认Shell。删除用户用userdel -r还会连带删除家目录。改密码用passwd。你要是查看ls -l的输出第一列形如-rw-r--r--的字符就是权限信息第一个字符表示文件类型后面九个字符分成三组分别对应所有者、所属组和其他人的读r、写w、执行x权限。2.2 chmod与chown实操把权限改到刚刚好改权限用chmod有两种常用写法符号方式chmod ux script.sh给所有者增加执行权限chmod g-w file去掉组用户的写权限。数字方式r4w2x1三者相加。比如chmod 755 script.sh表示所有者有完整权限组用户和其他人只有读和执行权限。755是脚本和程序最常见的权限配置。改所有者用chown。比如把某个目录连同内部文件都交给某个用户chown -R zhangsan:devops /data/project。-R表示递归处理非常常用。我特别想提醒的是执行权限比读和写更容易被忽略。很多新手写好一个脚本后直接运行报“Permission denied”压根不是逻辑问题而是没有chmod x。另外不要把目录权限随便改成777那样意味着所有人都能增删文件安全隐患很大。2.3 su与sudo的正确使用姿势日常操作一定要用普通用户需要管理员权限时再临时提权。su是切换用户比如su - root直接切到root但会需要root密码而且切换后你就在一个持续的root环境里容易忘记自己身份。更推荐的做法是sudo它的核心逻辑是普通用户执行某条命令时临时以root或者其他用户身份运行执行完成后立刻回到普通身份。常见用法sudo apt update sudo systemctl restart nginxsudo的执行规则在/etc/sudoers文件里配置一般不要直接编辑这个文件而是用visudo命令安全修改。例如允许用户zhangsan执行所有命令zhangsan ALL(ALL) ALL允许某个组使用sudo可以这样写%devops ALL(ALL) ALL我个人的经验是能不用root交互登录就尽量别用。很多系统加固的第一条就是禁止root远程登录但允许普通用户通过sudo提权。这样出了问题能追踪到具体是哪个用户执行的命令责任边界清晰得多。2.4 权限管理的实战心得与排查技巧权限问题最常见的报错就是“Permission denied”排查时我会按这个顺序走用ls -ld看目标目录和文件的权限位。用id看当前用户属于哪些组。确认目标路径上每一级目录是否都有访问权限。这个很隐蔽即使文件是755如果它的上级目录是700其他用户依然进不去。如果是程序读取文件失败还要考虑进程是以哪个用户运行的而不是只看你的登录用户。还有一点umask决定新建文件的默认权限。通常root用户的umask是022普通用户是002或022。如果发现新建文件权限总是多出一截可以查看并调整umask值比如umask 027会让新文件更保守减少同组用户之外的接触面。3. 进程管理与系统监控让系统稳定运行一台Linux服务器上跑着一堆进程CPU、内存、磁盘都是有限资源。想让它稳定运行就得学会“看到进程、管住进程、看懂指标”。3.1 用ps和top看到当前进程最常用的查看命令是ps。经典用法是ps aux它会输出所有用户的所有进程。各列含义要烂熟于心USER进程属于哪个用户。PID进程ID。%CPU、%MEMCPU和内存占用百分比。STAT进程状态比如S是睡眠R是运行Z是僵尸。COMMAND启动进程的命令。ps aux抓的是一个时刻的快照要看动态变化就要用top。top界面里按P按CPU排序按M按内存排序按k可以杀掉进程会要求输入PID和信号按q退出。如果系统里某个进程CPU跑到100%我一般会先用top锁定PID再用ps -p PID -f看完整启动命令判断它到底是正常任务还是异常行为。3.2 前台后台切换与信号控制在终端里启动一个长时间任务时它可以占用当前窗口运行前台也可以甩到后台去。CtrlZ 可以把前台进程暂停并放入后台此时会显示一个作业编号jobs可以查看后台任务列表bg让暂停的任务在后台继续跑fg把它调回前台。给进程发信号最常用的是kill。很多新手以为kill就是“杀”进程其实它只是发信号kill PID默认发送15信号请求进程优雅退出。kill -9 PID发送9信号强制立即终止进程不给清理机会。kill -1 PID也就是HUP信号很多服务收到后会重新加载配置文件。对于需要长期在后台跑的任务我更喜欢用nohup command 这种方式它能让进程忽略挂断信号即使终端关闭也不会退出。输出默认写到nohup.out文件方便回头查日志。3.3 系统资源监控CPU、内存、磁盘三板斧free -h看内存和交换分区使用情况重点关注available列而不是只看free因为已分配的页缓存也可以被回收。df -h看磁盘分区剩余空间。磁盘满是非常常见的故障来源。iostat看磁盘I/O压力如果%util接近100%很可能是磁盘读写瓶颈。uptime看系统负载平均值。三组数字分别代表过去1分钟、5分钟、15分钟的平均负载。关于负载均值要说明一下它不是CPU使用率而是处于运行或不可中断状态的进程数量。在单核机器上负载1.0算满在四核机器上4.0才算满。所以看到负载高先数一下CPU核心数别急着下结论。3.4 进程管理的经验处理僵尸和查找异常进程系统里出现很多僵尸进程STAT为Z说明它们的父进程没有回收子进程资源。这种进程杀不掉因为已经没有实体了只能想办法让父进程结束或重启父进程。定位异常进程时我常用两个组合ps -ef --forest ss -tnp--forest以树状结构显示进程关系能看出来哪个进程是别人的父进程ss -tnp可以查看占用端口的进程排查“端口被占用”这类问题很管用。比如启动服务时提示80端口已被占用用ss -lntp | grep 80就能锁定肇事进程。4. 网络配置与远程连接从本机到互联Linux服务器很少是孤岛要么远程进到它里面要么它对外提供服务。网络操作的重要性不亚于文件管理这里分享几个高频场景。4.1 查看网络地址与连通性测试查看网卡和IP地址现在我更推荐ip addr而不是老旧的ifconfig。输入后能清楚看到每个网卡名称、MAC地址、IPv4和IPv6地址。想只看某个网卡的IP可以配合grepip addr show eth0 | grep inet连通性测试最基础的是ping它可以确认目标主机是否可达。但ping只说明主机在网络层是通的不说明80端口上的Web服务是正常的。所以还要用到端口测试命令nc -zv 192.168.1.10 22-z表示只扫描端口不发送数据-v显示详细信息。如果端口打开通常会返回成功提示。相比telnetnc更轻量也更适合脚本化调用。4.2 远程登录SSH与免密配置ssh是Linux运维中使用频率最高的命令之一。远程登录最简单的用法ssh root192.168.1.10如果端口不是默认的22加-p指定端口。日常工作中频繁输入密码很麻烦可以配置SSH密钥免密登录本地生成密钥对ssh-keygen -t ed25519把公钥传到目标机器ssh-copy-id userhost之后再登录时系统会直接使用密钥认证不再需要密码。传输文件时用scp或rsync。小文件用scp就够了scp /local/file.txt userremote:/data/有大目录、需要增量同步的场景建议用rsync -avz /local/dir/ userremote:/remote/dir/。注意源目录末尾的斜杠含义不同有斜杠表示复制目录内容没有斜杠表示复制目录本身。这个细节很容易被忽略但影响很大。4.3 防火墙与端口管理现在常见发行版上防火墙管理工具通常是firewalld操作模型是“区域服务”。日常最常用的命令systemctl start firewalld systemctl enable firewalld firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload--permanent表示永久生效不写的话只对当前会话有效重启后丢失。所以我的习惯是先加--permanent再--reload一步到位。如果是传统iptables逻辑要理解成从上到下匹配规则。增加一条放行规则的常见写法iptables -A INPUT -p tcp --dport 8080 -j ACCEPT iptables -A INPUT -p tcp --dport 8080 -j DROP注意规则顺序一旦前面的规则命中后面的规则就不会继续匹配。所以放行规则通常要放在拒绝规则之前。4.4 网络排查的实战记录有一次我遇到“网站特别慢偶尔超时”的问题第一反应是ping网关发现到网关延迟很低说明局域网基本正常。接着dig解析域名发现解析返回了多个IP其中有一个是已下线的旧节点。这就说明问题不在本机出口而是域名解析到了异常地址。网络排查讲究分层先看本机IP和网关ip addr、ip route。再测链路ping、mtr。然后测端口nc -zv。最后看服务日志journalctl -u 服务名或对应日志文件。DNS问题很容易被忽略但现象往往五花八门。域名解析不了的时候试试getent hosts 域名能直接看到系统实际拿到什么解析结果。如果需要临时指定DNS修改/etc/resolv.conf里的nameserver行即可不过很多发行版会由网络管理服务自动覆盖长期修改还得通过配置工具的接口。5. Shell脚本与自动化把重复工作交给机器如果只会敲命令那还是普通的命令行使用者。把多行命令写进脚本再加上定时任务才算是真正把Linux变成生产力工具。5.1 Shell脚本的执行与语法基础Shell脚本本质是一个文本文件里面装着一串命令和逻辑控制。第一行通常写#!/bin/bash这行叫shebang它告诉系统该用哪个解释器来执行这个脚本。写完保存后要运行的话有两种方式bash script.sh ./script.sh直接执行./script.sh前要确保脚本有执行权限而且文件开头shebang正确。用bash script.sh则不受执行权限限制临时调试更方便。变量是脚本的基础。定义变量时注意等号两边不能有空格BACKUP_DIR/data/backup today$(date %Y%m%d) echo $BACKUP_DIR/$today$(date %Y%m%d)是命令替换会先执行括号里的命令把结果当成值。引用变量时推荐用双引号包起来防止文件名里带空格造成意外拆分。5.2 条件判断与循环的核心写法条件判断用if加上test或方括号[]。常见形式if [ -d $BACKUP_DIR ]; then echo 目录存在 else mkdir -p $BACKUP_DIR fi这里的-d是测试是否目录。常用的测试选项还有-f文件存在、-z字符串为空、-n字符串非空。循环处理重复任务很常用for file in /data/logs/*.log; do gzip $file donefor循环会把匹配到的每个文件路径依次赋给变量file然后执行循环体。如果要对某个服务的所有节点执行同样的操作这个写法能省下大量时间。5.3 一个实战脚本的完整拆解我分享一个我实际中常用的备份脚本结构逻辑很简单但能解决真实问题#!/bin/bash set -euo pipefail SOURCE_DIR/var/www/html BACKUP_BASE/data/backup TODAY$(date %Y%m%d) TARGET$BACKUP_BASE/web-$TODAY.tar.gz mkdir -p $BACKUP_BASE tar -czf $TARGET $SOURCE_DIR find $BACKUP_BASE -name web-*.tar.gz -mtime 14 -exec rm {} \; echo 备份完成: $TARGET第一行的set -euo pipefail是我特别推荐的防护性设置遇到错误立即退出、变量未定义时报错、管道中任何一条命令失败都算失败。这个习惯能避免脚本“带病运行”。脚本逻辑分三步打包源目录、按日期命名存放、清理14天前的旧备份。把这个脚本放进cron定时任务每天自动执行0 2 * * * /usr/local/bin/backup_web.sh /var/log/backup.log 21这样凌晨两点自动备份日志单独记录下来早上只需要瞄一眼日志大小和最后几行就知道昨晚备份是否正常。5.4 脚本调试与安全习惯写脚本遇到问题最直接的调试方式是加bash -x script.sh它会把每一条实际执行的命令打印出来能看到变量展开后的真实内容。还有一个常见陷阱是命令中使用的路径没有写绝对路径。cron执行脚本时的环境变量和登录终端不一样PATH可能缺失某些目录导致系统命令找不到。解决办法是在脚本开头显式定义PATH或者全部使用绝对路径。另外不要在脚本里硬编码明文密码。如果非要用可以借助环境变量或专门的密钥管理工具注入。我更倾向把脚本权限限制在当前用户可读比如chmod 700 script.sh毕竟脚本里可能涉及敏感逻辑。6. 日志分析与系统排障做自己的运维系统跑久了总会出点状况。日志就是系统留给你的“案发现场”会看日志的人很多问题五分钟内就能找到方向。6.1 Linux日志体系的构成传统日志存放在/var/log目录下像syslog、messages集中记录系统消息其他服务也有自己的日志目录或文件。现代系统越来越多使用systemd-journald日志通过journalctl查看默认并不直接写到普通文件里。journalctl几个高频用法journalctl -xe journalctl -u nginx -n 50 journalctl --since 2025-01-01 08:00 --until 2025-01-01 09:00-xe会把最近的错误信息和高亮解释一起输出适合一开始不知道看什么的时候。-u指定服务名只看某个服务的日志比在全局日志里大海捞针高效得多。6.2 用journalctl和grep快速定位问题有一次服务启动失败我直接用systemctl status nginx看状态发现提示缺少某个模块配置。再配合journalctl -u nginx --since today看到完整报错很快就定位到是配置文件里多打了一个字符。如果历史日志很多我会先用时间范围缩小范围再用grep过滤关键词。比如把所有跟数据库连接相关的错误捞出来journalctl -u app --since 2025-06-01 00:00 | grep -i databasegrep -i忽略大小写能避免因为大小写差异漏掉信息。想要看到更多上下文用grep -A 5 error打印匹配行之后5行-B 5打印之前5行这样更容易看出报错前后的关联。6.3 常见故障场景快速排查参考现象排查方向常用命令磁盘空间不足大文件、已删除但仍被占用的文件df -h、du -sh /*、lsof L1内存不足/频繁OOM占用大户与OOM记录free -h、journalctl -kCPU过高进程排序与线程定位top、pidstat端口被占用监听端口和进程归属ss -lntp服务起不来服务状态和最近日志systemctl status、journalctl -u 服务名这里特别提醒一个经典场景日志明明显示磁盘空间还有服务却报“No space left on device”。原因是某个被删除的文件仍然被运行中的进程占用空间没有真正释放。用df -h看不出问题要配合lsof L1找出已经被删除但因为进程存活而保持打开的文件再重启对应进程让空间真正释放。6.4 排障思路的沉淀先看时间线再分层排查排查问题时我习惯按时间线把信息串起来。比如某业务每天凌晨3点定时任务执行后变慢那就去看定时任务具体做了什么以及3点到3点10分这段时间的系统日志和监控指标。很多时候根因并不是你最先怀疑的那个环节而是某个关联操作刚好卡在那个时间点。分层排查的意思是网络层看连通性和延迟系统层看CPU内存磁盘应用层看服务日志和业务报错。从外层收敛到内层每次只验证一个变量而不是同时猜好几个原因。Linux排障不靠玄学靠的是证据链闭合。把每个现象和数据记录下来解决方案自然就浮出来了。我在实际使用中还有一个体会命令记不牢没关系关键是理解Linux的设计思路。权限管的是“谁能做什么”文件系统管的是“东西放在哪”进程和日志管的是“系统到底在干什么”Shell把这些串起来变成自动化。多准备几台虚拟机或者云主机模拟日常任务反复敲比背命令列表有用得多。等哪一天你发现遇到问题时能自然地打开终端、翻日志、用管道串联命令这套核心操作体系就算真正长在你身上了。
阅读完成 · 觉得有帮助?