Linux 命令这件事,很多人第一次接触是从一张密密麻麻的表格开始的:cd、ls、pwd、mkdir……背了三天,一上真机还是只会 ls。问题不在记性,而在于命令表是散的,真实工作流是串的。你在服务器上真正会遇到的场景,往往是一串动作:日志目录里找一个三天前的报错,把匹配的行捞出来统计次数,改完配置重启服务,再看端口有没有起来。这一串背后是几条命令的组合,而不是孤立的命令。
这次我们就把 Linux 常用命令按能不能马上用起来这个思路梳理一遍。核心特点先说清楚:门槛极低,一台 1 核 1G 的机器就能跑通全部命令;不依赖图形界面,SSH 上去就能干活;主流发行版命令基本通用,Debian 系和 RedHat 系主要差别在包管理;天然支持批量任务,一个 for 循环或 xargs 就能处理上千个文件;脚本化能力强,敲过的命令可以直接沉淀成可复用的 shell 脚本。
本文不按字母顺序罗列命令,而是按真实使用顺序组织:先准备一台能练的环境,再装系统或者开容器,然后分模块做功能验证——文件、文本、权限、进程、磁盘、打包传输、软件包,接着讲怎么把这些命令串成脚本做批量任务,最后给资源观察方法和排错清单。
适合谁?零基础想转运维、后端、测试的同学,平时用 Windows 但需要连服务器开发的程序员,以及需要写部署脚本但总卡在权限和路径上的人。看完的目标很具体:给一台陌生 Linux,能登录、能看状态、能定位问题、能批量处理文件。
1. 核心能力速览
先给一张速览表,把范围和门槛说清楚,避免一开始就陷入细节。
| 能力项 | 说明 |
|---|---|
| 主题类型 | 命令行技能体系,非单一软件项目 |
| 运行平台 | 各类 Linux 发行版、WSL2、Docker 容器、云主机 |
| 主要功能 | 文件管理、文本处理、权限控制、进程与端口排查、磁盘管理、打包传输、软件包管理 |
| 硬件门槛 | 极低,1 核 1G 内存可跑通全部命令 |
| 磁盘占用 | 命令本身可忽略;练习环境建议预留 10GB 以上 |
| 启动方式 | 物理机 / 虚拟机 / WSL2 / 云主机 / 容器 |
| 是否需要图形界面 | 不需要,终端或 SSH 即可 |
| 是否支持批量任务 | 支持,for 循环、xargs、find -exec、cron 定时 |
| 是否支持接口调用 | 无 HTTP 接口;以标准输入输出、退出码作为接口,可被脚本调用 |
| 适合场景 | 服务器运维、部署排错、日志分析、批量文件处理、自动化脚本 |
把这套命令体系当成一个工具箱来看待会更合适。它有输入、有输出、有退出码,任何一条命令都能被另一条命令消费,这个特性就是它最值钱的地方。你在终端里敲的 ps aux | grep nginx,本质上是把 ps 的标准输出接到了 grep 的标准输入,这是 Linux 命令和图形化工具最大的区别,也是后面所有批量任务和自动化脚本的基础。
需要提前说明的是,本文不涉及任何绕过安全策略、破解权限、未授权访问的内容。所有操作都应在你自己拥有管理权限的机器、容器或实验环境里完成,涉及生产环境时先备份、先在测试环境验证。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 适用场景与使用边界
Linux 命令的适用场景其实非常明确:一切没有图形界面、或者图形界面效率更低的场合。服务器上装不了桌面,容器里根本没有桌面,远程 SSH 上去只有一个黑框,这时候命令是唯一的选择。日常最高频的四类需求是:查看状态(磁盘满没满、内存够不够、进程活着没)、定位问题(日志里哪一行报错、哪个端口被占了)、变更操作(改配置、换权限、重启服务)、批量处理(一千个文件改名、一万条日志统计)。
不适合的场景也要讲清楚。第一,图形化的重活比如视频剪辑、图像处理,命令行不是首选;第二,交互式调试复杂的业务代码,IDE 的效率远高于终端;第三,命令行的风险系数高,rm -rf 敲错一个空格就是灾难,所以它更适合"先确认再执行"的操作习惯,而不是想到什么敲什么。
边界方面有三条建议。权限边界:不要为了省事长期用 root 登录,日常操作走普通用户加 sudo,出问题能留痕。数据边界:删除类操作前先用 ls 看一眼目标路径,确认匹配范围再加 -rf。环境边界:生产环境执行变更类命令前,先在测试机验证一次,尤其是涉及权限、服务重启、目录清理的操作。这三条不是形式主义,是很多人踩过坑之后总结出来的最低成本保险。
3. 环境准备与前置条件
3.1 三种练习环境怎么选
零基础最容易卡在第一步:没有 Linux 可以用。三条路,按成本从低到高排。
第一种是 WSL2,Windows 10/11 自带能力,装完直接有个 Ubuntu 终端,文件系统和 Windows 互通,适合纯练命令。缺点是它和真实服务器在服务管理上有差别,比如 systemd 的默认行为不同。第二种是虚拟机,VirtualBox 或 VMware 装一个最小化安装的发行版,最接近真实服务器体验,缺点是占内存。第三种是云主机,最低配按月付费即可,最贴近生产环境,缺点是涉及费用和账号管理。
如果只是练命令,WSL2 完全够用;如果目标是运维岗位,建议至少折腾一次虚拟机的完整安装过程,分区、用户、网络、SSH,这一遍走下来对理解 Linux 非常有帮助。
3.2 硬件与磁盘的最低要求
命令本身对硬件几乎没有要求。虚拟机上给 1 核 CPU、1GB 内存、10GB 磁盘就能跑;如果要在里面装数据库、跑容器,建议 2 核 4GB 起步。磁盘要特别注意分区规划,/ 根分区别给太小,日志和包缓存很容易把它撑满,这是新手最常遇到的"系统莫名其妙卡住"的真实原因。
网络方面,练习环境建议先配好 NAT 或者桥接,能 ping 通外网再往下走。包管理装软件全靠网络,网络不通时 apt install 报的错看起来像是软件源问题,实际是 DNS 或路由问题,这个后面排错章节会细讲。
3.3 登录前的检查清单
在真正敲命令之前,花两分钟确认四件事:我是谁(whoami)、我在哪(pwd)、机器是什么系统(cat /etc/os-release)、磁盘还有多少空间(df -h)。这四条命令加起来不到十秒,但能避免后面 80% 的"命令不存在"和"No space left on device"。
bash复制# 登录后先做四件事,确认当前环境
whoami
pwd
cat /etc/os-release
df -h
whoami 告诉你当前是 root 还是普通用户,这直接决定后面很多命令要不要加 sudo;pwd 打印当前工作目录,避免在错误的目录里执行删除;/etc/os-release 是判断发行版最可靠的方式,比 uname -a 更准确,因为它直接给出 ID 和版本号;df -h 用人类可读单位显示各分区使用率,一眼看出有没有分区快满了。
4. 安装部署与启动方式
4.1 Windows 下用 WSL2 快速起步
Windows 用户最省事的路径是 WSL2。以管理员身份打开 PowerShell,执行下面这条命令,它会自动启用虚拟化组件并安装默认发行版。
powershell复制# 以管理员身份运行,安装 WSL 及默认 Linux 发行版
wsl --install
# 查看已安装的发行版与运行状态
wsl --list --verbose
# 指定安装某个发行版(名称以 wsl --list --online 输出为准)
wsl --install -d Ubuntu
装完后首次启动会让你设置用户名和密码,这个用户默认不是 root,需要提权时用 sudo。安装完成后在开始菜单里能找到对应终端入口,也可以直接在 PowerShell 里敲 wsl 进入。验证是否正常:进入后执行 uname -r,如果输出里带 microsoft 字样,说明跑在 WSL 内核上,环境正常。
4.2 虚拟机与云主机的手动安装
虚拟机走图形化安装向导,选最小化安装(Minimal Install),安装过程中设置好 root 密码并创建一个普通用户,勾选安装 OpenSSH Server。云主机则是在控制台选镜像、选配置、设置登录方式(密钥或密码),创建完成后通过公网 IP 连接。
连接命令统一用 SSH,第一次连接会提示确认主机指纹,输入 yes 即可。
bash复制# 使用密钥登录,密钥文件权限建议设为 600
chmod 600 ~/.ssh/id_rsa
ssh -i ~/.ssh/id_rsa user@192.168.1.100
# 使用密码登录,指定端口
ssh -p 22 user@192.168.1.100
# 登录后检查服务状态与监听端口
systemctl status sshd
ss -lntp
如果连接被拒绝,先确认服务是否在跑(systemctl status sshd),再确认端口是否监听(ss -lntp | grep :22),最后确认防火墙和云厂商安全组是否放行。这三步是 SSH 连不上的标准排查顺序,按顺序走基本不会漏。
4.3 用容器起一个一次性练习环境
不想动本机配置,可以用 Docker 起一个临时容器,用完即删,非常干净。
bash复制# 拉取基础镜像并进入交互式 shell
docker pull ubuntu:latest
docker run -it --rm --name linux-lab ubuntu:latest bash
# 容器内先更新包索引,再安装常用工具
apt-get update
apt-get install -y vim curl wget procps net-tools iproute2
这里有个细节要注意:容器里默认只有最小工具集,ps、ss、vim 这些可能都没有,需要手动装。procps 提供 ps、top、free,iproute2 提供 ss、ip,net-tools 提供老牌的 ifconfig、netstat。装完之后容器就是一个干净的练习场,随便折腾,退出后容器自动删除,不会污染主机。这个方式特别适合验证危险命令的手感,比如 rm -rf 的匹配范围到底有多大。
5. 功能测试与效果验证
这一章按模块拆分,每个小节都是一个独立的验证单元。建议按顺序练,因为后面的命令经常依赖前面建立的目录结构和文件。
5.1 文件与目录:先把"我在哪"搞清楚
文件操作是使用频率最高的一类。核心就六条:看、进、建、拷、移、删。把它们串起来练一遍,比单独背有效得多。
bash复制# 建一个练习目录并进入
mkdir -p ~/lab/logs && cd ~/lab/logs
# 看:详细信息、人类可读大小、按时间倒序
ls -lh
ls -lht
# 建:批量创建测试文件
touch app-{1..5}.log
# 拷:递归复制并保留属性
cp -a ~/lab/logs ~/lab/logs-bak
# 移:重命名单个文件
mv app-1.log access.log
# 删:先看匹配结果,确认后再删
ls app-*.log
rm -f app-*.log
ls -lh 的 -h 很容易被忽略,但在看日志大小时非常关键,1.2G 比 1283749283 直观太多。-t 按修改时间排序,排查"最近谁改过"的时候比翻日志快。
查找文件用 find,这是最被低估的命令之一。它和 ls 的区别是:ls 看当前目录,find 可以从任意起点递归搜索,并且支持按名称、时间、大小、权限过滤。
bash复制# 按名称查找,忽略大小写
find /var/log -iname "*.log" -type f
# 查找 7 天内修改过的文件
find /var/log -type f -mtime -7
# 查找大于 100MB 的文件
find / -type f -size +100M 2>/dev/null
# 找到后直接执行操作,比管道更高效
find ./logs -name "*.tmp" -exec rm -f {} \;
2>/dev/null 的作用是把权限不足的报错丢掉,全盘搜索时几乎必然会碰到无权访问的目录,不加这个会刷屏。-exec 和管道 xargs 的区别是:-exec 每个文件执行一次,xargs 会批量传参,文件多的时候 xargs 更快,但文件名带空格时要用 -print0 搭配 xargs -0 才安全。
5.2 文本查看与检索:日志分析的主战场
服务器上大部分时间是在处理文本。查看类命令分两种:小文件直接 cat,大文件用 less。less 的优势是可以上下翻页、支持 /关键词 搜索、按 q 退出,不会像 cat 一样把终端刷爆。
真正提高效率的是 grep、awk、sed 三件套加上 sort、uniq、wc。
bash复制# 递归搜索关键词并显示行号
grep -rn "ERROR" ./logs
# 统计某个错误出现的次数
grep -c "ERROR" app.log
# 提取第 7 列(通常是访问日志的状态码)并统计分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head -10
# 查看文件最后 100 行并持续跟踪新增内容
tail -n 100 -f app.log
# 统计行数、单词数、字节数
wc -l app.log
awk '{print $9}' 这个写法值得单独记住:它按空格或制表符切分每一行,取第 9 个字段。Nginx 默认访问日志的第 9 列就是 HTTP 状态码,所以这一行命令可以直接得出"哪些状态码最多"。再往后接 sort | uniq -c 是统计频次的标准套路,sort -rn 按数值倒序排,head 取前几条。
sed 负责替换和删除行。做替换时一定要加 -i.bak 保留备份,这是唯一能反悔的机会。
bash复制# 替换并保留 .bak 备份文件
sed -i.bak 's/old_domain/new_domain/g' nginx.conf
# 删除空行后写入新文件
sed '/^$/d' input.txt > output.txt
判断这些命令是否用对了,标准很简单:输出的行数、列数、数值是否符合预期。如果 awk 取出来的列全是空的,八成是分隔符不对,日志用的是制表符或者其他符号,这时要用 -F 指定分隔符,比如 awk -F',' '{print $3}'。
5.3 权限与用户:90% 的 Permission denied 出在这里
Linux 的权限模型就三组九位:属主、属组、其他人,每组读(r=4)、写(w=2)、执行(x=1)。理解了这个数字关系,chmod 755 就不用背了——属主 7=4+2+1 读写执行,属组 5=4+1 读和执行,其他人同样 5。
bash复制# 查看文件权限与属主
ls -l deploy.sh
# 数字方式授权:属主可读写执行,其他人只读
chmod 644 config.yaml
chmod 755 deploy.sh
# 递归修改属主和属组
chown -R www-data:www-data /var/www/html
# 查看当前用户身份与所属组
id
groups
一个高频场景:脚本写好了,执行时报 Permission denied,原因是新建文件默认没有执行位。这时不要图省事直接 chmod 777,777 意味着任何人都能改这个文件,是典型的安全隐患。正确做法是 chmod +x script.sh,只加执行位,权限范围不变。
另一个高频坑是目录权限。目录的 r 是"能列出内容",x 是"能进入",w 是"能在里面创建删除文件"。所以一个目录如果只有 r 没有 x,你能 ls 看到文件名,但 cd 不进去也读不了里面的文件。这个现象非常迷惑人,遇到"能看到文件但打不开"时先看目录权限。
用户管理方面,日常只需要三条:加用户、加 sudo 权限、切用户。切用户用 su - username,注意中间那个短横线,它会把环境变量一起切换过去,不加的话工作目录和环境还是原用户的,容易出现"明明配置文件在但程序读不到"的问题。
5.4 进程、端口与网络
看进程最常用的是 ps aux 和 top。ps aux 是一张快照,适合配合 grep 精确定位;top 是动态刷新,适合看谁在吃 CPU 和内存。更友好的替代品是 htop,但要额外安装。
bash复制# 精确查找某个进程
ps aux | grep nginx | grep -v grep
# 按内存占用倒序取前 10 个进程
ps aux --sort=-%mem | head -11
# 查看端口监听情况,需要 root 才能看到进程名
ss -lntp
# 查看某个端口被谁占用
ss -lntp | grep :8080
# 发信号:优雅停止与强制杀死
kill -15 12345
kill -9 12345
grep -v grep 这个写法是必须的,因为 grep 自己也会出现在进程列表里,不过滤掉会多出一行干扰判断。kill -15 是发送 TERM 信号让程序自己清理后退出,kill -9 是强制杀死、不给清理机会,会丢数据、会留僵尸进程,只能作为最后手段。
网络连通性排查用 ping、curl、traceroute 三板斧。ping 只验证 ICMP 通不通,很多服务器禁了 ICMP 但服务正常,所以 ping 不通不代表服务挂了。真正的验证用 curl。
bash复制# 只看响应头,验证服务是否正常返回
curl -I http://127.0.0.1:8080
# 显示详细连接过程,排查超时和证书问题
curl -v https://example.com
# 指定超时时间,避免脚本卡死
curl -s -m 5 -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/health
最后一条在脚本里特别有用:-s 静默不输出进度,-m 5 五秒超时,-o /dev/null 丢弃响应体,-w "%{http_code}" 只打印状态码。返回 200 说明服务正常,返回 000 说明连接都没建立起来,这时问题在网络层或服务没启动,而不是业务逻辑。
5.5 磁盘与资源
磁盘满是最容易被忽略的故障源。数据库写不进去、日志停止滚动、服务莫名退出,很多都是磁盘满了导致的。两个命令要分清:df 看文件系统整体使用率,du 看具体目录占了多少。
bash复制# 查看各分区使用率与 inode 使用率
df -h
df -i
# 查看当前目录下各子目录大小,按大小排序
du -sh * | sort -rh | head -10
# 找出根目录下占用最大的前 10 个目录
du -xh / --max-depth=1 2>/dev/null | sort -rh | head -10
df -i 看的是 inode 使用率。有个经典故障:df -h 显示还有空间,但就是写不进文件,报 No space left on device,原因是大量小文件把 inode 用完了。这种情况只能删文件解决,扩容量没用。
du 加 -x 参数表示不跨文件系统,扫根目录时必加,否则会跑到挂载的网络盘或者其他分区里去,速度极慢。sort -rh 里的 -h 是让人类可读单位参与排序,du -sh 输出的是 1.2G 这种格式,不加 -h 排序会乱。
5.6 打包、压缩与传输
部署和备份绕不开这三个动作。tar 打包、gzip 压缩、rsync 或 scp 传输。
bash复制# 打包并 gzip 压缩
tar -zcvf backup-$(date +%F).tar.gz ./data
# 查看压缩包内容,不解压
tar -ztvf backup.tar.gz
# 解压到指定目录
tar -zxvf backup.tar.gz -C /opt/restore
# 增量同步,保留权限与时间戳,显示进度
rsync -avz --progress ./data/ user@192.168.1.100:/opt/data/
tar 的参数顺序有个记忆方法:-z 是 gzip,-c 是创建,-x 是解压,-v 是显示过程,-f 后面跟文件名且必须放最后。-c 和 -x 只能二选一,同时出现会报错。
rsync 相比 scp 的优势是增量传输:第二次同步只传变化的文件,几千个文件的目录同步时间从几分钟降到几秒。注意源路径结尾的斜杠,./data/ 表示同步目录内容,./data 表示同步目录本身,这个差别会导致目标目录多一层嵌套,是新手最容易搞错的地方。
5.7 软件包管理:apt 与 dnf
发行版差异主要在这里。Debian、Ubuntu 系用 apt,RedHat、CentOS、Rocky 系用 dnf(老版本用 yum)。命令结构高度相似,记住一套另一套基本能猜出来。
bash复制# Debian / Ubuntu 系
apt-get update
apt-get install -y curl vim
apt-get remove --purge -y 包名
apt-cache search 关键词
# RedHat / CentOS / Rocky 系
dnf makecache
dnf install -y curl vim
dnf remove -y 包名
dnf search 关键词
apt-get update 经常被误解成"升级软件",它其实只是刷新软件源索引。真正升级已安装的包是 apt-get upgrade。不先 update 就 install,很容易报"找不到包",因为本地索引是旧的。
安装前建议先 search 一下包名,不同发行版的包名差异很大,比如提供 ss 命令的包在 Ubuntu 上是 iproute2,在一些老系统上是 iproute。装完用 which 验证一下可执行文件路径,比看安装日志快。
6. 脚本化与批量任务
严格来说,Linux 命令行工具绝大多数不提供 HTTP 接口,它们的接口是标准输入、标准输出和退出码。理解这一点非常关键:0 表示成功,非 0 表示失败,脚本里的 if 判断、&& 串联全靠这个约定。这和调用 API 拿到 JSON 响应再判断状态码,本质是一致的,只是形态不同。
6.1 把命令串成脚本
脚本不是命令的堆积,而是"出错就停、有日志、可重跑"的流程。下面这个模板可以直接拿来改。
bash复制#!/usr/bin/env bash
set -euo pipefail
LOG_DIR="./logs"
OUT_DIR="./output"
mkdir -p "$OUT_DIR"
log() {
echo "[$(date '+%F %T')] $*"
}
main() {
log "开始处理"
if [ ! -d "$LOG_DIR" ]; then
log "目录不存在: $LOG_DIR"
exit 1
fi
local count
count=$(find "$LOG_DIR" -type f -name "*.log" | wc -l)
log "待处理文件数: $count"
find "$LOG_DIR" -type f -name "*.log" -print0 \
| while IFS= read -r -d '' f; do
log "处理: $f"
grep -c "ERROR" "$f" > "$OUT_DIR/$(basename "$f").cnt" || true
done
log "处理完成"
}
main "$@"
set -euo pipefail 这三合一非常值得记住:-e 遇到错误立即退出,-u 使用未定义变量时报错,-o pipefail 让管道中任一环节失败都算失败。没有这三行,脚本会带着错误继续往下跑,最后产出一堆错误结果还显示"成功"。
-print0 配合 read -r -d '' 是为了处理文件名里的空格和特殊字符。用 for f in $(find ...) 的写法在文件名带空格时会直接断裂,这是 shell 脚本最经典的坑之一。
6.2 批量任务与并发控制
批量处理的关键是控制并发数,全速跑会把 CPU 和 IO 打满,反而更慢。
bash复制# 每次传 1 个参数,最多 4 个并发
find ./images -name "*.png" -print0 \
| xargs -0 -n 1 -P 4 -I{} sh -c 'convert "{}" "{}".jpg'
# 简单的重命名批处理
for f in *.log; do
mv "$f" "archive-${f}"
done
xargs -P 是并发数,-n 是每次传几个参数,-I{} 是占位符替换。并发数不是越大越好,IO 密集型的任务给 4 到 8 就够,再大反而因为上下文切换变慢。跑之前先用 echo 代替真实命令试一遍,确认参数拼接正确,这个习惯能避免大批量的误操作。
6.3 定时任务
cron 是最简单的定时调度。crontab -e 编辑当前用户的定时任务,格式是五个时间字段加命令。
bash复制# 每天凌晨 2 点执行备份脚本
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
# 每 5 分钟检查一次服务健康状态
*/5 * * * * curl -s -m 3 -o /dev/null http://127.0.0.1:8080/health || systemctl restart app
写 cron 有两个必做项。第一,所有输出必须重定向到日志文件,>> xxx.log 2>&1 同时捕获标准输出和标准错误,否则任务失败了完全没有痕迹。第二,cron 执行时的环境变量和你登录时不一样,PATH 通常很短,所以脚本里最好用绝对路径,或者在脚本开头显式设置 PATH。这是"手动跑没问题、定时跑就失败"的头号原因。
7. 资源占用与性能观察
命令本身的资源占用可以忽略,真正要观察的是被这些命令管理的进程和系统状态。
CPU 和内存用 top 或 htop,重点看三个值:load average(1/5/15 分钟平均负载)、%Cpu(s) 里的 wa(IO 等待占比)、MiB Mem 里的 available(真正可用的内存)。负载高低要和核数对比,4 核机器负载 4 算满,8 核机器负载 4 还有余量。wa 高说明瓶颈在磁盘不在 CPU,这时候加 CPU 没用。
内存不要只看 free,看 available。Linux 会把空闲内存拿去做缓存,free 显示很小是正常的,available 才是新进程真正能申请到的量。
bash复制# 内存概览,人类可读
free -h
# 每秒采样一次,共 5 次,观察瞬时波动
vmstat 1 5
# 磁盘 IO 详情,需要 sysstat 包
iostat -x 1 5
# 实时观察某个进程的资源占用
top -p $(pgrep -d',' nginx)
vmstat 输出里的 si 和 so 是换入换出,只要不为 0 就说明内存不够用了,系统在拿磁盘当内存使,性能会断崖式下跌。iostat -x 里的 %util 接近 100% 说明磁盘被打满,await 是平均等待毫秒数,机械盘超过 20ms、SSD 超过 5ms 就值得关注。
要降低资源占用,最直接的三招:限制并发数(xargs -P 调小)、给日志加轮转(logrotate)、把大文件处理改成流式(grep 管道而不是先 cat 全文件)。另外注意清理残留进程,nohup 起的后台任务如果忘了记录 PID,重启服务时旧进程还在占着端口,新进程起不来又不报明显错误,这种情况用 ss -lntp 查端口占用最快。
8. 常见问题与排查方法
命令行的报错信息通常很直白,但新手容易看错方向。下面这张表覆盖了最高频的十类问题。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
command not found |
未安装、PATH 未包含、拼写错误 | which 命令、echo $PATH |
安装对应包,或用绝对路径执行 |
Permission denied |
文件无执行位、属主不对、目录缺 x 位 | ls -l 看权限,id 看身份 |
chmod +x,chown 改属主,避免 777 |
No space left on device |
分区满或 inode 耗尽 | df -h、df -i |
清理日志和大文件,配置 logrotate |
| 端口被占用 | 旧进程未退出 | ss -lntp | grep :端口 |
kill -15 优雅停止后重启 |
| SSH 连不上 | 服务未启动、防火墙或安全组未放行 | systemctl status sshd、ss -lntp |
启动服务,放行端口 |
apt install 找不到包 |
索引未更新、源配置错误 | apt-get update 看报错 |
更新索引,检查软件源 |
| 脚本手动能跑、定时失败 | cron 环境变量不同、路径为相对路径 | 任务输出重定向到日志 | 用绝对路径,脚本内设置 PATH |
脚本报 bad interpreter |
文件是 Windows 换行符 CRLF | file script.sh、cat -A |
dos2unix 或 sed -i 's/\r$//' |
| 中文显示乱码 | 终端编码与文件编码不一致 | echo $LANG、file 文件名 |
设置 LANG=zh_CN.UTF-8 或转码 |
| 管道无输出但命令不报错 | 上游无匹配、被 grep -v 过滤掉 |
去掉管道分步执行 | 逐段验证每步输出 |
挑几个展开说。bad interpreter 这个错误在 WSL 和 Windows 混用场景下极其常见:在 Windows 编辑器里写的脚本,换行符是 \r\n,Linux 只认 \n,于是解释器路径变成了 /bin/bash\r,系统找不到这个文件。用 cat -A script.sh 看行尾,如果显示 ^M$ 就是这个问题,sed -i 's/\r$//' script.sh 一行解决。
管道无输出也是高频困惑。ps aux | grep xxx 什么都没打印,不代表进程不存在,可能是 grep 的匹配串写错了大小写。排查方法很简单:把管道拆开,先单独跑 ps aux | head 确认上游有输出,再逐步加 grep。分段验证永远比盯着整条命令猜要快。
还有一个隐性坑是 sudo 和重定向的组合。sudo echo x > /etc/file 会失败,因为重定向是当前 shell 做的,不是 sudo 做的。正确写法是 echo x | sudo tee /etc/file,或者 sudo sh -c 'echo x > /etc/file'。这个细节不搞清楚,会一直以为是权限问题。
9. 最佳实践与使用建议
第一条,先看清再动手。所有删除、覆盖、权限变更类操作,都先用 ls 或 find 把匹配范围打印出来,确认无误再执行真实命令。rm -rf $DIR/ 里 $DIR 为空时会变成 rm -rf /,这类事故每年都在发生,加一句 [ -n "$DIR" ] || exit 1 就能挡住。
第二条,建立自己的命令速查表。不需要背全部参数,把常用的十几个组合记下来就行:查端口、看日志尾部、统计状态码、找大文件、批量改名。真正高频的组合不超过二十个,剩下的用 man 或 命令 --help 现查完全来得及。
第三条,善用 Tab 补全和 history。Tab 补全能避免大量拼写错误,history | grep 关键词 能找回三天前敲过的那条长命令,Ctrl+R 是反向搜索历史,比翻记录快得多。把这些用熟,效率提升比多背十个命令明显。
第四条,脚本要有日志、要能重跑、要有幂等性。mkdir -p 而不是 mkdir,覆盖前先判断存在,失败要留下明确日志。批量任务一定要记录处理到哪了,中断后能从断点继续,而不是从头再来一遍。
第五条,权限最小化。日常用普通用户加 sudo,不要长期 root;文件权限给到刚好够用,不要 777;SSH 优先用密钥登录并关闭密码登录。这些不是洁癖,是降低误操作和未授权访问风险的基本操作。
第六条,涉及生产环境的操作先在测试环境验证。命令在本地跑通不代表在服务器上跑通,路径、权限、环境变量、依赖版本都可能有差异,尤其是 sed 改配置文件这种操作,一条命令改错就是服务起不来。
10. 学习路径与下一步
如果只能记住一条建议:不要按命令表学,按任务学。给自己定几个具体任务——找出占用磁盘最大的目录、统计访问日志里出现最多的 IP、写一个每天备份并清理七天前日志的脚本——每完成一个,就自然掌握了一组命令,而且是有上下文的记忆,不容易忘。
学习顺序建议这样排:第一周只练文件和文本,ls、cd、find、grep、tail、awk,这六个能覆盖日常一半以上的工作;第二周加权限和进程,chmod、chown、ps、ss、kill,能独立排查服务起不来的问题;第三周加磁盘和打包,df、du、tar、rsync,能处理备份和迁移;第四周开始写脚本,把前面三周的组合动作固化下来。
最容易踩的坑集中在这几个地方:rm -rf 的变量为空、chmod 777 图省事、cron 里用相对路径、Windows 换行符导致脚本跑不起来、sudo 配重定向失效、rsync 源路径斜杠搞错。这些坑不需要自己踩一遍,看一眼记住就行。
再往后的方向有三个。一是深入文本处理,把 awk 的字段处理和 sed 的正则替换练熟,日志分析能力会有一个台阶式提升。二是学 systemd,把服务托管、开机自启、日志查看(journalctl)这套体系搞清楚,这是从"会敲命令"到"会管服务器"的分水岭。三是学一门脚本语言的补充能力,比如用 Python 处理 shell 不擅长的结构化数据和复杂逻辑,两者配合比单纯依赖 shell 更稳。
最后提醒一句:所有命令练习都请在自有或已获授权的环境里进行,涉及生产数据时先备份再操作,涉及日志和用户信息时注意脱敏。命令行是把快刀,熟练之后效率极高,但前提是知道刀口朝哪。建议把本文的速查表和排错表收藏起来,下次遇到报错直接对照查,比重新搜一遍快。
