Ubuntu命令速查手册:从入门到实战的高频用法与排错指南

发布时间:2026/9/15 13:55:07
Ubuntu命令速查手册:从入门到实战的高频用法与排错指南 直接上干货。我用了这么多年 Ubuntu踩过的坑比很多人敲过的命令都多。这份速查手册不打算写成那种又厚又全、但翻两页就睡着的man page翻译稿而是把我日常用得最频繁、新手最容易卡壳的命令挑了挑配上了实际场景和排查思路。你照着敲基本能覆盖日常 80% 的操作需求。1. 文件与目录操作这些命令是日常地基1.1 基础三件套ls、cd、pwd刚上手 Ubuntu最常干的事就是在文件系统里溜达。ls是列出目录内容cd是切换目录pwd是告诉你现在在哪个位置。这三兄弟熟练了你才不会在终端里迷路。pwd # 查看当前完整路径 ls # 列出当前目录文件 ls -l # 长格式显示包含权限、属主、大小、时间 ls -a # 显示所有文件包括隐藏文件以 . 开头 ls -lh # 人类可读方式显示大小K/M/G ls -lt # 按时间排序最新的排在最上 cd /home/user # 绝对路径切换 cd .. # 返回上一级目录 cd ~ # 返回当前用户的家目录 cd - # 返回上一次所在的目录ls -l输出信息量很大新手常被那串drwxr-xr-x搞晕。我记它的方法是按三组看每组三个字符分别代表“主人权限-组权限-其他人权限”r读、w写、x执行。开头那个d表示这是个目录-表示普通文件。这串字符在你理解权限问题时是基础中的基础。cd -这个命令是我强烈安利的。它在两个目录之间来回切换时特别好用不用重复敲长路径。比如你从/var/log/nginx切到/etc/nginx想再回去直接cd -就行。1.2 创建和删除mkdir、touch、rmmkdir newfolder # 创建单级目录 mkdir -p parent/child/grand # 递归创建多级目录 touch file.txt # 创建空文件或更新时间戳 rm file.txt # 删除文件 rm -i file.txt # 删除前有提示新手建议养成习惯 rm -r folder # 递归删除目录 rm -rf folder # 强制递归删除慎重慎重rm -rf是新手最容易翻车的地方我甚至见过有人把它打在路径后面按了回车才发现是系统根目录。这不是段子是真事。我的建议是在.bashrc里给rm加个别名让它默认带-i交互提示alias rmrm -i # 如果删除的文件比较多不想一个个确认 alias rmrm -I # 删除超过3个文件或递归删除时才会提示加完执行source ~/.bashrc生效。等到你对系统很熟了、确认自己不会手滑再把这个别名去掉也不迟。1.3 移动复制重命名cp、mvcp source.txt dest.txt # 复制文件 cp -r sourcedir destdir # 递归复制目录就是整个文件夹 cp -a sourcedir destdir # 带权限属性一起复制常用于备份 mv oldname.txt newname.txt # 重命名文件 mv file.txt /path/to/dir/ # 移动文件到另一个目录 mv sourcedir destdir # 移动整个目录cp -r和cp -a的区别值得说两句。-r只是递归复制不保留文件的时间戳、属主、权限这些元数据-a是归档模式把这些属性一起保留。备份网站目录、迁移数据这种场景用-a更稳妥。复制文件时如果目标位置已有同名文件cp默认直接覆盖。我建议cp也加上交互参数cp -i或者干脆在.bashrc里给cp、mv都加上-i。多一次确认不会要你的命但能救回一次误操作。2. 文件内容查看与搜索别再用cat看大文件了2.1 查看文件cat、less、head、tailcat smallfile.txt # 一次性输出整个文件内容 less bigfile.log # 分页查看按 q 退出按 / 搜索 head -n 20 file.log # 查看前20行 tail -n 50 file.log # 查看最后50行 tail -f app.log # 实时跟踪文件新增内容调试日志神器less是查看日志的主力工具。在less里可以按ShiftG跳到文件末尾按g回开头按/关键字搜索按n跳到下一个匹配项。用熟练了查日志效率直接翻倍。tail -f是我调试服务时必开的命令。后台跑的 Java、Python 服务有没有报错启动有没有成功全看它的输出。看到日志里滚动出新内容心里才踏实。2.2 搜索内容grepgrep keyword filename # 在文件中查找关键字 grep -i keyword filename # 忽略大小写搜索 grep -r keyword /path/to/dir/ # 递归搜索目录下所有文件 grep -n keyword filename # 显示匹配行号 grep -v pattern filename # 反向匹配显示不含 pattern 的行 grep error\|exception app.log # 搜多个关键字 grep keyword *.log # 搜索当前目录所有 log 文件排错时我经常组合tail和grep先tail -f实时看日志然后加管道| grep error只过滤出错误信息。如果日志文件太大grep -n显示行号能帮你快速定位到出错位置再用sed -n 1200,1220p看那一小段的上下文。2.3 流量监控du、dfdf -h # 查看磁盘分区使用情况人类可读 df -i # 查看 inode 使用情况文件太多会撑爆 du -sh /home/user # 统计某个目录总大小 du -sh * | sort -rh # 统计当前目录下每个子目录大小并排序 du -h --max-depth1 # 只看一层目录的占用情况磁盘满了是 Linux 服务器上的高频故障。先df -h看是哪个分区满了然后du -sh *看是哪个目录在吃空间。我遇到过好几次日志文件把磁盘写满的情况du一查就现原形。有个细节容易忽略du -sh的*默认不包含隐藏文件查完别漏了.cache、.local这类目录。3. 系统信息与硬件参数速查3.1 系统版本与内核uname -a # 查看内核完整信息 uname -r # 只查看内核版本号 lsb_release -a # 查看 Ubuntu 发行版版本信息 cat /etc/os-release # 更详细的系统信息脚本里常用 hostnamectl # 查看主机名和系统详细信息搞不清自己装的是什么版本、什么架构x86 还是 ARM装软件时很容易选错包。lsb_release -a能看到 Ubuntu 的版本号比如 22.04 还是 24.04uname -m显示x86_64代表 64 位 Intel/AMD 架构aarch64代表 ARM 架构。这两个信息在下载安装包时经常要用到。3.2 CPU、内存、负载lscpu # 查看 CPU 详细信息包括核数 free -h # 查看内存使用情况 top # 实时查看进程和系统负载按 q 退出 htop # top 增强版界面更友好需要额外安装 uptime # 查看系统运行时间和平均负载 vmstat 1 5 # 每1秒采样一次共5次查看系统整体状态free -h里有个细节看到的内存占用只是表面值。free输出里available才是真正可用的内存量包含了可回收的缓存。新手容易盯着used那列看以为内存不够用了其实那部分很多是缓存系统需要时会自动释放。3.3 磁盘硬件与挂载lsblk # 查看块设备磁盘和分区树状结构 blkid # 查看块设备的 UUID 和文件系统类型 mount | column -t # 查看当前挂载情况 sudo fdisk -l # 查看所有磁盘的详细分区表lsblk是最直观的磁盘查看方式。输出是一棵倒过来的树sda、nvme0n1这类是物理磁盘下面挂着的sda1、sda2是分区。nvme0n1开头的是 NVMe 固态硬盘传统 SATA 硬盘一般是sda、sdb这种。搞清楚这两类盘的区别挂载、扩容时不容易把盘符搞混。4. 用户与权限管理sudo不是万能通行证4.1 用户和用户组whoami # 查看当前登录用户 sudo adduser newusername # 添加新用户交互式设置密码 sudo userdel username # 删除用户 sudo userdel -r username # 删除用户同时删除其家目录 sudo usermod -aG sudo username # 将用户加入 sudo 组 groups username # 查看用户属于哪些组 id username # 查看用户的 uid、gid 和组信息很多新手误以为sudo就是拿到管理员权限随便玩这个观念要不得。sudo的本质是让你以 root 身份临时执行单条命令有日志记录有审计追踪。给用户加 sudo 权限用usermod -aG sudo是最规范的方式。这里注意-a参数它的意思是“追加”少了它会把用户从其他组里踢出去。我发现很多人在 Ubuntu 上遇到“Permission denied”就加sudo硬刚。其实不少情况是文件属主、权限配置问题不是非 root 不可。先ls -l看看文件属主是谁、权限是什么再决定是chown改属主还是chmod改权限。4.2 文件权限修改chmod 755 script.sh # 设置权限为 rwxr-xr-x chmod x script.sh # 给所有用户加执行权限 chmod -R 755 /path/dir # 递归修改目录下所有文件权限 chown user:group file.txt # 修改文件属主和属组 chown -R www-data:www-data /var/www/html # 递归修改目录属主部署网站常见操作关于权限数字记口诀r4、w2、x1一组权限三个数相加。7421是最满的读写执行权限642是读写541是读和执行。755 是目录最常用的权限属主有全部权限其他人只能读和执行。644 是文件的默认权限属主可读写其他人只读。部署 Web 项目时chown -R www-data:www-data是高频操作否则 Nginx 或 Apache 会报 403 没有权限读取文件。这个错误新手几乎都遇到过根源就是运行 Web 服务的用户对网站文件没有读取权限。5. 网络配置与远程连接5.1 查看网络状态ip addr # 查看网络接口和 IP 地址 ip route # 查看路由表默认网关信息 ping -c 4 baidu.com # 测试网络连通性-c 指定次数避免无限 ping ss -tulnp # 查看端口监听情况 netstat -tulnp # 和 ss 类似部分系统需要安装 net-tools在 Ubuntu 上ifconfig默认没装系统推荐的是ip命令。这个习惯要改别老想着装 net-tools。查看 IP 地址用ip addr或者简写ip a。排查网络问题有个固定的思路先ping网关看局域网通不通再ping外网看互联网通不通然后ss -tulnp看端口有没有监听。一层层下来问题基本能定位。比如你启动了一个 Web 服务但浏览器就是打不开很可能是服务只监听了 127.0.0.1外部访问不到ss -tulnp一看就明白了。5.2 SSH 远程连接sudo apt install openssh-server # 安装 SSH 服务端 sudo systemctl status ssh # 查看 SSH 服务状态 ssh -p 22 user192.168.1.100 # 连接远程主机-p 指定端口 ssh-keygen -t ed25519 # 生成 SSH 密钥对推荐 ed25519 ssh-copy-id user192.168.1.100 # 将公钥拷贝到远程主机实现免密登录SSH 连不上的排查顺序很重要。首先确认服务端装没装 openssh-server然后看服务有没有启动再看防火墙有没有放行 22 端口最后确认远程机器的 IP 是否可达。这四个步骤能解决 90% 的 SSH 连接问题。我强烈建议把密码登录改成密钥登录。生成密钥后用ssh-copy-id把公钥推到远程机器之后登录连密码都不用了。顺手把/etc/ssh/sshd_config里的PasswordAuthentication改成no从根上杜绝暴力破解。改完配置记得sudo systemctl restart ssh才能生效。5.3 文件传输scpscp file.txt user192.168.1.100:/home/user/ scp -r /local/dir user192.168.1.100:/remote/dir/ scp user192.168.1.100:/remote/file.txt .scp基于 SSH 协议传输文件好处是加密安全、用法简单。拷贝整个目录加-r参数。传大文件或断点续传需求scp就不太够用了可以试试rsync它支持增量传输、断点续传效率高得多。rsync -avz /local/dir/ user192.168.1.100:/remote/dir/rsync的几个关键参数-a归档模式保留权限和时间戳-v显示详细信息-z传输时压缩。目录路径末尾的斜杠有讲究/local/dir/带斜杠表示把目录里的内容拷过去不带斜杠表示把目录本身拷过去。这个细节坑过不少人值得留意。6. 软件包管理apt是你装机的好朋友6.1 基础增删查sudo apt update # 更新软件源索引 sudo apt upgrade # 升级所有可升级的软件包 sudo apt install package-name # 安装指定软件包 sudo apt install -y package-name # 自动确认脚本中常用 sudo apt remove package-name # 卸载软件但保留配置文件 sudo apt purge package-name # 卸载软件并删除配置文件 sudo apt autoremove # 自动清理不需要的依赖 apt search keyword # 搜索软件包 apt show package-name # 查看软件包详细信息 dpkg -l | grep package-name # 查看指定软件是否已安装apt update和apt upgrade要分清楚这是新手最容易混淆的两个命令。update 只是更新本地的软件包索引列表不会动系统上的任何软件upgrade 才是真正执行升级。每次安装软件之前先跑update确保索引是最新的否则可能提示找不到包或者版本太旧。有个实际经验apt upgrade升级内核属于重大更新升级完成后通常需要重启系统否则运行中的内核还是旧的。我看到有人把系统升了一级但一直没重启内核迟迟没生效还以为升级出错了。6.2 依赖问题的处理思路依赖关系是软件安装中最让人头疼的问题。模块找不到、版本冲突报错信息铺天盖地。我的建议是先apt --fix-broken install尝试自动修复再apt autoremove清理残留绝大多数情况能解决。sudo apt --fix-broken install sudo apt autoremove如果某个软件是.deb包用dpkg -i安装时报依赖缺失优先用apt -f install解决。网上有些教程直接让人dpkg --force-all强制安装我不推荐这么干。依赖缺失要么是源不对要么是版本冲突强行绕过只会埋下更多隐患。6.3 tar.gz 源码包安装时不时会遇到软件不发.deb包只给源码压缩包的情况。安装流程一般是三步wget https://example.com/software.tar.gz tar -zxvf software.tar.gz cd software ./configure --prefix/usr/local make sudo make install这套流程有个前提系统得有编译环境。你照着执行可能会提示gcc: command not found说明基础编译工具没装。安装一下 build-essential 就行sudo apt install build-essential这个包会带上 gcc、g、make 等一整套编译工具链是源码安装的基础。7. 进程与服务管理7.1 进程状态查询与结束ps -ef # 查看所有进程 ps aux | grep python # 过滤出与 python 相关的进程 kill PID # 请求进程正常结束 kill -9 PID # 强制结束进程慎用 pkill -f process_name # 按名称结束进程ps aux配合grep找进程是最常见的组合。找到进程后第二列就是 PID用kill PID结束它。kill -9是最后手段它会直接掐断进程文件没来得及保存、资源没来得及释放。能kill就尽量别kill -9。我见过有人用pkill -f java想把 Java 进程全干掉结果把系统上所有名字带 java 的进程一锅端了。pkill -f是按完整命令行匹配的杀伤范围比想象中的大得多用之前先pgrep -f java看看都会匹配到什么。7.2 systemctl 服务管理sudo systemctl start service-name # 启动服务 sudo systemctl stop service-name # 停止服务 sudo systemctl restart service-name # 重启服务 sudo systemctl enable service-name # 设置开机自启 sudo systemctl disable service-name # 取消开机自启 sudo systemctl status service-name # 查看服务运行状态和最近日志 systemctl list-units --typeservice # 列出所有服务单元status输出不只是“运行中”或“已死”这种状态它下面是最近几行日志排错时特别有用。服务启动失败看journalctl -u service-name能拿到完整日志。systemctl enable配合start是部署 URL 服务的标准流程。先start让服务立刻跑起来测试没问题了再enable设置开机自启。很多人只知其一或者混到一起用enable --now效果是一样但拆开做更清晰。8. 压缩与解压不只是 tar 一把梭8.1 最常用的 tartar -czvf archive.tar.gz /path/dir # 打包并 gzip 压缩 tar -xzvf archive.tar.gz # 解压 tar -cjvf archive.tar.bz2 /path/dir # 用 bzip2 压缩压缩率更高 tar -xjvf archive.tar.bz2 # 解压 bzip2 tar -tzvf archive.tar.gz # 查看压缩包内容不解压 tar -xzvf archive.tar.gz -C /target/dir # 解压到指定目录遇到 Linux 的解压文件乱码问题八成是压缩包里文件名用了 GBK 编码系统按 UTF-8 解析时就乱了。tar 无法自动识别编码解决起来要看具体压缩格式。zip 文件相对好办有个 unzip 能处理后面会讲。tar 参数我给个记忆方法c是 create 创建压缩包x是 extract 解压z是 gzip 压缩格式v是 verbose 显示过程-f后面必须紧跟归档文件名。-C指定解压目录也是高频参数不加的话就解压到当前目录容易把一堆文件散落一地所以我习惯了每次解压都先建一个目标目录。8.2 zip 与 unzipsudo apt install zip unzip zip -r archive.zip /path/dir unzip archive.zip unzip archive.zip -d /target/dir unzip -O GBK archive.zip # 指定按 GBK 编码解压文件名unzip -O GBK这个参数是对付乱码的神器适用于 Windows 下打包的 zip 文件。Windows 默认文件名编码是 GBKLinux 默认是 UTF-8两者不一致就出现了乱码问题。8.3 压缩率对比选择格式常用命令压缩率速度适用场景gztar -czvf中快日常使用最普遍bz2tar -cjvf高慢日志归档、不常用数据xztar -cJvf最高最慢发布源码包、追求最小体积zipzip低快跨平台交换文件日常打包选 gz 就够了压缩率速度均衡。日志归档选 bz2能省不少磁盘空间。发布给别人的文件用 zip因为 Windows 和 macOS 都能直接解压省得对方还得装解压软件。9. 新手最容易踩的坑和对应排查思路9.1 “command not found”怎么破终端提示xxx: command not found含义就是系统在 PATH 环境变量指定的目录里找不到这个命令。两种情况一是软件压根没装二是软件装了但没在 PATH 里。排查思路是先用which command看命令是否存在。如果没有任何输出说明命令不在 PATH 里或者压根没装。apt search搜一下包名装上再试。如果命令确实存在但提示找不到说明 PATH 配置有问题检查echo $PATH。还有一种情况当前用户能用的命令切换到 sudo 后反而找不到了。原因在于 sudo 环境变量和普通用户不一样常见的解决办法是sudo env PATH$PATH command或者直接用绝对路径执行。9.2 文件明明存在却提示 No such file or directory这个报错的迷惑性很强。文件确实存在执行时却说找不到最常见的原因是文件格式不对。比如在 Windows 上写的.sh脚本带 CRLF 换行符拿到 Linux 上执行就会出现这个问题。原因是第一行#!/bin/bash被解析成了#!/bin/bash\r系统找不到这个解释器。解决办法是用sed去除回车符sed -i s/\r$// script.sh或者在 Windows 上用 VS Code 打开脚本右下角把换行符从 CRLF 改成 LF重新保存就正常了。另一种情况是动态链接库缺失。用ldd /path/to/executable查看依赖看看有没有not found的库装上对应的包就行。9.3 磁盘明明没满ls、mkdir却报空间不足确认df -h显示空间充足但新建文件还是报 “No space left on device”多数是 inode 用完了。查看验证df -iinode 是文件系统用来记录文件元信息的存储区域每个文件至少占一个。如果小文件特别多inode 会先于磁盘空间被耗尽。这种情况出现在缓存目录、邮件队列、Node 项目里的 node_modules 等地方。发现 inode 爆满先找哪个目录文件数异常多删除无用的缓存文件。事后防止同类问题可以把一些高频小文件目录挂载时设置更大的inode比例用mkfs.ext4 -i 4096每个 inode 间隔 4096 字节创建文件系统。不过这个属于调优操作新手了解一下原理就行别冲动格式化分区。9.4 命令输出乱码的排查乱码场景基本可以归为两类文件内容乱码和文件名乱码。文件内容乱码一般是编码问题用file -i filename查看文件编码再用iconv转码iconv -f gbk -t utf-8 sourcefile newfileiconv是编码转换工具从 GBK 转到 UTF-8 是 Linux 下最常见的转码场景。文件名乱码是另一个问题zip 包解压后文件名变乱码用unzip -O GBK解压前面第八章已提到过。9.5 登录系统后终端显示 bash: xxx: command not found每次打开终端就报一串 command not found大概率是.bashrc或.bash_profile配置写错了。比如我之前往.bashrc里写了错误路径导致终端启动时加载配置文件就报错。修复方法是先用绝对路径执行编辑器打开配置文件修正/bin/nano ~/.bashrc把有问题的行注释掉或改正确保存退出后执行source ~/.bashrc重新加载。如果连基础的ls、cd都提示找不到命令了可能是 PATH 被配置改坏了需要用绝对路径/bin/ls等来先恢复基本操作。10. 写在最后的实操习惯学了这么多命令最后分享几个我积累的使用习惯这些习惯能减少很多不必要的踩坑。第一个习惯不熟悉的新命令先man再看网络教程man command_nameman是本地的官方使用手册每个参数的作用、适用场景写得清清楚楚。网络教程常常只讲某个场景下的用法忽略了其他细节和坑。man里的EXAMPLES部分尤其值得看很多参数搭配的妙用都藏在这。第二个习惯重要操作前备份这是 Linux 使用者最基本的职业素养。修改配置文件前备份一份sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak这一条习惯能让你在配置出错时全身而退。配置文件改坏的场景太多了有备份永远不慌。第三个习惯遇到报错先看完整日志别急着搜第一段报错信息。journalctl -xe能查看系统最近的服务报错日志tail -n 100 /var/log/syslog看系统日志最后一页。很多问题日志里已经把原因和解决思路写清楚了看完整再搜。第四个习惯掌握帮助系统的层级。--help是最快捷的查看方式man是官方完整文档info 和 /usr/share/doc 下有文档可以深挖。遇到问题先在这三层里找答案解决不了再上网搜索这样既高效又能逐步积累起 Linux 的系统化知识。我自己平时用 Ubuntu 做开发、搭服务器、跑脚本一天下来敲几百条命令很正常。把这些基础命令用熟练了你会慢慢发现终端并不是一个生硬的工具它其实是你和系统之间最高效的对话方式。先从这份手册里的高频命令开始配合实际场景多用几遍肌肉记忆就形成了真正到排查问题时手速都快过思考速度。