
用 Ubuntu 十几年从桌面版折腾到服务器版从 WSL 到云主机慢慢发现真正每天敲进终端的命令其实就那几十条。这篇不搞什么花架子就是一份我平时翻得最多的Ubuntu 常用命令清单顺手把一些容易踩坑的参数细节也写出来。新手可以按章节顺序看老手直接跳到自己想看的部分当成一本随查随用的操作笔记就行。整篇内容都来自我实际敲过的命令不做理论堆砌。每个命令我会尽量说清楚“为什么这么用”和“坑在哪里”这样你复制到终端时至少心里有底而不是稀里糊涂执行完发现系统已经变了个样。1. 文件与目录最常用的那批命令1.1 基础操作的参数细节文件操作是每天打开终端后最先碰到的活。ls、cd、mkdir这些命令看着简单但参数用不对效率差很多。ls -lah cd ~ cd - # 返回上一次所在目录 pwd mkdir -p /tmp/a/b/c # 递归创建父目录不存在也会帮你建好ls -lah里的-a显示隐藏文件-l是长格式列表-h把文件大小显示成 K、M、G 这种人类看得懂的单位。我见过不少新人在ls后面只加-l结果文件大小一长串数字还得心算。mkdir -p是高频神器尤其是写脚本要在多层目录里创建文件时没有-p会直接报No such file or directory有-p就不需要先手动建每一层目录。拷贝和移动的命令也容易踩坑cp -a source_dir/ /backup/ # 保留权限、属主、时间戳 cp -r source_dir/ /backup/ # 普通递归拷贝 mv old.txt new.txt # 重命名 rm -rf /tmp/cache # 慎用删了不经过回收站cp -a和cp -r的区别值得多说一句。-a本质是-dR --preserveall会把软链接、权限、时间戳都保留我做备份时几乎只用-a。如果你只是临时复制文件给同事-r就够。rm -rf是无数人的血泪教训。删除前先ls确认路径或者用rm -i让它逐个询问。我自己的习惯是凡是要删目录先du -sh看一眼大小再ls -la确认内容最后才删。这个习惯救了我好几次。1.2 搜索文件与链接的特殊场景找文件是刚上手 Ubuntu 时最头疼的事之一。Windows 下习惯点开资源管理器搜索到了 Linux 终端第一反应往往是懵的。find / -name nginx.conf 2/dev/null find /home/user -type f -name *.log -mtime 7 find /var/log -type f -size 100M locate nginx.conf # 需要先安装 mlocatefind的-mtime 7表示修改时间超过 7 天的文件-size 100M找大于 100M 的文件这两个组合排查磁盘占用时特别有用。注意find /会把系统里所有文件扫一遍最好用2/dev/null把权限不足的报错丢掉否则满屏Permission denied真正的结果反而看不见了。locate建立在数据库之上速度很快但数据库不是实时更新刚创建的文件可能搜不到需要先执行sudo updatedb。这个命令在应急找配置时比find快得多。链接处理也是日常高频ln -s /opt/software/bin/myapp /usr/local/bin/myapp ls -l /usr/local/bin/myapp软链接相当于 Windows 的快捷方式但概念上还是有点区别。做软链接时我强烈建议用绝对路径用相对路径容易出“链接滑落”的问题——你把链接移动到别的位置后目标就找不到了。检查软链接是否有效ls -l看末尾的箭头指向即可。2. 软件包管理与更新2.1 apt 日常装、删、更、修Ubuntu 的软件包管理以apt为核心这是每一个 Ubuntu 用户绕不开的命令。安装软件、更新系统、卸载遗留依赖全靠它。sudo apt update # 刷新软件源索引 sudo apt upgrade -y # 升级所有可升级软件 sudo apt install nginx # 安装软件 sudo apt remove nginx # 卸载软件保留配置文件 sudo apt purge nginx # 卸载并删除配置文件 sudo apt autoremove # 清理孤立依赖 sudo apt search nginx # 搜索软件 sudo apt show nginx # 查看软件详情apt update和apt upgrade是两 step很多人搞混。update只是从软件源拉取最新的软件列表不会更新任何软件upgrade才真正执行升级。刚拿到一台新 Ubuntu 机器第一件事就是sudo apt update sudo apt upgrade -y不然装软件时会遇到源索引过旧的问题。卸载时remove和purge的区别在于是否保留配置文件。如果你打算彻底清除一个软件比如删掉 MySQL 还要把/etc/mysql下的配置也删干净那就用purge。只想腾出空间、以后可能重新安装用remove就好。autoremove这条命令我每次装完一堆东西后会跑一遍。很多软件包在依赖不再需要后仍然留在系统里积少成多很占磁盘。如果你发现某个软件源出了问题可以直接编辑/etc/apt/sources.list或/etc/apt/sources.list.d/下的文件把源换成国内镜像源。修改后记得执行sudo apt update让配置生效。2.2 dpkg 与 snap 的补充apt解决的是在线源安装场景但很多时候你会拿到一个.deb文件比如从官网下载的 VS Code、搜狗输入法、微信等。这时候就要用dpkg来装。sudo dpkg -i /path/to/package.deb sudo dpkg -r package-name sudo dpkg -l | grep nginx sudo dpkg -S /usr/bin/nginxdpkg -i在安装时如果遇到缺少依赖会报依赖错误。通常的解决办法是接着执行sudo apt --fix-broken install它会自动补齐缺失的依赖。这个修复命令我几乎每次用dpkg装完东西后都会顺手跑一遍因为它还能顺手清理一些损坏的包状态。dpkg -S根据文件路径反查它属于哪个软件包这个命令在排查“这个文件被谁装了”时很有用。另外新版 Ubuntu 桌面版默认带snap安装软件也可以用sudo snap install xxx。snap 的好处是会自动处理依赖和环境隔离但缺点是启动速度慢、磁盘占用偏大。我自己平时能用apt就用apt抢不到或版本太老才会考虑 snap 或者官方 deb 包。在一个系统里混用三四种包管理方式确实容易乱但 Ubuntu 的现实就是这样掌握各自的适用场景就好。3. 系统信息与进程监控3.1 快速摸清机器配置拿到一台陌生机器先看配置、看系统、看剩余资源这是运维排查问题第一步。uname -a # 内核版本与系统架构 lsb_release -a # Ubuntu 版本信息 lscpu # CPU 信息核心数、型号、频率 free -h # 内存占用 df -h # 磁盘分区使用率 hostnamectl # 主机名和系统版本 nvidia-smi # 查看 Nvidia 显卡驱动与 GPU 占用free -h输出里重点看available这一列它代表系统实际可用的内存比free列更真实。很多新人看到free很小就以为内存不足其实 Linux 会拿空闲内存做缓存cache真正可用的反而比free大得多。df -h看的是分区使用率用这个命令能快速定位哪块磁盘满了。如果是根分区/满了系统会出现各种诡异问题后面第 9 章我会专门讲排查套路。nvidia-smi是装完 Nvidia 驱动后必测的命令。如果提示command not found要么驱动没装好要么驱动不在当前用户的PATH里。在 18.04 之后的系统也可以用ubuntu-drivers devices查看推荐的驱动版本再配合sudo apt install nvidia-driver-XXX安装。3.2 进程、服务和日志怎么查进程管理是 Ubuntu 日常使用中绕不开的硬需求。当你感觉系统卡顿、CPU 飙升、或者某个服务突然失联时第一反应就应该是看进程。ps aux --sort-%cpu | head -20 top -b -n 1 | head -20 htop # 更友好的交互式监控需要安装ps aux是查看所有进程的标准姿势。--sort-%cpu按 CPU 占用降序排列配合head直接看到最耗资源的进程。htop是增强版 top可以鼠标操作、树形显示进程关系看真机还是远程服务器都推荐装一个体验好很多。查到罪魁祸首进程后处理方式有几种kill -9 1234 # 强制杀死 PID 为 1234 的进程 kill -15 1234 # 优雅终止 pkill -f nginx # 按命令名模糊匹配结束进程 killall firefox # 结束所有 firefox 进程kill -9是最后手段因为它让进程没有任何机会做清理工作可能损坏数据。我一般先kill -15发 TERM 信号等几秒如果进程还不退出才用-9强杀。在脚本里批量清理进程时pkill -f比killall更灵活因为可以匹配完整命令行。服务管理在 systemd 时代统一用systemctlsudo systemctl status nginx sudo systemctl start nginx sudo systemctl enable nginx # 开机自启 sudo systemctl disable nginx sudo journalctl -u nginx -f # 查看某个服务的实时日志-u指定服务单元-f是 follow 模式相当于tail -f。我排查服务起不来时几乎都是systemctl status看到红色错误信息再journalctl -u看具体日志。4. 网络与远程操作4.1 网络诊断与端口排查网络问题是 Ubuntu 使用中的高频故障点尤其是登录远程服务器时最怕遇到连不上。排查网络不能瞎猜要按步骤来。ip a # 查看所有网卡和 IP 地址 ip route # 查看路由表 ping 8.8.8.8 # 测试外网连通性 curl -I https://example.com # 查看 HTTP 响应头 ss -tlnp # 查看监听端口和进程ip a是整个ifconfig的现代替代品它显示的信息包括网卡名称、MAC 地址、IPv4 和 IPv6 地址、MTU 等。如果你发现某块网卡没有 IP大概率是 DHCP 没获取成功检查netplan配置或者 NetworkManager。ss -tlnp用来查看当前监听端口-t只看 TCP-l只看监听-n不解析服务名直接显示端口号-p显示进程信息。比如你想确认 8080 端口被哪个进程占用直接ss -tlnp | grep 8080就能看到。防火墙方面Ubuntu 默认可能没有启用 ufw但如果启用了远程连接时经常莫名其妙断掉sudo ufw status verbose sudo ufw allow 22/tcp sudo ufw enable注意在远程服务器上执行ufw enable前一定要先确认 SSH 端口已经在防火墙放行名单里。我见过有人把自己挡在服务器门外只能去云控制台通过 VNC 救援端口操作非常被动。4.2 SSH、SCP、Rsync 三件套远程管理 Ubuntu 服务器ssh是第一入口。日常命令很简单ssh user192.168.1.10 ssh -p 2222 user192.168.1.10如果你改了默认 SSH 端口比如改成 2222就需要-p指定端口。-p是小写大写-P是设置密码参数很多人搞混。传输文件则分两种场景小文件和频繁同步。小文件用scp大目录或增量同步用rsync。scp local.txt user192.168.1.10:/home/user/ scp -r ./logs user192.168.1.10:/tmp/ rsync -avz --progress ./backup/ user192.168.1.10:/remote/backup/rsync的-a归档模式保留权限和时间戳-v显示详细信息-z传输时压缩--progress显示进度。rsync 最强大的地方是支持断点续传和增量同步大目录备份我从来不用 scprsync 才是正主。做免密登录时需要生成密钥ssh-keygen -t ed25519 -C your_emailexample.com ssh-copy-id user192.168.1.10第一行生成密钥对第二行把公钥传到服务器。之后就能免密登录。我个人更推荐ed25519而非rsa目前兼容性和安全性都更好。5. 用户管理与权限安全5.1 创建用户和授权刚装完 Ubuntu 时只有一个主用户需要管理员权限时用sudo。但一个生产环境里最好给每个人单独的账号而不是共享 root 密码。sudo adduser zhangsan sudo usermod -aG sudo zhangsan sudo passwd zhangsan su - zhangsanadduser是比useradd更友好的交互式命令会帮你创建家目录、设置密码、填写用户信息。usermod -aG sudo把用户加入sudo组获得管理员权限。注意-aG里的-a是追加如果漏掉-a用户会被从其他附加组中移除这个细节坑过不少人。查看当前用户权限和身份用whoami、id、groups。删除用户时建议先看这个用户是否在运行进程sudo userdel -r zhangsan-r表示同时删除家目录和邮件池。如果还有进程占着他的东西直接删会报错先用pgrep -u zhangsan看看有没有残留进程。5.2 权限位的理解Linux 权限模型是很多新手头疼的地方。简单说就是三组权限owner、group、other每组权限有 read(4)、write(2)、execute(1) 三种。chmod 755 script.sh chmod ux script.sh chown user:group /datachmod 755是rwxr-xr-x属主可读写执行组和其他人只读执行。chmod ux则是只给当前用户添加执行权限这在本地跑脚本时更精细。理解权限数字有不少巧方法把 rwx 分别看成 4、2、1加起来就是一组权限值。7421rwx541rx。我在给别人讲权限时常用一个例子目录必须要有x权限才能进入如果某个目录权限是 644那你只能看到文件名无法cd进去这就会导致“明明能看到文件却打不开”的怪现象。查看目录权限是否有异常用ls -l即可。权限位中如果出现了t说明是粘滞位比如/tmp表示只有文件所有者才能删除自己的文件多用户共享目录时很有用。6. 文本处理与日志分析6.1 日志动态跟踪与文件内容生产环境中排查问题眼睛盯得最多的就是日志文件。Ubuntu 下日志通常在/var/log/比如syslog、auth.log、kern.log。tail -f /var/log/syslog tail -n 50 /var/log/syslog head -n 20 /var/log/syslog less /var/log/auth.logtail -f是实时跟踪文件变化调试服务时必须用到。less适合看大文件支持上下翻页、搜索、跳转按q退出。不要用cat直接看大日志文件一屏刷不完终端还要卡半天。日志文件里一行一条记录想要提取关键字grep就是标准工具grep error /var/log/syslog grep -i error /var/log/syslog grep -r listen 80 /etc/nginx/ grep -E error|warning /var/log/syslog-i忽略大小写-r递归搜索目录-E启用扩展正则。搜索到大量结果时再配合管道和wc统计数量grep -c error /var/log/syslog grep error /var/log/syslog | wc -l这两条命令都能数行数grep -c更精简。6.2 sed、awk 的实用组合sed和awk是文本处理的玄学门但掌握了高频用法之后效率提升非常明显。sed最常用的是替换sed -i s/old/new/g config.txt sed -i s/^#Port 22/Port 2222/ /etc/ssh/sshd_config-i是直接修改原文件。s/old/new/g里最后的g表示全局替换不加的话只替换每一行的第一个匹配项。修改配置文件前我建议先用不带-i的命令预览结果确认无误后再加-i真正执行否则改坏了只能靠备份恢复。awk最常用的是按列提取awk {print $1, $3} /var/log/syslog awk {print $NF} access.log$1是第一列$NF是最后一列。比如access.log里想提取 IP 和状态码就不用手工一列一列复制。sort和uniq配合能快速统计日志里出现次数最多的条目awk {print $1} access.log | sort | uniq -c | sort -nr | head -20这条命令的含义提取日志第一列IP 或谁发出请求排序统计计数按次数降序排列取前 20 条。我排查“谁在疯狂请求服务器时”就用这个组合几秒钟定位来源。7. 开发环境与调试命令7.1 编译构建与调试Ubuntu 作为开发主力系统代码编译、调试是家常便饭。常见的编译工具链安装一条命令搞定sudo apt install build-essential cmake gdbbuild-essential包含 gcc、g、make 等核心工具。写个小程序编译测试gcc -Wall -g -o hello hello.c ./hello gdb ./hello-Wall打开所有警告写 C/C 时必须加能发现很多隐患。-g生成调试信息之后才能用 gdb 调试。-o指定输出文件名。新手最容易漏掉-o导致默认生成a.out然后还到处找“我的可执行文件在哪里”。做 CMake 项目时标准流程是这样的cmake -B build -DCMAKE_BUILD_TYPERelease cmake --build build -j$(nproc)-B指定构建目录我第一次用 CMake 时总是直接在源码目录里跑cmake ..结果二进制文件和源码混在一起很乱。现在习惯用build目录隔离。gdb常用命令不多break main run next print var btbreak main在 main 函数入口打断点run运行程序next单步执行print var查看变量值bt查看调用栈。排查段错误时先run看到崩溃信息再bt看栈基本能定位问题。7.2 Git 与环境变量Git 是开发者的命根子Ubuntu 下的常用命令和所有平台一样git init git add . git commit -m message git push origin main git pull git log --oneline -10 git checkout -b feature/xxx git branch -a git status改代码前先git status看看有没有未提交的修改是防止“改着改着发现丢了工作”的血泪经验。git checkout -b创建并切换到新分支比git branchgit checkout少一步。环境变量在 Ubuntu 里主要体现在PATH上。把自定义脚本目录加入 PATH可以省去每次写绝对路径的麻烦export PATH$PATH:/opt/mybin但要注意直接在终端执行的export只对当前会话有效关闭终端就没了。要让变量永久生效需要写进~/.bashrc或~/.profile然后source ~/.bashrc。echo export PATH$PATH:/opt/mybin ~/.bashrc source ~/.bashrc注意echo内容里如果有单引号、双引号、$符号很容易被终端转义搞乱。最简单的方法是直接nano ~/.bashrc打开文件在最后手动添加一行保存退出后source一下比拼接 echo 命令安全得多。7.3 Docker、Nginx 与 WSL 体验Ubuntu 上装 Docker 很简单核心常用命令也就那么几条sudo docker ps -a sudo docker images sudo docker run -it ubuntu:22.04 /bin/bash sudo docker exec -it container_id bash sudo docker logs -f container_id sudo docker stop container_id sudo docker rm container_iddocker ps -a里-a是“包括已停止的容器”不加-a只会显示正在运行的容器。排查问题时经常要看所有容器所以我的肌肉记忆永远是ps -a。docker exec -it id bash是进入容器内部调试的常用姿势。进入后你会发现很多命令都没有因为容器是最小化环境。想装东西就apt update apt install但容器内改的东西不会保存到镜像除非 commit 或者用 Dockerfile 重建。Nginx 在 Ubuntu 上的常用命令sudo nginx -t sudo systemctl reload nginx sudo systemctl restart nginx改完配置后先nginx -t测试配置文件语法再reload平滑重载。这比直接restart安全因为reload不会中断正在处理的请求。如果是 Windows 上用 WSL 写代码字体问题值得单独提一句。不少朋友反馈 WSL 终端里的终端字体渲染偏“方”跟 macOS 的等比字体比总差一点。我试下来最舒服的组合是 Windows Terminal JetBrains Mono 或 Cascadia Code在 Windows Terminal 设置里把字体改为这两个之一再配合主题配色写代码的观感很接近 macOS 的体验。具体路径是 Windows Terminal 的设置 - 配置文件 - 外观 - 字体选好后重新打开终端就会生效。8. 压缩打包与磁盘管理8.1 tar、zip 打包与解压传输大量文件时打包压缩是第一步。tar 是 Linux 最经典的打包工具参数组合很固定tar -czvf backup.tar.gz /home/user/data/ tar -xzvf backup.tar.gz tar -xzvf backup.tar.gz -C /restore/path/-c创建-x解压-z使用 gzip 压缩-v显示详细过程-f指定文件名。-C指定解压目录这个参数经常被忽略结果文件解压到当前目录目录结构乱成一团。.tar.gz解压时如果文件很多终端会刷屏可以去掉-v安静解压。打包时也可以只打包不压缩tar -cvf生成.tar文件体积更大但速度快。备份系统配置时我常常只要.tar因为一些配置文件文本本身重复度不高压缩率有限反而浪费时间。zip 格式在跨平台场景很常见zip -r archive.zip /path/ unzip archive.zip -d /target/-r递归压缩目录-d指定解压目标目录。unzip如果不指定-d会把文件解压到当前文件夹容易和已有文件混在一起。我一般总是习惯性带上-d和目录名。8.2 磁盘分区与挂载磁盘管理是 Ubuntu 运维中的进阶内容但有些命令必须掌握。lsblk df -h du -sh /var/log/*lsblk能列出所有块设备和挂载点非常直观。当你插入一块新硬盘后第一反应就是lsblk确认它被识别成了哪个设备比如/dev/sdb。du -sh查看各个目录占用空间排查“磁盘不知怎么满了”时按目录一层层往下查。挂载新磁盘的步骤大概是sudo mkfs.ext4 /dev/sdb1 sudo mkdir -p /data sudo mount /dev/sdb1 /datamkfs.ext4创建文件系统这一步会抹掉磁盘上的所有数据操作前必须确认设备名没错。挂载后如果希望重启自动挂载需要写入/etc/fstab但新手不建议手改容易改错导致开机失败。可以用 UUID 代替设备名来挂载UUID 通过blkid查看。排查磁盘空间不足时有一招很管用df -h du -xh / 2/dev/null | sort -h | tail -20du -xh里的-x表示不跨文件系统只统计当前分区。这样能快速找出哪个目录吃掉的磁盘最多。9. 排查实录那些年踩过的坑9.1 高频报错速查表我把这些年遇到的 Ubuntu 常见报错整理成了表格方便你直接对照排查。报错现象常见原因解决命令Command not foundPATH 环境变量被改坏/usr/bin/sudo nano /etc/environment修复 PATHE: Could not get lock /var/lib/dpkg/lock有另一个 apt 进程在运行等进程结束或sudo rm /var/lib/dpkg/lock后重试apt list --upgradable之后没法 install源索引过期sudo apt update磁盘满了服务起不来日志积压用du -sh /*找到大目录清理旧日志ssh 连不上sshd 没启动或被防火墙挡住systemctl status sshd、ufw status、ss -tlnpnvidia-smi报错驱动未正确安装ubuntu-drivers devices查看推荐版本重装驱动中文输入法打不出字环境变量没配置完整安装 fcitx5 后设置GTK_IM_MODULEfcitxbash: ./configure: Permission denied文件没有执行权限chmod x configuregcc: command not found没装 build-essentialsudo apt install build-essential表格里最容易中招的是第一个。PATH被改坏后所有命令都提示 not found因为它连ls都找不到路径。这种时候不要慌用绝对路径调用系统命令比如/usr/bin/sudo、/bin/nano、/usr/bin/export来修复/etc/environment把 PATH 改回默认值再重开终端。9.2 环境变量坏了、SSH 连不上这类救援技巧环境变量坏掉是我见过最多的“自杀式”故障。根源往往是在~/.bashrc里写了一行错误的export PATH...覆盖了默认 PATH。症状是重启终端后所有命令 not found。救援步骤/bin/nano ~/.bashrc如果你连 nano 也找不到就用完整路径/bin/nano或/usr/bin/nano。实在不行用export PATH/usr/bin:/bin:/usr/sbin:/sbin恢复基本环境再打开文件修改。改完source ~/.bashrc测试。SSH 连不上远程服务器时按这个顺序排查首先本地ping 服务器IP通不通不通就看网络、路由、云安全组。本地telnet 服务器IP 22看端口通不通或者直接nc -vz IP 22。不通则检查 sshd 是否启动systemctl status sshd检查防火墙sudo ufw status检查监听端口ss -tlnp | grep ssh。在这套流程里ssh -v userIP也是一个好帮手-v会输出详细的连接过程日志能直接看到卡在哪一步。如果看到Connection refused基本是 sshd 没起来或端口不对如果超时基本是防火墙或安全组拦截。APR 锁报错也很常见尤其是手动中断了apt install之后sudo rm /var/lib/dpkg/lock-frontend sudo dpkg --configure -a锁文件在正常情况下不应该手动删除只有在确认没有其他 apt 进程在跑时才删。删除后执行dpkg --configure -a修复未完成的配置。中文输入法打不出字这个在桌面版上很折磨人。比较省心的方案是装 fcitx5sudo apt install fcitx5 fcitx5-chinese-addons im-config -n fcitx5装完重启系统或者注销重进。如果还打不出中文检查环境变量有没有配好export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx这三个变量缺失是中文输入法失效的头号原因。在 Ubuntu 24.04 这类新版 GNOME 桌面上可能还需要确认桌面环境没有默认使用 ibus 抢占输入法必要时在“设置 - 输入法”里把 fcitx5 设置成默认。显卡驱动装完但不生效先别急着重装。检查是否是 nouveau 内核模块在捣乱。新驱动装好后nvidia-smi应该能正常输出 GPU 状态。如果还是不显示可以重新启动一次系统有时候驱动加载需要重启才能完整启用。最后再分享一个小习惯每次在 Ubuntu 上要执行带有sudo的高危命令之前先在心里过一遍“这条命令会把系统改到什么程度”复杂操作前先用--dry-run模拟或者-p打印将要执行的命令。坚持这个习惯之后我基本没有再遇到“手滑删错库”的悲剧。Ubuntu 的命令体系很大这篇只是冰山一角但把这几个高频方向练熟日常工作已经能覆盖大部分场景。