ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux基本指令详解:从文件操作到网络排查的实战笔记

Linux基本指令详解:从文件操作到网络排查的实战笔记 我之前写过一篇Linux学习笔记的开篇这篇直接进入正题Linux基本指令。别小看“基本”两个字真实服务器上折腾来折腾去翻来覆去用的其实就是这批命令。这篇笔记适合两类人一是刚装好Linux、连终端都没怎么打开过的新手二是在虚拟机或WSL里折腾Linux、想系统过一遍常用命令的同学。我尽量把命令背后的逻辑一起讲了——死记命令列表过两周准忘理解了目录结构、管道、权限这些东西之后命令根本不用背用到什么场景自然就能想起来对应的工具。我一直觉得Linux命令的学习不应该按字母表背一遍而是按“我要干一件什么事”来学。比如我要看日志用哪些命令我要装软件用哪些命令我要排查网络又该从哪条命令下手。这篇笔记就是按这个思路组织的把高频场景里的基本指令串起来讲顺带解释每个命令为什么这么用。1. 命令的底层逻辑先弄懂Linux命令是怎么跑起来的1.1 命令的本质shell 与 PATH你在终端里敲一个命令比如ls真正发生的事是什么终端本身只是个输入输出的窗口真正干活的是一个叫 shell 的程序常见的是 bash还有 zsh、fish 这些。shell 拿到你输入的字符串先按空格拆成“命令 参数”然后去一个叫 PATH 的环境变量里列出的目录中逐个寻找有没有叫ls的可执行文件。所以“命令”本质上就是一个个放在特定目录下的可执行文件。ls通常在/usr/bin/lspwd通常在/bin/pwd而像/usr/local/bin这种目录往往是后来手动装的软件默认安装位置。理解了这一点遇到“command not found”的时候第一反应就该是要么这个命令没装要么它不在 PATH 里。很多新手卡在这一步其实思路理顺了特别好排查。想看看自己的 PATH 是什么直接执行echo $PATH输出的是一串用冒号分隔的目录列表。想看看某条命令到底用的是哪个文件用which ls它会告诉你完整路径。$ which ls /usr/bin/ls这个底层逻辑是所有指令学习的地基。后面讲软件安装、用户权限都会反复回到这里。1.2 命令格式选项、参数与查询手册Linux 命令的基本格式是命令 [选项] [参数]。中括号代表可省略。比如ls -l /home-l是选项/home是参数。选项又分短选项和长选项ls -a和ls --all效果一样短选项适合日常敲长选项适合写脚本时增加可读性因为一眼能看懂意图。新手最容易踩的坑是记不住命令怎么用。我的建议是不用记学会查。每条命令都自带“说明书”按层级有三种查法命令 --help最简用法直接列出来适合快速看一眼。man 命令完整手册内容详细按 q 退出空格翻页适合系统学习。info 命令比 man 更详细的文档部分 GNU 工具才有用得相对少。我日常用的最多的是前两个。尤其是man它不仅讲参数还会讲退出状态码、环境变量、相关文件这些信息比网上很多复制粘贴的教程靠谱得多。我曾经遇到过一个问题tar解压出来文件名乱码后来就是在man tar里发现了--xform这个参数才解决的。所以第一个要掌握的“Linux基本指令”其实是man。2. 文件与目录操作每天敲得最多的一批指令2.1 导航与查看目录pwd、ls、cd、du、df文件操作是 Linux 使用频率最高的场景。先讲导航三件套pwd看当前在哪个目录cd切换目录ls列出目录内容。pwd可能太基础但它对理解相对路径和绝对路径很有帮助。比如你在/home/user/project下执行cd ../..靠pwd确认一下自己到底到了哪里能避免很多误操作。ls我几乎总是加上组合选项-lhl是长格式显示权限、属主、大小、时间h是人性化显示文件大小自动换算成 K、M、G不然一个 4096 的数字摆在那里谁看了都懵。想看到隐藏文件以点开头的文件就加-a所以最常用的写法是ls -lah。另外两个和磁盘相关的命令也建议早点掌握df -h查看分区使用情况du -sh 目录名查看某个目录整体占多大。排查“磁盘满了”“哪个目录占空间”这类问题全靠这两个。尤其是du -sh *在当前目录下把所有子目录的大小列一遍很快就能定位到空间被谁吃了比一个个翻目录高效得多。2.2 文件的创建、复制、移动与删除新建目录用mkdir加上-p可以递归创建比如mkdir -p /tmp/test/a/b一次把多级目录全建出来。新建空文件用touch它最常用的场景其实是更新文件时间戳但用来快速生成一个空文件也很方便。真正写入内容一般用编辑器但刚开始练命令的时候用echo hello file.txt生成测试文件特别顺手。复制和移动的命令是cp和mv。cp复制文件递归复制目录必须加-r这个参数忘记加了会直接报错。mv既可以移动文件也可以重命名——在 Linux 里重命名就是“把文件移动到另一个名字”没有单独的 rename准确说也有 rename 命令但日常重命名用 mv 就够了。我建议养成一个习惯批量操作之前先想想路径对不对因为mv会把目标文件覆盖掉没有 Windows 那种“是否确认覆盖”的对话框。删除命令rm是双刃剑中的双刃剑。删除单个文件用rm file删除目录加-r强制删除加-f三个组合起来就是传说中的rm -rf。这句命令在网络上的“威名”不是没有原因的——在 root 用户下敲rm -rf /这种命令可以直接让系统报废。我的习惯是凡是含-rf的删除操作先执行ls确认一下路径再动手服务器上的关键目录尽量用mv到临时目录替代直接删除确认无误后再删。这个习惯救过我很多次。3. 查看与检索文件内容从 cat 到 grep 再到管道3.1 文件内容查看cat、head、tail、less看文件内容的命令不少但使用场景差异很大。cat把整个文件内容一次性输出到屏幕上适合看小文件。文件一大它会把终端刷得乱七八糟。所以看大文件得用less它支持分页显示、上下翻页、和/关键字搜索按 q 退出。掌握了less看日志、看配置文件都会从容很多。head和tail分别看文件头部和尾部的若干行默认 10 行用-n指定行数比如tail -n 50 app.log。其中tail -f是一个宝藏用法f是 follow 的意思它会持续追踪文件的增长新写入的内容会自动出现在终端上。排查线上问题时开一个终端窗口执行tail -f日志信息一行行滚出来问题原因往往就在最后那几行里。配合后面的grep能做到一边输出一边过滤效率翻倍。3.2 grep、管道与重定向命令组合的威力如果说单个命令是刀那管道就是让刀连成流水线的传送带。管道符号是|作用是把左边命令的输出当作右边命令的输入。最经典的组合ps aux | grep nginx把所有进程列出来然后只保留包含“nginx”字样的行。这就是“查某个进程有没有在跑”的标准答案。grep本身的选项也很常用grep -i忽略大小写grep -v反向匹配排除某些行grep -r递归搜索目录里的所有文件。排查问题时grep -r 关键字 /etc/nginx/这种写法能直接在所有配置文件里定位到关键字所在的位置和行号比一个个打开文件看快太多。还有重定向符号是和。把命令输出写入文件覆盖追加到文件末尾。这个功能配合日志收集很实用比如定时任务想把执行结果记录下来就可以写成./backup.sh /var/log/backup.log 21。这里稍微解释一下21的含义Linux 里 1 代表标准输出2 代表错误输出21就是把错误信息和正常信息都写进同一个日志文件不然程序报错了日志里却什么都看不到排查起来特别被动。掌握了管道和重定向你会发现 Linux 指令的玩法一下子多了起来。再配合sort、uniq、wc这类文本处理命令很多手工统计的活几秒钟就能出结果。比如统计日志里访问量最高的 IP一条命令就搞定awk {print $1} access.log | sort | uniq -c | sort -rn | head -10这条命令从左到右串起来看awk提取每行第一个字段默认按空格分列sort排序让相同 IP 相邻uniq -c统计出现次数sort -rn按次数倒序排head取前 10 行。这就是管道思维的典型应用也是 Linux 指令最迷人的地方。4. 用户权限与进程管理运维绕不开的硬骨头4.1 用户切换与文件权限位Linux 是多用户系统权限模型是它安全性的根基。先记三个命令whoami看当前用户是谁id查看用户的 uid、gid 和所属组sudo临时用 root 权限执行命令。日常操作推荐用普通用户登录需要管理员权限时再在具体命令前加sudo尽量避免长时间直接使用 root。权限最核心的概念是那十个字符比如-rwxr-xr--。第一位是文件类型-表示普通文件d表示目录l表示软链接。后面九位分成三组分别代表属主、属组、其他用户的权限每组三位顺序是读 r、写 w、执行 x。目录的执行权限代表“能否进入这个目录”所以不要觉得目录带 x 很奇怪没有 x 权限连cd都进不去。修改权限的命令是chmod。两种用法都要会符号方式比如chmod ux script.sh给属主加上执行权限数字方式更常用r4、w2、x1加起来得到一个数字chmod 755 file就代表属主 7rwx、属组 5r-x、其他人 5r-x。常见的 644 适合普通文件755 适合脚本和目录600 适合私密文件。改属主和属组的命令是chown比如chown user:group file这个在部署项目时很常用否则程序可能因为权限不足读不了文件。4.2 进程查看、终结与后台运行进程管理是排查问题的核心能力。ps查看当前进程快照最常用的是ps auxa 代表所有用户u 显示用户和资源占用x 包含没有终端控制的进程。想找特定进程就用ps aux | grep 关键字。top是动态监控相当于任务管理器按 CPU 或内存占用排序实时刷新按 q 退出排查系统负载高的问题时第一反应就应该是它。杀进程的命令是kill默认向进程发送 TERM 信号让它正常退出杀不掉的加-9强制击杀。查进程 PID 除了ps aux | grep还可以用pidof直接获取进程号比如pidof nginx。注意kill -9是最后手段直接强制终止会导致进程来不及清理资源和保存数据可能留下隐患。先试试普通 kill不行再考虑 -9。进程后台运行是高频率场景。用符号可以把命令放到后台执行比如python app.py 但终端关闭后进程可能跟着退出。想要真正脱离终端运行用nohup写法是nohup python app.py app.log 21 。这个命令组合的含义是忽略挂断信号把日志写入文件后台持续运行。部署 Python、Node 服务时这条命令是保命级别的存在。如果系统用的是 systemd那还可以用systemctl start|stop|restart|status 服务名来管理系统服务这也是现在各类 Linux 发行版主推的进程管理方式。5. 网络命令速查与故障排查思路5.1 IP 配置与连通性检查服务器上排查网络问题我有一套固定的排查顺序。第一步看网卡状态和 IP 地址现代系统用ip addr旧的ifconfig也可以但很多新系统默认不装 net-tools 了所以强烈建议尽早适应ip系列命令。ip addr查看地址ip route查看路由ip link查看网卡状态。第二步测连通性ping是最经典的连通性测试工具可以加-c指定次数比如ping -c 4 baidu.com避免一直 ping 下去按 CtrlC 终止。第三步看服务的监听端口老的netstat -tlnp和新的ss -tlnp都可以ss 更快。-t看 TCP-l看监听状态-n不解析域名-p显示对应的进程名。排查“端口被占用”问题就是用这个命令找到占用的进程再决定是 kill 还是换端口。5.2 DNS 解析与端口排查DNS 是网络故障的高发区热搜里也有“linux中配置dns出现的问题”这里专门展开讲一下。Linux 下配置 DNS 的核心文件是/etc/resolv.conf里面写 nameserver比如nameserver 223.5.5.5 nameserver 8.8.8.8但很多新系统用 NetworkManager 接管网络配置直接改 resolv.conf 可能被覆盖。真正规范的改法是改网卡配置文件或者在 NetworkManager 的设置里改 DNS然后再生成 resolv.conf。排查 DNS 问题先确认能不能解析域名nslookup www.example.com或者用dig它的输出更详细能看到解析耗时和具体的 DNS 服务器dig www.example.com如果域名解析失败但 IP 能 ping 通基本就是 DNS 配置的问题。另外提醒一个常见的坑在/etc/resolv.conf里配了 DNS 之后一定要检查文件权限和是否被其他服务篡改有些 DHCP 环境会自动覆盖这个文件需要把网卡配置里的 DNS 也一并改好。我自己就遇到过多次配置后失效的情况最后发现是 NetworkManager 在重启时把 resolv.conf 重置了。端口相关的排查还有telnet或nc用于测试某个远程 IP 的端口是否通。比如测试本机能否连上另一台机器的 3306 端口telnet 192.168.1.10 3306。连不上就说明有防火墙拦截或者服务本身没起来。这种三层排查法——先看 IP、再看端口、再看 DNS能覆盖大多数网络问题。6. 软件安装与压缩解压从包管理器到解压乱码6.1 包管理器apt、yum、dnf 三国鼎立装软件是 Linux 新手最先碰到的门槛之一因为不同的发行版用的包管理器完全不同。Debian/Ubuntu 系用aptCentOS/RHEL/Fedora 系用yum和dnfdnf 是 yum 的下一代但很多老系统还在用 yumArch 系用pacman。这三个体系的命令从命名到逻辑都非常相似先update更新软件源索引再install安装remove卸载search搜索。拿安装 JDK 举例这是热搜里的高频词。用 apt 的方式是sudo apt update sudo apt install openjdk-17-jdk如果要指定版本号或者安装 Oracle JDK就需要去官网下载 tar.gz 包然后手动解压配置环境变量。环境变量配置在/etc/profile或~/.bashrc里核心就是设置JAVA_HOME和PATHexport JAVA_HOME/usr/local/jdk-17 export PATH$JAVA_HOME/bin:$PATH修改完执行source ~/.bashrc让配置立即生效。安装 Python 也是一样的套路系统自带的 python3 直接 apt 安装就行但如果要特定版本推荐用 pyenv 管理可以随时切换版本又不会污染系统环境。这类工具在服务器上用起来特别顺手。6.2 压缩解压tar、zip、7z 与中文乱码打包压缩也是高频操作。tar命令的两个核心参数是-c创建、-x解压-z用 gzip 压缩-v显示过程-f指定文件名。打包并压缩tar -zcvf backup.tar.gz /home/user/data/解压tar -zxvf backup.tar.gz如果遇到.tar.xz文件把-z换成-J就行tar -Jxvf file.tar.xz。zip 格式的文件用unzip解压压缩用zip -r。7z 格式的工具名是7z解压命令是7z x file.7z。解压乱码是很多人遇到过的问题热搜里也有“linux 解压文件乱码”。这个问题的根源是 Windows 上生成的 zip 包默认用了 GBK 编码的文件名而 Linux 默认用 UTF-8两边对不上导致文件名变成乱码。解决办法有两个如果 unzip 支持-O参数直接指定编码unzip -O GBK file.zip如果 unzip 版本不支持装一个unar或convmv。unar 会自动识别编码并转换convmv可以在解压后批量改文件名编码。我自己遇到过从客户那边拿到的 zip 包全是乱码用 unar 一条命令就解压成了正常文件名效率极高。这也说明一个问题系统自带的工具不一定是最适合的遇到问题时先查有没有更专业的工具不用死磕默认方案。7. 几个高频“翻车”场景与排查技巧7.1 command not found 的排查思路遇到 command not found先冷静分析三种情况。第一命令真的没装解决办法是用包管理器安装Ubuntu 下sudo apt install 命令名CentOS 下sudo yum install 命令名。第二命令装了但不在 PATH 里比如手动编译装到/usr/local/xxx/bin下的软件需要自己把目录加到 PATH或者用绝对路径执行。第三命令存在但不在当前用户的 PATH 下常见于 root 和普通用户的 PATH 不同用su切换到其他用户后找不到命令这时候要么用绝对路径要么修改目标用户的~/.bashrc。另外还有个技巧遇到vi、telnet这类命令 not found别急着装完整版很多发行版把工具拆分成了最小版本安装对应的包就能用比如apt install vim-tiny或者apt install telnet。7.2 删除文件后磁盘空间没释放这个坑在 WSL 和服务器上都常出现热搜里也有“wsl linux删除文件后空间没释放”。删完文件用df -h一看磁盘占用还是满的。原因是文件被某个进程占用了Linux 下删除文件只是删除目录项进程仍然持有文件句柄空间要等进程关闭后才释放。排查办法是找出哪个进程占用了这个文件lsof | grep deletedlsof列出的所有已删除但仍被打开的文件最后一列会标记(deleted)拿到进程号后用kill重启对应服务空间就释放了。比如常见的日志文件被删了但 rsyslog 还在写或者程序自己打开的文件没关闭。我遇到过最典型的场景是 Tomcat 部署 war 包后删除旧日志磁盘一直不释放一查是 java 进程占着句柄重启 Tomcat 立刻就好了。7.3 配置 DNS 后解析仍然失败的排查配置 DNS 后仍然解析失败我的排查顺序是这样。先确认配置有没有生效cat /etc/resolv.conf看 nameserver 是不是自己写的那个。再直接用 IP 访问目标服务器比如curl -I http://1.2.3.4如果能通说明网络层没问题问题在 DNS。然后用nslookup 域名看返回的解析结果和预期的 IP 对不对得上。最后检查是不是被系统其他服务覆盖了配置这个在 5.2 里讲过了。还有防火墙这一层的干扰DNS 默认走 UDP 53 端口有些机房安全组或本机防火墙把 UDP 53 封了也会导致解析超时。排查时可以用dig 8.8.8.8 域名直接指定一个公共 DNS 查询如果指定 DNS 能解析但默认 DNS 不行那就是配置或网络策略的问题而不是设置本身写错了。7.4 解压乱码的后续处理如果已经解压完才发现文件名乱码处理思路是转码而非重新解压。GNU 系发行版用convmv转换文件名编码convmv -f GBK -t UTF-8 --notest -r 目录名/注意一定要加--notest否则它只会预览转换结果而不实际改文件名。macOS 下可以用unar直接解开或者用 Python 脚本做批量重命名。我个人的体会是遇到编码类问题别硬记命令理解编码原理更重要——文件名在 zip 包里是按 GBK 字节存储的Linux 按 UTF-8 解码字节对不上自然乱码。理解了原因解决方案就可以灵活变通比如用 Python 的 zipfile 模块自写解压脚本指定用 CP437 或 GBK 解码文件名也是一条可行的路子。我实际操作中最深的体会是Linux 基本指令不需要一次学完也不需要背完。先把目录导航、文件操作、权限、进程、网络这几个模块的命令在真实环境里多敲几遍遇到不会的马上用man查比自己硬记有效得多。哪怕每天只熟练掌握两三条命令一个月下来你就能覆盖日常 90% 的操作需求。想练的话在本地虚拟机里搭一个环境把这篇笔记里的命令都过一遍踩过的坑比看十遍教程都管用。
返回列表