Linux 常用命令完整实战手册
这是一份面向日常运维、开发和故障排查的 Linux 命令资料。示例默认在 Bash 中执行,适用于 Ubuntu、Debian、Rocky Linux、AlmaLinux、CentOS Stream 等常见发行版。不同系统的软件包管理器、服务名和网卡名可能不同,执行前应先确认实际环境。
安全原则:先查看、再修改;先备份、再覆盖;涉及删除、磁盘、权限、防火墙和远程登录的操作,必须先确认目标路径和当前会话。不要把未经检查的变量、通配符或网上复制的脚本直接交给
rm、dd、mkfs、chmod -R等命令。
1. 认识终端、Shell 与命令结构
Linux 命令通常由“命令、选项、参数”组成:
ls -lah /var/log
ls是命令。-lah是三个短选项的组合。/var/log是操作对象。- 长选项通常写成
--human-readable。 - 路径或文件名包含空格时必须加引号,例如
cd "/data/My Files"。
查看当前使用的 Shell:
echo "$SHELL"
ps -p $$ -o pid,comm,args
查看命令来自哪里,以及是否为别名、内建命令或可执行文件:
type cd
type -a python3
command -v nginx
which ssh
command -v 更适合脚本判断;type -a 能显示同名命令的所有来源。
2. 获取帮助和阅读手册
遇到陌生命令,优先查看系统自带帮助:
ls --help
man ls
man 5 crontab
info coreutils
apropos "copy files"
whatis chmod
常用技巧:
- 在
man中输入/关键字搜索,按n查找下一个,按q退出。 man 1通常是用户命令,man 5是配置文件格式,man 8是系统管理命令。- Shell 内建命令可使用
help cd、help export查看。
3. 路径、目录与文件导航
查看当前位置和目录内容:
pwd
ls
ls -lah
ls -lt
ls -ltr
ls -ld /etc /var/log
常见 ls 选项:
-l:长格式。-a:包含隐藏文件。-h:以 KiB、MiB、GiB 显示大小。-t:按修改时间排序。-d:显示目录本身而不是目录内容。
目录切换:
cd /var/log
cd ..
cd -
cd
/是根目录。~是当前用户家目录。.表示当前目录,..表示上一级目录。cd -返回上一次所在目录。
规范化并查看绝对路径:
realpath ./config/../app.conf
readlink -f /usr/bin/python3
4. 创建、复制、移动和删除
创建目录和空文件:
mkdir reports
mkdir -p data/2026/10
touch notes.txt
install -d -m 750 /srv/myapp/logs
复制文件和目录:
cp source.txt backup.txt
cp -a config config.backup
cp -v source.txt /tmp/
rsync -aHAX --info=progress2 source/ destination/
注意 source/ 和 source 在 rsync 中含义不同:前者复制目录内容,后者复制目录本身。正式同步前可以添加 --dry-run 预演。
移动和改名:
mv old.txt new.txt
mv -i report.txt /archive/
安全删除:
rm -i unwanted.txt
rmdir empty-directory
find /tmp/myapp -type f -mtime +7 -print
最后一条只打印候选文件。确认无误后,才可以把 -print 改成 -delete。不要执行来源不明的 rm -rf 命令;递归删除前先用 realpath、ls -la 和 find 核对目标。
5. 查看文本文件
查看小文件:
cat /etc/os-release
nl -ba app.conf
分页查看大文件:
less /var/log/syslog
less +F application.log
在 less 中按 Shift+F 实时跟踪,按 Ctrl+C 停止跟踪,按 q 退出。
查看头尾和指定范围:
head -n 20 file.txt
tail -n 50 file.txt
tail -f application.log
sed -n '20,40p' file.txt
查看不可见字符和文件类型:
cat -A script.sh
file upload.bin
stat file.txt
6. 搜索文件和内容
按文件名搜索:
find /etc -type f -name '*.conf'
find /var/log -type f -size +100M -print
find /srv -type f -mtime -1 -print
find /data -maxdepth 2 -type d -name cache
时间条件:
-mtime -1:最近 24 小时内修改。-mtime +7:超过 7 个整天未修改。-mmin -30:最近 30 分钟内修改。
搜索文件内容:
grep -n 'ERROR' application.log
grep -RIn --exclude-dir=.git 'listen_port' /srv/myapp
grep -E 'ERROR|WARN' application.log
rg -n 'timeout|connection refused' /srv/myapp
rg(ripgrep)通常比递归 grep 更快,并默认忽略 .gitignore 排除的文件。
组合 find 与其他命令:
find /var/log/myapp -type f -name '*.log' -print0 |
xargs -0 grep -nH 'request_id=abc123'
使用 -print0 和 xargs -0 可以正确处理包含空格或换行的文件名。
7. 重定向、管道和命令组合
标准输入、标准输出和标准错误的文件描述符分别是 0、1、2。
command >output.txt
command >>output.txt
command 2>error.txt
command >all.log 2>&1
command 2>&1 | tee run.log
>覆盖文件。>>追加文件。2>&1把标准错误合并到标准输出。tee同时显示并写入文件;tee -a表示追加。
管道把前一个命令的输出交给后一个命令:
ps aux | sort -rk 3 | head
journalctl -u nginx --since today | grep -i error
du -ah /var | sort -h | tail -20
命令关系:
make && sudo systemctl restart myapp
test -f config.yml || echo 'config missing'
command1 ; command2
&&:前一条成功才执行后一条。||:前一条失败才执行后一条。;:无论成功失败都继续。
脚本中建议启用:
set -Eeuo pipefail
它能让未处理的失败、未定义变量和管道中间错误更早暴露,但加入旧脚本前应先测试兼容性。
8. 文本处理:sort、uniq、cut、tr、awk、sed
排序和去重:
sort names.txt
sort -n numbers.txt
sort -u names.txt
sort names.txt | uniq -c | sort -nr
提取字段:
cut -d: -f1 /etc/passwd
awk -F: '{print $1, $3, $7}' /etc/passwd
df -P | awk 'NR>1 {print $5, $6}'
字符转换:
tr '[:lower:]' '[:upper:]' < names.txt
tr -d '\r' < windows.txt > unix.txt
使用 sed 预览替换:
sed 's/old.example.com/new.example.com/g' app.conf
确认输出正确后再原地修改,并保留备份:
sed -i.bak 's/old.example.com/new.example.com/g' app.conf
9. 用户、用户组和身份
查看身份:
whoami
id
groups
who
w
last -n 20
用户管理通常需要 root 权限:
sudo useradd -m -s /bin/bash alice
sudo passwd alice
sudo usermod -aG sudo alice
sudo usermod -aG docker alice
sudo userdel -r alice
usermod -aG 中的 -a 不能省略,否则可能覆盖用户原有附加组。加入新组后通常需要重新登录。
切换身份:
sudo -iu alice
sudo -u www-data id
sudo command
不要长期使用 root 会话处理普通文件。sudo 只应授予完成任务所需的最小权限。
10. 文件权限、所有者和特殊权限
长格式权限示例:
-rwxr-x--- 1 alice developers 2048 Oct 5 10:00 deploy.sh
三组权限依次属于所有者、用户组和其他用户;r、w、x 分别是读、写、执行。
修改权限:
chmod u+x deploy.sh
chmod 640 app.conf
chmod 750 scripts
数字权限:
- 4 表示读,2 表示写,1 表示执行。
640表示所有者可读写、组只读、其他无权限。750表示所有者全权限、组可读执行、其他无权限。
修改所有者:
sudo chown alice:developers report.txt
sudo chown -R www-data:www-data /srv/site/uploads
递归操作前先检查范围。对整个系统执行 chmod -R 777 或错误的 chown -R 会造成严重安全和启动故障。
默认权限掩码:
umask
umask 027
查看 ACL:
getfacl shared.txt
setfacl -m u:alice:rw shared.txt
setfacl -x u:alice shared.txt
11. 进程查看与控制
查看进程:
ps aux
ps -ef
ps -eo pid,ppid,user,stat,%cpu,%mem,etime,args --sort=-%cpu
pgrep -af nginx
pstree -ap
top
htop
常见进程状态:R 运行中,S 可中断睡眠,D 不可中断 I/O 等待,T 已停止,Z 僵尸进程。
发送信号:
kill -TERM 1234
kill -HUP 1234
kill -KILL 1234
pkill -TERM -f 'python3 worker.py'
优先使用 TERM 请求程序正常退出;只有程序无法退出且确认目标 PID 后才使用 KILL。pkill -f 可能匹配多个进程,先用 pgrep -af 核对。
后台任务:
long-command &
jobs -l
fg %1
bg %1
nohup long-command >run.log 2>&1 &
长期服务建议交给 systemd、Supervisor 或容器编排管理,不要只依赖 nohup。
12. systemd 服务管理
查看和控制服务:
systemctl status nginx --no-pager
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
sudo systemctl enable --now nginx
sudo systemctl disable nginx
reload 通常只重载配置,连接中断较少;是否支持取决于服务。修改 unit 文件后执行:
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
查看失败的服务:
systemctl --failed
systemctl list-units --type=service --state=running
systemctl cat myapp.service
systemctl show myapp.service -p ActiveState -p SubState -p MainPID
13. 系统日志与 journalctl
查看内核和启动日志:
dmesg -T | tail -100
journalctl -b
journalctl -b -1
journalctl -k --since '1 hour ago'
查看服务日志:
journalctl -u nginx --since today
journalctl -u myapp -n 200 --no-pager
journalctl -u myapp -f
journalctl -p err..alert --since '2026-10-05 08:00'
传统日志常在 /var/log/。Ubuntu/Debian 常见 /var/log/syslog 和 /var/log/auth.log,RHEL 系常见 /var/log/messages 和 /var/log/secure。
查看日志占用:
journalctl --disk-usage
sudo journalctl --vacuum-time=14d
清理前应确认组织的审计和留存要求。
14. CPU、内存、负载和系统信息
查看系统版本和内核:
cat /etc/os-release
uname -a
hostnamectl
uptime
lscpu
查看内存:
free -h
cat /proc/meminfo | head
vmstat 1 5
available 比单纯的 free 更能反映可供新进程使用的内存。Linux 会使用空闲内存做文件缓存,缓存较高不等于内存泄漏。
查看负载和进程资源:
top
ps -eo pid,user,%cpu,%mem,rss,etime,args --sort=-%mem | head -20
pidstat 1
mpstat -P ALL 1
load average 需要结合 CPU 核数和 I/O 等待分析。高负载不一定意味着 CPU 已满,也可能是大量进程处于不可中断 I/O 等待。
15. 磁盘空间、目录占用和 inode
查看文件系统:
df -hT
df -ih
lsblk -f
findmnt
mount | column -t
查看目录占用:
du -sh /var/* 2>/dev/null | sort -h
du -xah /var | sort -h | tail -30
sudo find / -xdev -type f -size +1G -printf '%s %p\n' |
sort -n
df显示文件系统整体使用量。du统计目录树可见文件的大小。- 文件已删除但仍被进程打开时,
df可能很满而du找不到,可使用lsof +L1检查。 - inode 用尽时即使仍有容量也无法创建新文件,使用
df -i检查。
查找已删除但仍占空间的文件:
sudo lsof +L1
通常应重启或正常重载持有文件的服务,不要直接操作 /proc/<pid>/fd 中的描述符。
16. 磁盘、分区和文件系统操作
只读检查:
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,UUID
sudo fdisk -l
sudo blkid
findmnt /data
挂载示例:
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
findmnt /mnt/data
sudo umount /mnt/data
永久挂载通常通过 /etc/fstab,建议使用 UUID。修改后先检查:
sudo cp -a /etc/fstab /etc/fstab.bak
sudo mount -a
findmnt --verify
mkfs、fdisk、parted、dd 会破坏磁盘数据。本手册不提供可直接复制的格式化命令;执行前必须核实设备名、备份、挂载状态和恢复方案。
17. 压缩、归档和校验
创建与解压 tar 包:
tar -czf backup.tar.gz project/
tar -tzf backup.tar.gz | less
tar -xzf backup.tar.gz -C /restore/path
tar -cJf backup.tar.xz project/
tar -xJf backup.tar.xz
ZIP 文件:
zip -r archive.zip directory/
unzip -l archive.zip
unzip archive.zip -d destination/
校验完整性:
sha256sum image.iso
sha256sum -c checksums.sha256
md5sum legacy-file.bin
安全或发布校验优先使用 SHA-256;MD5 只适合兼容旧流程中的意外损坏检测,不适合抵御恶意篡改。
18. 网络配置与连通性排查
查看地址、路由和邻居:
ip -br addr
ip route
ip route get 1.1.1.1
ip neigh
查看监听端口和连接:
ss -lntup
ss -ntp state established
sudo lsof -iTCP:8080 -sTCP:LISTEN
连通性测试:
ping -c 4 192.168.1.1
curl -I https://example.com
curl -v --connect-timeout 5 http://127.0.0.1:8080/health
nc -vz -w 3 server.example.com 443
tracepath server.example.com
DNS 排查:
getent hosts example.com
resolvectl status
dig example.com A
dig @1.1.1.1 example.com
建议按层排查:网卡是否有地址、是否有默认路由、网关是否可达、DNS 是否解析、目标端口是否监听、防火墙是否允许、应用是否返回正确协议响应。
19. SSH 远程登录与文件传输
登录:
ssh user@server.example.com
ssh -p 2022 user@server.example.com
ssh -i ~/.ssh/id_ed25519 user@server.example.com
生成现代密钥:
ssh-keygen -t ed25519 -a 100
ssh-copy-id -p 2022 user@server.example.com
复制文件:
scp -P 2022 report.txt user@server:/srv/reports/
scp -P 2022 user@server:/var/log/app.log ./
rsync -avz -e 'ssh -p 2022' ./site/ user@server:/srv/site/
端口转发:
ssh -L 8080:127.0.0.1:80 user@server
ssh -N -L 5433:127.0.0.1:5432 user@server
排错:
ssh -v user@server
ssh -G user@server | less
私钥权限通常应为 600,.ssh 目录为 700。不要通过聊天、命令行参数或公共日志传递密码和私钥。
20. 软件包管理
Ubuntu/Debian:
sudo apt update
apt list --upgradable
sudo apt install nginx
sudo apt remove nginx
sudo apt autoremove
dpkg -l | grep nginx
dpkg -L nginx
apt-file search /usr/bin/example
RHEL、Rocky Linux、AlmaLinux:
sudo dnf check-update
sudo dnf install nginx
sudo dnf remove nginx
dnf list installed
rpm -qa | grep nginx
rpm -ql nginx
dnf provides '*/example'
升级生产服务器前应查看变更内容、备份配置、评估重启需求并准备回滚,不要在业务高峰直接执行无人值守的大版本升级。
21. 环境变量和 Shell 配置
查看变量:
env | sort
printenv PATH
echo "$HOME"
设置当前 Shell 变量和环境变量:
name='linux'
export APP_ENV=production
unset APP_ENV
安全追加 PATH:
export PATH="$HOME/.local/bin:$PATH"
个人 Bash 配置通常位于 ~/.bashrc、~/.profile 或 ~/.bash_profile。修改后可重新登录,或在当前 Shell 中执行:
source ~/.bashrc
不要把密钥直接写进可被其他用户读取的配置文件,也不要用 echo $SECRET 排错,因为终端记录和日志可能泄露它。
22. Bash 变量、判断和循环
引用变量时通常使用双引号:
file='/data/monthly report.txt'
if [[ -f "$file" ]]; then
printf 'found: %s\n' "$file"
fi
常见文件判断:
-e:路径存在。-f:普通文件。-d:目录。-r、-w、-x:可读、可写、可执行。-s:文件存在且非空。
循环示例:
for file in /var/log/myapp/*.log; do
[[ -e "$file" ]] || continue
printf '%s %s bytes\n' "$file" "$(stat -c %s "$file")"
done
读取文本行:
while IFS= read -r line; do
printf '%s\n' "$line"
done < input.txt
避免使用 for line in $(cat file),因为空格和通配符会破坏原始内容。
23. 定时任务:cron 与 systemd timer
编辑当前用户的 cron:
crontab -e
crontab -l
示例:每天 02:30 执行备份脚本并记录日志。
30 2 * * * /usr/local/bin/backup.sh >>/var/log/backup.log 2>&1
cron 环境比交互式 Shell 简单,脚本中应使用绝对路径,并显式设置必要的 PATH。检查服务和日志:
systemctl status cron
journalctl -u cron --since today
systemd timer 更适合需要依赖管理、随机延迟、错过后补跑和统一日志的任务:
systemctl list-timers --all
systemctl status backup.timer
journalctl -u backup.service
24. 时间、日期和时区
date
date -u
date --iso-8601=seconds
timedatectl
timedatectl list-timezones | grep Shanghai
sudo timedatectl set-timezone Asia/Shanghai
文件时间:
stat file.txt
find /data -type f -newermt '2026-10-05 08:00' -print
分布式系统排错时要明确日志使用 UTC 还是本地时间,并检查 NTP 同步状态:
timedatectl show -p NTPSynchronized
25. 防火墙基础
Ubuntu 常用 UFW:
sudo ufw status verbose
sudo ufw allow 22/tcp
sudo ufw allow from 192.168.1.0/24 to any port 6080 proto tcp
RHEL 系常用 firewalld:
sudo firewall-cmd --state
sudo firewall-cmd --list-all
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
远程修改 SSH 或防火墙规则时,必须保留当前已登录会话,先新增并验证新规则,再删除旧规则。错误的默认拒绝规则可能让服务器立刻失联。
26. Docker 常用命令
查看容器与镜像:
docker ps
docker ps -a
docker images
docker inspect container-name
docker stats --no-stream
日志和容器内执行:
docker logs --tail 200 container-name
docker logs -f --since 10m container-name
docker exec -it container-name bash
docker exec container-name env
生命周期操作:
docker start container-name
docker stop container-name
docker restart container-name
docker compose ps
docker compose config --quiet
docker compose up -d --build
数据应通过 volume 或 bind mount 持久化。删除或重建容器前用 docker inspect 检查挂载,不能假设容器可写层中的数据会保留。
清理前先查看占用:
docker system df
docker image ls
docker volume ls
docker system prune 可能删除未使用资源,不应在不了解依赖关系时直接执行,尤其不要随意添加 --volumes。
27. 常见故障排查流程
服务无法访问
systemctl status myapp --no-pager
journalctl -u myapp -n 200 --no-pager
ss -lntp | grep ':8080'
curl -v http://127.0.0.1:8080/health
ip route
sudo ufw status verbose
先验证进程和本机回环访问,再检查监听地址、主机防火墙、云安全组、DNS和反向代理。
磁盘已满
df -hT
df -ih
du -xsh /* 2>/dev/null | sort -h
sudo lsof +L1
journalctl --disk-usage
不要看到大文件就立即删除。先确认它是否仍被服务使用、是否需要归档,以及是否有日志轮转策略。
CPU 使用率高
uptime
top -b -n 1 | head -30
ps -eo pid,ppid,user,%cpu,%mem,etime,args --sort=-%cpu | head
pidstat -p ALL 1 5
记录 PID、命令行、开始时间和调用关系,再结合应用日志定位请求、死循环、编译任务或异常重试。
内存不足或 OOM
free -h
ps -eo pid,user,rss,%mem,args --sort=-rss | head -20
journalctl -k | grep -iE 'oom|out of memory|killed process'
vmstat 1 5
需要区分正常文件缓存、应用堆增长、进程数量过多和容器内存限制。不要把清理缓存当作长期解决方案。
权限被拒绝
id
namei -l /srv/app/data/file.txt
stat /srv/app/data/file.txt
getfacl /srv/app/data/file.txt
sudo journalctl -k | grep -i denied
访问文件需要路径上每一级目录都有适当的执行权限。除传统权限和 ACL 外,还要考虑 SELinux、AppArmor、只读挂载以及容器用户映射。
28. 高风险命令检查清单
运行以下类型命令前应停下来复核:
rm -rf:确认绝对路径,不依赖空变量或未验证通配符。dd、mkfs、分区工具:确认输入输出设备和备份。chmod -R、chown -R:确认递归范围和符号链接行为。iptables、nft、UFW、firewalld:确保不会切断当前 SSH。- 数据库删除、Docker volume 删除:确认数据备份和恢复验证。
curl ... | sh:先下载到文件,阅读并验证来源和校验值。- 生产环境批量替换:先在副本或
--dry-run中验证。
一个通用的安全执行顺序:
明确目标 → 只读检查 → 缩小范围 → 创建备份 → 预演 → 执行 → 验证 → 记录变更
29. 日常速查表
# 系统与资源
uptime
free -h
df -hT
df -ih
ps -eo pid,user,%cpu,%mem,etime,args --sort=-%cpu | head
# 网络
ip -br addr
ip route
ss -lntup
curl -I http://127.0.0.1:8080
# 服务与日志
systemctl --failed
systemctl status SERVICE --no-pager
journalctl -u SERVICE -n 200 --no-pager
# 文件定位
find /path -type f -name '*.log'
rg -n 'ERROR|WARN' /path
du -xah /path | sort -h | tail
# 校验与归档
sha256sum FILE
tar -czf backup.tar.gz DIRECTORY
tar -tzf backup.tar.gz
30. 结语
熟练使用 Linux 命令的关键不是记住所有选项,而是形成可靠的操作习惯:用帮助系统确认参数,用只读命令建立事实,用日志和指标定位问题,用最小权限和可恢复步骤实施变更。面对陌生服务器时,先运行 cat /etc/os-release、uname -a、id、uptime、df -hT、free -h 和 systemctl --failed,通常能快速建立系统全貌。