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,通常能快速建立系统全貌。