Linux 高频运维命令全梳理,日常工作随手即用17认证网

正规官方授权
更专业・更权威

Linux 高频运维命令全梳理,日常工作随手即用

写在前面

Linux 运维的”基本功”是命令。新人最大的痛苦不是不会用某个工具,而是不知道有这工具存在。老工程师经常 5 分钟搞定的事,新人翻文档 2 小时。

这篇文章把所有高频命令按”场景”分类,每个命令给:

  • 用途
  • 常见参数
  • 一个真实能跑的示例
  • 注意事项 / 风险提示

不写”Hello World”级别的 demo,全部按生产场景来。学完这一篇,日常 80% 的运维操作能直接照着敲

适用读者:

  • 刚开始做 Linux 运维的新人
  • 想系统梳理命令体系的初中级工程师
  • DevOps 工程师,跨工种需要 Linux 排错能力

一、命令速查索引

分类
核心命令
系统信息
uname

hostnameuptimedatecalwhowlast
进程
ps

tophtoppidofpgreppkillkillpstreenicerenicesystemctl
CPU
top

mpstatsar -uvmstatlscputurbostatperf top
内存
free

vmstatsar -rslabtopsmempmapnumastat
网络
ip

ssnetstatcurlwgettcpdumpiftopnethogsmtrtraceroutencethtoolsar -n
磁盘
df

dulsblkblkidmountfdiskpartediostatiotopfuserlsof
文件
find

locatestatfiletreelschmodchownlnrsyncscptarzip
日志
tail

headlessgrepawksedjournalctldmesglogrotate
用户
useradd

usermoduserdelpasswdchagegroupaddidsusudo
服务
systemctl

journalctlsystemd-analyze
包管理
yum

dnfaptrpmdpkg
定时
crontab

atflock
性能分析
strace

ltraceperfbccbpftrace
文本三剑客
grep

awksedxargssortuniqcuttrcolumn
工具
tmux

screenglancesdstatnmonsysstat

下面分类详讲。

二、系统信息命令

2.1 uname

uname -a
# Linux host-01 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

uname -r
# 5.15.0-91-generic
# 看内核版本,模块编译时要用

uname -m
# x86_64
# 看架构,aarch64 / x86_64 / i686

2.2 hostname

hostname
# 看主机名

hostnamectl set-hostname redis-prod-01
# 永久改主机名(systemd 机器)

hostname -I
# 看所有 IP

2.3 uptime

uptime
# 14:30:00 up 200 days, 10:00,  3 users,  load average: 0.50, 0.40, 0.30
# - up 200 days:开机时间
# - 3 users:登录用户数
# - load average:1 / 5 / 15 分钟平均负载
# 负载除以 CPU 核数,> 1 说明忙

2.4 date

date
# 看时间

date -s "2026-06-13 14:30:00"
# 改时间(生产别瞎改,会打乱业务)

date -d "@1700000000"
# 时间戳转时间

date +%s
# 当前时间戳

date -d "yesterday" +%Y-%m-%d
# 算昨天

2.5 w / who / last

w
# 看当前登录的用户,正在做什么
# 14:30:00 up 200 days,  3 users,  load average: 0.50, 0.40, 0.30
# USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
# root     pts/0    10.20.0.100      14:00    0.00s  0.10s  0.00s w

who
# 看登录用户,简版

last
# 看历史登录,从 /var/log/wtmp 读
# 排查谁登陆过服务器

last -i
# 看 IP

三、进程命令

3.1 ps

# BSD 风格
ps aux
# USER  PID  %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
# root    1   0.0  0.0  169404 11556 ?        Ss   Jun10   0:08 /sbin/init

# System V 风格
ps -ef
# UID  PID  PPID  C STIME TTY          TIME CMD

# 看指定进程
ps -ef | grep nginx

# 按 CPU 排序
ps aux --sort=-%cpu | head

# 按内存排序
ps aux --sort=-%mem | head

# 看进程树
ps auxf

# 详细字段
ps -eo pid,ppid,user,stat,pcpu,pmem,vsz,rss,etime,cmd
# etime:进程运行时长

# 看线程
ps -eLf
# LWP(线程 ID)列

3.2 top

top
# 进入交互:
# - P:按 CPU 排序
# - M:按内存排序
# - T:按时间排序
# - 1:展开多核 CPU
# - c:显示完整命令行
# - V:森林视图(进程树)
# - k:kill 进程
# - r:renice

# 一次性输出,不进入交互
top -bn1 | head -20

# 字段含义:
# %CPU:CPU 占用
# %MEM:内存占用
# VSZ:虚拟内存大小
# RSS:实际物理内存
# STAT:状态
#   R:运行
#   S:睡眠(可中断)
#   D:不可中断睡眠(等 IO)
#   Z:僵尸
#   T:停止
#   I:空闲
#   <:高优先级
#   N:低优先级
#   L:有锁页在内存
#   s:会话首进程
#   +:前台进程组

3.3 htop

yum install -y htop

htop
# 比 top 直观,鼠标可点
# - F2:配置
# - F3:搜索
# - F4:过滤
# - F5:树状
# - F6:排序列
# - F9:kill
# - F10:退出

3.4 pidof / pgrep / pkill

# 找 PID
pidof nginx
# 1234 5678

pgrep -f nginx
# 按命令行匹配

pgrep -u mysql mysqld
# 按用户匹配

# 杀进程
pkill nginx
# 杀所有 nginx

pkill -9 -f "python.*app.py"
# -9:SIGKILL
# -f:按命令行

# 慎用 pkill 模糊匹配,可能误杀

3.5 kill

# 信号
# 1 SIGHUP:重新加载配置(nginx -s reload)
# 2 SIGINT:中断(Ctrl+C)
# 9 SIGKILL:强制杀
# 15 SIGTERM:优雅退出(默认)
# 18 SIGCONT:继续
# 19 SIGSTOP:暂停

kill <pid>
# 优雅退出,给进程清理时间

kill -9 <pid>
# 强制杀,可能丢数据

# 按进程名
killall nginx
pkill nginx

# 杀指定用户进程
pkill -u username

# 列所有信号
kill -l

风险提示:kill -9 是高危命令,会跳过进程的清理逻辑:

  • 数据库可能丢未提交事务。
  • 应用可能丢未刷盘的日志。
  • 文件可能丢未关闭的句柄。

3.6 nice / renice

# 调整进程优先级
# nice 范围 -20 ~ 19,-20 最高
# 普通用户只能 0 ~ 19
# root 可以 -20 ~ 19

# 启动时设优先级
nice -n 10 python3 backup.py

# 调整已运行进程
renice -n -5 -p 1234
# 把 PID 1234 的优先级调为 -5

# 看进程的 nice
top
# NI 列

3.7 systemctl

# 服务管理
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
# 重新加载配置,不中断(nginx / haproxy 支持)

systemctl status nginx
# 看服务状态、日志、PID

systemctl enable nginx
# 开机自启

systemctl disable nginx
# 禁用开机自启

systemctl is-active nginx
# 是否在运行

systemctl is-enabled nginx
# 是否开机自启

systemctl list-units --type=service
# 列出所有 service

systemctl list-units --state=failed
# 看失败的服务

systemctl mask nginx
# 禁用服务(连手动起都起不来)

systemctl daemon-reload
# 重载 systemd 配置

风险提示:systemctl mask 会创建 /dev/null 软链,禁用后连 systemctl start 都起不来。要恢复用 systemctl unmask

四、CPU 命令

4.1 lscpu

lscpu
# Architecture:          x86_64
# CPU op-mode(s):        32-bit, 64-bit
# Byte Order:            Little Endian
# CPU(s):                16
# On-line CPU(s) list:   0-15
# Thread(s) per core:    2
# Core(s) per socket:    8
# Socket(s):             1
# NUMA node(s):          2
# ...
# 16 核、超线程、2 个 NUMA node

4.2 mpstat

yum install -y sysstat

mpstat -P ALL 1
# -P ALL:所有 CPU
# 1:1 秒一次
# 14:30:00  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
# 14:30:01  all    5.00    0.00    2.00    1.00    0.00    0.00    0.00    0.00   92.00
# 14:30:01    0    6.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   92.00
# ...

# 关键:
# %usr:用户态
# %sys:内核态
# %iowait:等 IO
# %idle:空闲
# %steal:被虚拟化偷走的时间

4.3 sar -u

sar -u 1 5
# CPU 利用率,1 秒一次取 5 次

# 看历史(需要 sysstat 收集器)
sar -u -f /var/log/sa/sa13
# 看 13 号的 CPU 历史

4.4 turbostat

# 看 CPU 频率、C-state、实际跑的频率
yum install -y kernel-tools

turbostat --interval 5
# 5 秒一次输出

# 关键:
# Avg_MHz:实际平均频率
# Bzy_MHz:忙时的频率
# TSC_MHz:标称频率
# 如果 Avg_MHz 远低于 TSC_MHz,CPU 在节电,可能影响性能

4.5 perf

yum install -y perf

# top 类似
perf top
# 默认按调用栈展示热点函数
# -g:显示调用栈

# 录 10 秒
perf record -a -g sleep 10
perf report
# 看报告

# 看指定进程
perf top -p <pid>

# 看 cache miss
perf stat -e cache-misses,cache-references -p <pid> sleep 5

风险提示:perf record -a 在生产慎用,会记录所有 CPU 事件,存储压力很大。

五、内存命令

5.1 free

free -h
#               total        used        free      shared  buff/cache   available
# Mem:            62G         20G        30G        1.0G         12G         40G
# Swap:          4.0G        100M        3.9G

# 关键:
# total:总内存
# used:已用(不含 buff/cache)
# free:完全空闲
# shared:共享内存(/dev/shm)
# buff/cache:页缓存和 buffer
# available:实际可用(free + 可回收的 buff/cache)

5.2 /proc/meminfo

cat /proc/meminfo
# MemTotal:       65876988 kB
# MemFree:        31457280 kB
# MemAvailable:   41943040 kB
# Buffers:         1024000 kB
# Cached:         10240000 kB
# SwapCached:            0 kB
# Active:         12345678 kB
# Inactive:        5678900 kB
# Dirty:             12345 kB
# Writeback:             0 kB
# AnonPages:      15728640 kB
# Mapped:           524288 kB
# ...

# 关键:
# Dirty:脏页(待写盘)
# Writeback:正在写盘的页
# AnonPages:匿名页(堆、栈)
# Mapped:被 mmap 的文件页

5.3 slabtop

slabtop
# 看内核 slab 分配器的占用
# 排查内核内存泄漏常用

# top 字段:
# OBJS:对象数
# ACTIVE:活跃对象
# USE:每个对象大小
# SIZE:总大小

5.4 smem

yum install -y smem

smem -tk
# 按 RSS / PSS / USS 排序
# PSS(Proportional Set Size)更准确,多进程共享的库按比例算

# 看指定用户
smem -u mysql

# 看指定进程
smem -p <pid>

5.5 pmap

# 看进程内存映射
pmap -x <pid>
# Address           Kbytes     RSS   Dirty Mode  Mapping
# 00007f1234000000   524288  524288       0 r-x-- libmysqlclient.so.21.0.30
# 00007f1246000000      128     128       0 r-x-- [vdso]
# ...

# 看内存峰值
pmap -x <pid> | tail -1
#  total kB         524288   524288       0

5.6 numastat

yum install -y numactl

numastat -m
# 看 NUMA 节点内存分配
# 跨 NUMA 访问性能差,要避免
# Per-node numastat 0
#                    Node 0     Node 1
# Numa_Hit         12345678  12345678
# Numa_Miss             1234      5678
# Foreign                 0         0
# Interleave_Hit     123456    123456
# Local_Node       12000000  12000000
# Other_Node          12345    12345

六、网络命令

6.1 ip

# 替代 ifconfig
ip a
# 看所有 IP
ip addr show eth0

ip link show
# 看链路状态

ip r
# 看路由表

ip route get 8.8.8.8
# 查具体走哪条路由

# 加 IP
ip addr add 10.20.0.20/24 dev eth0

# 删 IP
ip addr del 10.20.0.20/24 dev eth0

# 起 / 关网卡
ip link set eth0 up
ip link set eth0 down

# 加路由
ip route add 192.168.0.0/16 via 10.20.0.1

# 删路由
ip route del 192.168.0.0/16 via 10.20.0.1

6.2 ss

# 替代 netstat
ss -tunap
# -t:TCP
# -u:UDP
# -n:数字(不解析服务名)
# -a:所有
# -p:显示进程

# 看监听端口
ss -tlnp

# 看连接数
ss -s
# TCP:   100 (estab 80, closed 10, orphaned 0, timewait 5)
# ...

# 看 timewait
ss -tan state time-wait | wc -l

# 看 established
ss -tan state established | wc -l

# 按状态统计
ss -tan | awk 'NR>1{print $1}' | sort | uniq -c

6.3 netstat

# 还能用,但推荐迁到 ss
netstat -tunlp
netstat -an | grep ESTABLISHED | wc -l
netstat -s
# 各种协议统计

6.4 curl

# HTTP 调试
curl -v https://example.com
# -v:详细

curl -X POST -d "key=value" https://api.example.com/users
curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' https://api.example.com/users
curl -H "Authorization: Bearer xxx" https://api.example.com

# 看响应头
curl -I https://example.com

# 保存文件
curl -O https://example.com/file.zip
curl -o file.zip https://example.com/file.zip

# 限速
curl --limit-rate 1m -O https://example.com/bigfile.iso

# 走代理
curl -x http://proxy.example.com:8080 https://example.com

# 测速
curl -o /dev/null -s -w "time_total: %{time_total}\n" https://example.com

# 多次请求
curl -o /dev/null -s -w "%{time_total}\n" -H 'Cache-Control: no-cache' https://example.com/api
# 拿 P50 / P99
for i in {1..100}; do
    curl -o /dev/null -s -w "%{time_total}\n" https://example.com/api
done | sort -n | awk '{a[NR]=$1}END{print "P50:" a[int(NR*0.5)]; print "P99:" a[int(NR*0.99)]}'

6.5 wget

# 下载
wget https://example.com/file.zip

# 断点续传
wget -c https://example.com/bigfile.iso

# 限速
wget --limit-rate=1m https://example.com/bigfile.iso

# 镜像整个网站
wget -m -p -k https://example.com

# 整页保存
wget -p -k -E -np https://example.com/page.html

6.6 tcpdump

# 抓包
tcpdump -i eth0
# 指定网卡

tcpdump -i eth0 port 80
# 端口过滤

tcpdump -i eth0 host 10.20.0.10
# 主机过滤

tcpdump -i eth0 src 10.20.0.10
# 源 IP 过滤

tcpdump -i eth0 dst port 6379
# 目标端口

tcpdump -i eth0 -w capture.pcap
# 保存到文件
tcpdump -r capture.pcap
# 读取文件

# 抓 HTTP 请求
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

# 抓 DNS
tcpdump -i eth0 port 53

# 看 TCP 握手
tcpdump -i eth0 -nn -S 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0'

风险提示:tcpdump 在生产慎用,可能捕获敏感信息(密码、token)。抓包文件要妥善保管。

6.7 iftop

yum install -y iftop

iftop -i eth0
# 实时看网络流量
# -i:网卡
# -n:不解析 IP
# -N:不解析端口
# -B:以 byte/s 显示

# 看本机 IP 的流量
iftop -i eth0 -f "src host 10.20.0.10"

6.8 nethogs

yum install -y nethogs

nethogs eth0
# 按进程看网络流量
# 看到哪个进程在狂用带宽

6.9 mtr

yum install -y mtr

mtr -r 8.8.8.8
# -r:report 模式
# 输出到目的地每一跳的丢包率 / 延迟

# 持续
mtr 8.8.8.8
# Ctrl+C 退出

# 看 TCP 路径
mtr --tcp example.com

6.10 traceroute

traceroute 8.8.8.8
# 看路由路径

# 走 TCP
traceroute -T example.com

# 走 ICMP
traceroute -I example.com

6.11 nc(netcat)

# 测端口
nc -zv 10.20.0.10 80
# -z:只测端口不开连接
# -v:详细

# 监听端口(调试用)
nc -l 12345

# 发送数据
echo"hello" | nc 10.20.0.10 12345

# 文件传输
# 接收端
nc -l 12345 > file
# 发送端
nc 10.20.0.10 12345 < file

# 端口扫描
nc -zv 10.20.0.10 20-30

风险提示:nc 监听端口可能带来安全风险,生产慎用。

6.12 ethtool

# 看网卡信息
ethtool eth0

# 看网卡驱动
ethtool -i eth0

# 看网卡 ring buffer
ethtool -g eth0

# 看网卡统计
ethtool -S eth0

# 改网卡速率(高危)
# ethtool -s eth0 speed 1000 duplex full autoneg off
# 不建议临时改

6.13 sar 网络

# 实时
sar -n DEV 1
# -n DEV:网卡流量
# IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
# eth0     1234.00   5678.00   100.00    500.00      0.00      0.00      0.00      0.00

# TCP / ETCP
sar -n TCP,ETCP 1
# active/s:每秒主动建立连接
# passive/s:每秒被动接受连接
# retrans/s:每秒重传

# 历史
sar -n DEV -f /var/log/sa/sa13

七、磁盘命令

7.1 df

df -h
# 人性化单位

df -i
# 看 inodes

df -T
# 看文件系统类型

df --total
# 汇总

7.2 du

du -sh /*
# 各级目录大小

du -sh /var/log/*
# 详细目录

du -h --max-depth=1 /var/log
# 限制深度

# 排序
du -sh /var/log/* | sort -h | tail

# 排除
du -sh --exclude='*.log' /var

# 看大于 1G 的文件
find / -type f -size +1G -exec du -sh {} \; 2>/dev/null | sort -h

7.3 lsblk

lsblk
# 块设备树状结构

lsblk -f
# 看文件系统、UUID

lsblk -d -o NAME,SIZE,MODEL,ROTA,TRAN
# 看物理盘类型

lsblk -o NAME,SIZE,USED,AVAIL,FSTYPE,MOUNTPOINT,UUID
# 详细

7.4 mount / umount

mount
# 看所有挂载

mount | grep sda
# 过滤

mount -o remount,rw /data
# 重新挂载

mount -t nfs 10.20.0.100:/nfs /mnt/nfs

umount /data
# 卸

umount -f /data
# 强制

fuser -m /data
# 看谁在用

7.5 iostat

iostat -xz 1
# -x:扩展
# -z:忽略 0 活动
# 1:1 秒一次
# 输出每个设备的 r/s、w/s、rkB/s、wkB/s、await、%util 等

7.6 iotop

iotop
# 按进程看 IO

iotop -ao
# -a:累计
# -o:只显示有 IO 的进程

7.7 fuser

# 看谁在用这个文件 / 目录
fuser -m /data
# 列出 PID

# 杀占用
fuser -km /data
# -k:杀
# -m:挂载点
# 风险:会 kill 占用进程,先确认

7.8 lsof

# 看进程开了哪些文件
lsof -p <pid>

# 看谁在用这个文件
lsof /var/log/messages

# 看谁在用这个目录
lsof +D /data

# 看谁占用端口
lsof -i :80

# 看 TCP 连接
lsof -i tcp

八、文件命令

8.1 find

# 按名字
find / -name "*.log"

# 按类型
find / -type f -name "*.log"
# -type f:文件
# -type d:目录
# -type l:软链

# 按大小
find / -type f -size +1G
# +1G:大于 1G
# -1G:小于 1G

# 按时间
find / -type f -mtime +7
# mtime +7:7 天前修改
# mtime -7:7 天内修改
# mtime 7:刚好 7 天
# atime:访问时间
# ctime:变化时间

# 按用户
find / -user mysql

# 按权限
find / -perm 777

# 执行操作
find / -name "*.log" -exec rm {} \;
# 注意 \; 转义
# 或者用 + 减少 fork
find / -name "*.log" -exec rm {} +

# 限制深度
find / -maxdepth 3 -name "*.log"

# 多个条件
find / -type f \( -name "*.log" -o -name "*.tmp" \)
# 找 .log 或 .tmp

# 排除目录
find / -path "/proc" -prune -o -name "*.log" -print

# 输出格式
find / -name "*.log" -printf"%s %p\n"
# 打印大小 路径

# 找大文件并排序
find / -type f -size +100M -exec du -h {} \; 2>/dev/null | sort -hr | head -20

8.2 locate

yum install -y mlocate
updatedb
# 建索引(生产慎用,扫全盘 IO 大)

locate nginx.conf
# 快速找

# 局限:updatedb 之后新增的文件找不到
# 优势:比 find 快得多

8.3 stat

stat file.txt
# File: file.txt
# Size: 1234            Blocks: 8          IO Block: 4096   regular file
# Access: 2026-06-13 14:00:00.000000000 +0800
# Modify: 2026-06-13 14:00:00.000000000 +0800
# Change: 2026-06-13 14:00:00.000000000 +0800
# Birth: 2026-06-13 14:00:00.000000000 +0800

8.4 file

file file.txt
# 看文件类型

file -i file.txt
# 看 MIME

8.5 tree

yum install -y tree

tree /data
# 树状结构

tree -L 2 /data
# 限制 2 层

tree -h /data
# 人性化大小

tree -I "*.log|cache" /data
# 排除

8.6 chmod / chown

# 权限
chmod 755 file
# 7:rwx
# 6:rw-
# 5:r-x
# 4:r--
# 3:-wx
# 2:-w-
# 1:--x
# 0:---

# 字母模式
chmod u+x file  # 用户加执行
chmod g+w file  # 组加写
chmod o-r file  # 其他去读
chmod a+x file  # 所有人加执行

# 递归
chmod -R 755 /data

# 风险提示:chmod -R 777 / 是灾难性操作,会破坏系统安全

# 属主
chown mysql:mysql file
chown -R mysql:mysql /data

# 改组
chown :mysql file

8.7 ln

# 软链
ln -s /data/file.txt /tmp/file.txt

# 硬链
ln /data/file.txt /tmp/file.txt

# 软链常用场景:
# - 链接到当前版本的代码
# - 链接到日志目录

# 看软链指向
readlink /tmp/file.txt
# /data/file.txt

8.8 rsync

# 本地同步
rsync -av /src/ /dst/
# 末尾 / 表示目录内容
# 不带 / 表示目录本身

# 远程同步
rsync -av /src/ user@remote:/dst/

# 排除
rsync -av --exclude='*.log' /src/ /dst/

# 断点续传
rsync -avP /src/ user@remote:/dst/

# 删除目标多余文件(同步删除)
rsync -av --delete /src/ /dst/
# 风险:--delete 目标端多出来的文件会被删,先 dry-run

# dry-run
rsync -avn --delete /src/ /dst/

# 限速
rsync -av --bwlimit=10m /src/ user@remote:/dst/

# 走 ssh key
rsync -av -e "ssh -i /root/.ssh/id_rsa" /src/ user@remote:/dst/

8.9 scp

# 上传
scp file.txt user@remote:/data/

# 下载
scp user@remote:/data/file.txt /tmp/

# 目录
scp -r /data/dir user@remote:/data/

# 限速
scp -l 1000 file.txt user@remote:/data/
# -l 1000:限 1000 Kbit/s

# 走 key
scp -i /root/.ssh/id_rsa file.txt user@remote:/data/

8.10 tar

# 打包
tar -cvf archive.tar /data
# -c:创建
# -v:详细
# -f:文件

# 解包
tar -xvf archive.tar

# 看内容不解
tar -tvf archive.tar

# gzip 压缩
tar -czvf archive.tar.gz /data
# -z:gzip

# 解 gzip
tar -xzvf archive.tar.gz

# bzip2 压缩
tar -cjvf archive.tar.bz2 /data
# -j:bzip2

# xz 压缩(最高压缩比)
tar -cJvf archive.tar.xz /data
# -J:xz

# 解到指定目录
tar -xvf archive.tar -C /dst/

# 排除
tar --exclude='*.log' -czvf archive.tar.gz /data

8.11 zip / unzip

# 压
zip -r archive.zip /data

# 解
unzip archive.zip

# 解到指定目录
unzip archive.zip -d /dst/

# 看内容
unzip -l archive.zip

# 排除
zip -r archive.zip /data -x "*.log"

九、日志命令

9.1 tail

# 看文件尾
tail file.log
# 默认 10 行

tail -n 100 file.log
# 100 行

tail -f file.log
# 实时跟踪(ctrl+c 退出)

tail -F file.log
# -F:跟踪 + 重试(文件被删重建也能继续追)
# 强烈推荐 -F

9.2 less / more

# 翻页查看
less file.log
# 空格下一页,b 上一页,/搜索,q 退出

# 打开就跳到尾
less +F file.log
# 类似 tail -f

# 多个文件
less file1.log file2.log
# :n 下一个,:p 上一个

9.3 grep

# 基础
grep "error" file.log
# 找含 error 的行

# 多个文件
grep "error" *.log
grep -r "error" /var/log/

# 大小写不敏感
grep -i "error" file.log

# 上下文
grep -A 5 "error" file.log
# -A 5:后面 5 行
grep -B 5 "error" file.log
# -B 5:前面 5 行
grep -C 5 "error" file.log
# -C 5:前后各 5 行

# 反选
grep -v "info" file.log
# 不含 info

# 计数
grep -c "error" file.log

# 行号
grep -n "error" file.log

# 正则
grep -E "ERROR|WARN" file.log
# 等价于 egrep
grep -E "192\.168\.[0-9]+\.[0-9]+" file.log
# 匹配 IP

# 限制目录
grep -r --include="*.log""error" /var/log/

# 排除目录
grep -r --exclude-dir=".git""TODO" /src/

# 统计
grep -c "error" /var/log/*.log

9.4 awk

# 基础
awk '{print $1}' file.log
# 打印第一列

awk '{print $1, $3}' file.log
# 打印第 1 和 3 列

# 自定义分隔符
awk -F: '{print $1}' /etc/passwd
# /etc/passwd 用 : 分隔

# 条件
awk '$3 > 100 {print $1}' file.log

# 多个分隔符
awk -F'[:,]''{print $1, $3}' file.log

# 计数
awk '{count++} END {print count}' file.log

# 求和
awk '{sum += $1} END {print sum}' file.log

# 复杂条件
awk '$3 > 100 && $4 == "OK" {print $0}' file.log

# BEGIN / END
awk 'BEGIN {print "start"} {print $1} END {print "end"}' file.log

# 关联数组
awk '{count[$1]++} END {for (k in count) print k, count[k]}' file.log
# 按第一列分组计数

# 处理 nginx access log
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head
# 访问 IP 排行

9.5 sed

# 替换
sed 's/old/new/' file.log
# 替换每行第一个

sed 's/old/new/g' file.log
# 替换所有

sed -i 's/old/new/g' file.log
# 直接改文件
# 风险:-i 不可逆,先备份或先输出

# 删行
sed '/pattern/d' file.log
# 删含 pattern 的行

sed '5d' file.log
# 删第 5 行

sed '5,10d' file.log
# 删 5-10 行

# 打印
sed -n '5,10p' file.log
# 打印 5-10 行

# 多个命令
sed -e 's/old/new/g' -e '/^$/d' file.log

# 直接改文件
sed -i.bak 's/old/new/g' file.log
# 备份为 file.log.bak

# 行尾添加
sed 's/$/ END/' file.log

# 行首添加
sed 's/^/START /' file.log

# 提取行
sed -n '/start/,/end/p' file.log
# 提取 start 到 end 之间的行

风险提示:sed -i 是直接改文件,不可逆。先备份或先验证:

# 安全做法
sed 's/old/new/g' file.log > newfile.log
# 确认 OK 再覆盖
mv newfile.log file.log

9.6 journalctl

# 看 systemd 日志
journalctl

# 跟某个服务
journalctl -u nginx

# 实时跟踪
journalctl -u nginx -f

# 时间范围
journalctl --since "1 hour ago"
journalctl --since "2026-06-13 14:00" --until "2026-06-13 15:00"

# 优先级
journalctl -p err
# -p err:只显示 err 及以上
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug

# 内核日志
journalctl -k

# 看启动日志
journalctl -b
# -b -1:上次启动
# -b -2:上上次

# 占用
journalctl --disk-usage

# 清理
journalctl --vacuum-time=7d
journalctl --vacuum-size=500M

9.7 dmesg

# 内核日志
dmesg

# 实时
dmesg -w

# 时间戳
dmesg -T

# 看指定级别
dmesg --level=err,crit,alert,emerg

# 看 OOM
dmesg | grep -i "out of memory"

# 看网卡
dmesg | grep -i eth

9.8 logrotate

# 手动跑
logrotate -f /etc/logrotate.conf
# -f:强制跑(即使没到时间)

# 看配置
cat /etc/logrotate.d/nginx

# 验证配置
logrotate -d /etc/logrotate.conf
# -d:debug,不真转

十、用户与权限命令

10.1 useradd / usermod / userdel

# 加用户
useradd -m -s /bin/bash username
# -m:建 home
# -s:指定 shell

# 改用户
usermod -aG sudo username
# 加 sudo 组
# 注意 -a 不能漏,否则覆盖

# 改 shell
usermod -s /bin/zsh username

# 锁用户
usermod -L username

# 删用户
userdel -r username
# -r:连带 home

10.2 passwd / chage

# 改密码
passwd username

# 强制定期改
chage -M 90 username
# 90 天

# 立即过期
chage -d 0 username

# 看密码策略
chage -l username

10.3 groupadd / gpasswd

groupadd developers

# 加成员
gpasswd -a username developers

# 删成员
gpasswd -d username developers

# 看用户组
id username
groups username

10.4 su / sudo

# 切用户
su - username
# 加载环境变量

# 跑单条命令
sudo -u mysql /usr/bin/mysqld --version

# 看 sudo 权限
sudo -l

10.5 visudo

# 改 sudo 配置
visudo
# 用 visudo 而不是直接 vim,会检查语法

# 加一条
username ALL=(ALL) NOPASSWD: ALL
# ALL 主机
# (ALL) 用户
# NOPASSWD:免密

风险提示:username ALL=(ALL) NOPASSWD: ALL 给某个用户全 sudo 免密,等于 root。

十一、服务管理

11.1 systemd 服务

# 服务文件位置
/etc/systemd/system/
/usr/lib/systemd/system/

# 自定义服务
cat > /etc/systemd/system/myapp.service << 'EOF'
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/main.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start myapp
systemctl enable myapp

11.2 systemd-analyze

# 看启动耗时
systemd-analyze

# 看每个服务耗时
systemd-analyze blame

# 关键路径
systemd-analyze critical-chain

# 启动图
systemd-analyze plot > /tmp/boot.svg
# 浏览器打开 /tmp/boot.svg

11.3 journalctl 过滤

见 9.6。

十二、包管理

12.1 yum / dnf(RHEL/CentOS)

# 装
yum install -y nginx
yum install -y epel-release

# 卸
yum remove nginx

# 升级
yum update
yum update nginx

# 查包
yum search nginx
yum list | grep nginx
yum info nginx

# 看已装
yum list installed
yum list installed | grep nginx

# 查某个文件属于哪个包
yum provides /usr/bin/htop

# 清理
yum clean all
yum makecache

# 仓库
yum repolist
yum-config-manager --enable epel

# 锁定版本
yum install -y yum-plugin-versionlock
yum versionlock nginx-1.20.1-1.el7

12.2 apt(Ubuntu/Debian)

# 装
apt-get install -y nginx

# 卸
apt-get remove nginx
apt-get purge nginx
# purge:连配置一起删

# 升级
apt-get update
apt-get upgrade
apt-get dist-upgrade
# dist-upgrade 允许替换依赖关系

# 查包
apt-cache search nginx
apt list --installed

# 查文件
apt-file search /usr/bin/htop
# 没装先装 apt-file
# apt-get install -y apt-file
# apt-file update

# 锁版本
apt-mark hold nginx
apt-mark unhold nginx

12.3 rpm

# 装
rpm -ivh package.rpm
# -i:install
# -v:verbose
# -h:进度

# 卸
rpm -e nginx

# 升级
rpm -Uvh package.rpm

# 查
rpm -qa
rpm -qa | grep nginx

# 看包详情
rpm -qi nginx

# 看包文件
rpm -ql nginx

# 查文件属于哪个包
rpm -qf /usr/bin/htop

12.4 dpkg

# 装
dpkg -i package.deb

# 卸
dpkg -r nginx
dpkg -P nginx
# -P:purge,连配置

# 查
dpkg -l
dpkg -l | grep nginx

# 查包文件
dpkg -L nginx

# 查文件属于哪个包
dpkg -S /usr/bin/htop

十三、定时任务

13.1 crontab

# 编辑
crontab -e
# 用户级 crontab

# 看
crontab -l

# 删
crontab -r
# 风险:直接删整张表,慎用

# 系统级
/etc/crontab
/etc/cron.d/
/etc/cron.daily/
/etc/cron.hourly/
/etc/cron.weekly/
/etc/cron.monthly/

crontab 格式:

# 分 时 日 月 周 命令
# 0 2 * * * /opt/backup.sh
# */5 * * * * /opt/check.sh
# 0 0 * * 0 /opt/weekly.sh
# 30 9 * * 1-5 /opt/workday.sh

13.2 flock 防重入

# 防止脚本并发跑
* * * * * flock -n /tmp/mytask.lock -c "python3 /opt/mytask.py"
# -n:拿不到锁就放弃
# /tmp/mytask.lock:锁文件
# -c:跟命令

# 锁文件位置
# -w /var/lock/mytask.lock

# 写法
flock -n /var/lock/mytask.lock python3 /opt/mytask.py

13.3 at

# 一次性定时
echo "command" | at 14:30
echo "command" | at now + 5 minutes
echo "command" | at 2026-06-15

# 看队列
atq

# 删
atrm <job-id>

13.4 systemd-timer

更现代的定时方式:

# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup

[Timer]
OnCalendar=daily
OnCalendar=Mon..Fri 02:00
Persistent=true

[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Unit]
Description=Backup

[Service]
ExecStart=/opt/backup.sh
systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers

十四、性能分析命令

14.1 strace

yum install -y strace

# 跟踪进程
strace -p <pid>

# 跟踪新进程
strace command

# 看系统调用
strace -p <pid> -e trace=network
# -e trace=network:只看网络相关
# -e trace=open,read,write:看文件操作
# -e trace=memory:内存相关

# 统计系统调用
strace -p <pid> -c

# 看时间
strace -p <pid> -t

# 输出到文件
strace -p <pid> -o /tmp/strace.log

风险提示:strace 在生产慎用,会让进程变慢,且高并发场景下日志会爆。

14.2 ltrace

yum install -y ltrace

# 跟踪库调用
ltrace -p <pid>

# 跟指定库
ltrace -p <pid> -l "libssl*"

14.3 perf

见 4.5。

14.4 bcc 工具

# 装(需要 kernel-devel)
yum install -y bcc-tools

# 工具位置
ls /usr/share/bcc/tools/
# biolatency  tcpconnect  opensnoop  ...

# biolatency:块设备 IO 延迟
/usr/share/bcc/tools/biolatency 1 10
# 输出 latency 分布

# tcpconnect:实时 TCP 连接
/usr/share/bcc/tools/tcpconnect
# 看谁在连谁

# opensnoop:跟踪 open 系统调用
/usr/share/bcc/tools/opensnoop
# 看哪些文件被打开

# execsnoop:跟踪 exec
/usr/share/bcc/tools/execsnoop
# 看哪些进程被启动

# capable:跟踪 capability 检查
/usr/share/bcc/tools/capable

14.5 bpftrace

yum install -y bpftrace

# 简单 one-liner
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'

# 看进程执行的命令
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s -> %s\n", comm, str(args->filename)); }'

风险提示:bcc / bpftrace 在生产慎用,可能导致性能波动。

十五、文本三剑客

15.1 xargs

# 把 stdin 转成命令参数
echo"a b c" | xargs -n 1 echo
# a
# b
# c
# -n 1:每次传 1 个参数

# 删 .log 文件
find . -name "*.log" | xargs rm

# 用 -I 替换
find . -name "*.log" | xargs -I {} mv {} /backup/

# 限制并发
find . -name "*.txt" | xargs -P 4 -I {} cp {} /dst/
# -P 4:4 个并发

15.2 sort

# 排序
sort file

# 数字排序
sort -n file

# 倒序
sort -rn file

# 按列
sort -k 2 file
# 按第 2 列

# 去重
sort -u file

# human-readable 排序
sort -h file
# 1K, 2M, 3G

15.3 uniq

# 去重(要求已排序)
sort file | uniq

# 计数
sort file | uniq -c | sort -rn
# 出现次数排行

# 看重复
sort file | uniq -d

# 看非重复
sort file | uniq -u

15.4 cut

# 按列
cut -d: -f1 /etc/passwd
# -d:分隔符
# -f:取第几列

# 按字符
cut -c1-10 file
# 取每行 1-10 字符

15.5 tr

# 替换
echo "hello" | tr 'a-z' 'A-Z'
# HELLO

# 删字符
echo "hello 123" | tr -d '0-9'
# hello

# 压缩重复
echo "hello      world" | tr -s ' '
# hello world

15.6 column

# 对齐输出
mount | column -t

# 自定义分隔符
cat /etc/passwd | column -t -s:

15.7 paste

# 合并两个文件
paste file1 file2
# 1行 file1 1行 file2 拼一起

# 自定义分隔符
paste -d'|' file1 file2

15.8 diff / comm

# diff
diff file1 file2

# 统一格式
diff -u file1 file2
# 生成 patch

# comm
comm file1 file2
# 三列:只在 file1、只在 file2、共有

# 抑制某列
comm -23 file1 file2
# 只看 file1 独有的
comm -13 file1 file2
# 只看 file2 独有的

十六、实用工具

16.1 tmux

yum install -y tmux

# 新建 session
tmux new -s mysession

# 分离
# Ctrl+b d

# 列 session
tmux ls

# 重新连接
tmux attach -t mysession

# 快捷键
# Ctrl+b c:新建 window
# Ctrl+b n / p:next / prev window
# Ctrl+b ":水平分屏
# Ctrl+b %:垂直分屏
# Ctrl+b 方向键:切换 pane
# Ctrl+b x:关闭 pane
# Ctrl+b [:进入复制模式(PgUp/PgDn 翻页)
# Ctrl+b ]:粘贴
# Ctrl+b ?:帮助

16.2 screen

yum install -y screen

# 新建
screen -S mysession

# 分离
# Ctrl+a d

# 列
screen -ls

# 重新连接
screen -r mysession

16.3 glances

yum install -y glances

glances
# 综合监控
# CPU / 内存 / 网络 / 磁盘 / 进程 / 传感器 / 文件系统
# 支持 web 模式
glances -w

# 输出到文件
glances --export csv --export-csv-file /tmp/glances.csv

16.4 dstat

yum install -y dstat

# 组合输出
dstat -cdngym 1
# c: cpu
# d: disk
# n: net
# g: page
# y: sys
# m: mem

# 高级
dstat --top-cpu --top-io --top-mem 1

16.5 nmon

# 下载
wget http://sourceforge.net/projects/nmon/files/nmon16e_mpginc.tar.gz
tar xzf nmon16e_mpginc.tar.gz
chmod +x nmon_x86_64_rhel7
mv nmon_x86_64_rhel7 /usr/local/bin/nmon

# 跑
nmon
# 进入交互
# c:CPU
# m:内存
# d:磁盘
# n:网络
# t:top 进程
# h:帮助

# 录数据
nmon -f -s 5 -c 60
# -f:文件
# -s 5:5 秒一次
# -c 60:录 60 次 = 5 分钟
# 输出 hostname_YYMMDD_HHMM.nmon 文件
# 用 nmon analyser 打开(Windows 工具)

16.6 sysstat

sysstat 是一组工具的集合:

  • iostat:磁盘 IO
  • mpstat:CPU
  • pidstat:进程
  • sar:系统活动
  • sadc:数据收集器
  • sa1 / sa2:cron 跑的脚本
# 启用历史收集
vim /etc/cron.d/sysstat
# 取消这行注释
# */5 * * * * root /usr/lib64/sa/sa1 1 1

# 启用 sadc
systemctl enable sysstat
systemctl start sysstat

# 看历史
ls /var/log/sa/
# sa13: 二进制
# sar13: 文本

sar -u -f /var/log/sa/sa13
sar -d -f /var/log/sa/sa13
sar -r -f /var/log/sa/sa13
sar -n DEV -f /var/log/sa/sa13

十七、SSH 与远程

17.1 ssh

# 登录
ssh user@host

# 指定端口
ssh -p 2222 user@host

# 跑命令
ssh user@host "ls /tmp"

# 传文件
scp file user@host:/tmp/

# 免密登录
ssh-keygen -t rsa -b 4096
ssh-copy-id user@host

# 跳板
ssh -J user@jumphost user@dest

# 端口转发
# 本地转发
ssh -L 8080:remote-host:80 user@host
# 访问本地 8080 转到 remote-host:80

# 远程转发
ssh -R 8080:localhost:80 user@host
# 远程访问 host:8080 转到本地 80

# 动态转发(SOCKS 代理)
ssh -D 1080 user@host
# 本地 1080 起 SOCKS 代理

17.2 ssh config

vim ~/.ssh/config
# Host prod-redis
#     HostName 10.20.0.11
#     User deploy
#     Port 22
#     IdentityFile ~/.ssh/id_rsa

# 之后直接
ssh prod-redis

17.3 ssh-agent

# 启动 agent
eval $(ssh-agent)

# 加 key
ssh-add ~/.ssh/id_rsa

# 看
ssh-add -l

# 锁
ssh-add -x

# 解锁
ssh-add -X

十八、网络调试命令

18.1 ping / ping6

# 测连通
ping 8.8.8.8

# 限次
ping -c 5 8.8.8.8

# 限时间
ping -w 10 8.8.8.8

# IPv6
ping6 ipv6.google.com

18.2 host / dig / nslookup

# 简单查
host example.com
# example.com has address 93.184.216.34

# dig
dig example.com
dig example.com +short
dig @8.8.8.8 example.com
# 指定 DNS

# 反向
dig -x 8.8.8.8

# MX 记录
dig example.com MX

# 跟踪
dig +trace example.com

# nslookup(老的)
nslookup example.com

18.3 telnet

# 测端口
telnet 10.20.0.10 80
# 连上说明端口通
# 风险提示:telnet 传明文,生产慎用

# 替代用 nc
nc -zv 10.20.0.10 80

十九、运维实战套路

19.1 排查一个慢请求

# 1. 看进程(CPU 高的)
top -c
# 找到 PID

# 2. 看进程详情
ps -p <pid> -o pid,ppid,user,stat,pcpu,pmem,vsz,rss,etime,cmd

# 3. 看进程 IO
pidstat -d -p <pid> 1

# 4. 看进程打开的文件
lsof -p <pid>

# 5. 看进程系统调用
strace -p <pid> -c
# 统计
strace -p <pid>
# 实时

# 6. 看进程内存
pmap -x <pid>

# 7. 看进程网络连接
ss -tnp | grep <pid>

# 8. 看应用日志
tail -F /var/log/app.log

19.2 找占用端口的进程

# 1. 看端口
ss -tlnp | grep 80
# LISTEN 0  128  *:80  *:*  users:(("nginx",pid=1234,fd=6))

# 2. 看进程
lsof -i :80

# 3. 找到 PID 后看进程
ps -p 1234 -o cmd

# 4. 找到配置文件
ls -l /proc/1234/cwd
# 进程工作目录

19.3 找大文件

# 1. 看磁盘
df -h
# 找满的盘

# 2. 看大目录
du -sh /* 2>/dev/null | sort -h | tail

# 3. 看大目录的子目录
du -sh /var/* | sort -h | tail

# 4. 看具体大文件
find / -type f -size +1G 2>/dev/null -exec ls -lh {} \;
find / -type f -size +100M 2>/dev/null -exec du -h {} \;

# 5. 排序
find / -type f -size +100M 2>/dev/null -exec du -h {} \; | sort -h | tail -20

19.4 找吃 CPU 的进程

# 1. top
top -c
# 找 %CPU 高的

# 2. ps
ps aux --sort=-%cpu | head

# 3. pidstat
pidstat -u 1

# 4. 找到进程后看堆栈
jstack <pid>  # Java
# 或
strace -p <pid> -c
# 统计

# 5. 看调用栈
perf top -p <pid> -g

19.5 看端口连接数

# 总连接数
ss -s

# 各状态
ss -tan | awk 'NR>1{print $1}' | sort | uniq -c

# 某 IP 的连接
ss -tan | grep 10.20.0.10 | wc -l

# 哪 IP 最多连接
ss -tan | awk 'NR>1{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head

# 哪端口被连接最多
ss -tan | awk 'NR>1{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head

# ESTABLISHED 状态
ss -tan state established | wc -l

19.6 网络抖动排查

# 1. 看连通
ping -c 100 host
# 看延迟 / 丢包

# 2. 路由追踪
mtr -r -c 100 host

# 3. TCP 重传
sar -n TCP,ETCP 1
# 看 retrans/s

# 4. 网卡丢包
ifconfig eth0
# 看 RX/TX dropped

# 5. 网卡 ring buffer
ethtool -g eth0

# 6. 网卡统计
ethtool -S eth0 | grep -i drop

19.7 CPU 飙高排查

# 1. 看 top
top -c

# 2. 看进程
ps -eo pid,pcpu,pmem,cmd --sort=-pcpu | head

# 3. 看进程线程
top -H -p <pid>
# 找到线程

# 4. 线程转 16 进制
printf"%x\n" <tid>
# 1a1b

# 5. 看 jstack
jstack <pid> | grep -A 30 "1a1b"
# Java

# 6. 看 perf
perf top -p <pid> -g
# C/C++ / Go

# 7. 看系统调用
strace -p <pid> -c

19.8 内存泄漏排查

# 1. 看 free
free -h

# 2. 看 process
ps aux --sort=-%mem | head

# 3. 看进程内存变化
whiletrue; do
    ps -p <pid> -o rss,vsz
    sleep 5
done

# 4. pmap 看哪段大
pmap -x <pid> | sort -k2 -nr | head

# 5. Java 用 jmap / jstat
jmap -heap <pid>
jstat -gc <pid> 1s

# 6. valgrind(开发用)
valgrind --leak-check=full ./app

19.9 启动慢排查

# 1. 看启动耗时
systemd-analyze

# 2. 看哪个服务慢
systemd-analyze blame

# 3. 看关键路径
systemd-analyze critical-chain

# 4. 看启动日志
journalctl -b
# 上次启动失败的原因

二十、危险命令清单

下面是生产绝对不要用或者要非常小心的命令。每条都是真实的事故。

20.1 rm -rf

rm -rf /
# 删根目录
# 真实事故:脚本里没传路径,默认 . → 反复递归 → 系统全废
rm -rf /* > /dev/null
# 删根目录所有文件
rm -rf $VAR/*
# VAR 没定义 → rm -rf /*

# 安全做法
# 1. 用 trash-cli
yum install -y trash-cli
trash-put file
# 软删除

# 2. 删除前确认
ls $VAR/
rm -rf $VAR/*
# 看到 ls 输出再删

# 3. 限制 rm 范围
rm -rf /data/cache/*
# 先确认 /data/cache 存在且不是 /

20.2 dd if=/dev/zero of=/dev/sda

dd if=/dev/zero of=/dev/sda
# 清空整块磁盘

# 真实事故:
# if=/dev/zero of=/dev/sdb bs=1M
# 本来想写 sdb1(sdb 的第一个分区)
# 错写成 sdb(整块盘)
# 数据全废

# 安全做法
# 1. lsblk 看盘
lsblk
# 2. 确认盘符
fdisk -l /dev/sdb
# 3. 写到具体分区
dd if=/dev/zero of=/dev/sdb1 bs=1M count=100
# count=100 限制大小

# 4. 加 conv=sync 跳过错误
dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 conv=sync

20.3 chmod -R 777

chmod -R 777 /
# 全部文件 777,安全灾难

# 真实事故:
# 一个新人 root 上 chmod -R 777 /var/www
# 整个 web 目录全 777
# 等于给攻击者开了后门

# 安全做法
# 1. 限制目录
chmod -R 755 /var/www/html
# 2. 文件 vs 目录分开处理
find /var/www -type f -exec chmod 644 {} \;
find /var/www -type d -exec chmod 755 {} \;
# 3. 永远不要用 777

20.4 kill -9 数据库

kill -9 mysqld
# 数据库可能丢数据
# 真实事故:
# kill -9 mysqld
# 之后数据库启动不起来
# 因为 redo log 没刷盘,崩溃恢复失败

# 安全做法
# 1. 先 kill 15
kill <pid>
# 给 30 秒清理

# 2. kill 9 之前先 SHUTDOWN
mysql -e "SHUTDOWN"
# MySQL 自己的清理

# 3. 看进程响应
kill -0 <pid>
# 不真杀,只检测

20.5 > /etc/

> /etc/passwd
# 清空 /etc/passwd
# 真实事故:
# echo "xxx" > /etc/sudoers  # 报错 Permission denied
# > /etc/environment         # 错写成 /etc/passwd
# 机器上所有用户进不来

# 安全做法
# 1. 用 >> 而不是 > (追加)
echo "xxx" >> /etc/environment
# 2. 改前 cp
cp /etc/passwd /etc/passwd.bak
# 3. 用 vim 编辑而不是重定向
vim /etc/passwd

20.6 history -c

history -c
# 抹操作记录
# 真实事故:
# 事故后 history -c
# 调查时不知道谁干了什么
# 失去追责依据

# 安全做法
# 1. 不要用 history -c
# 2. 保留 history 给 audit
# 3. 把 history 写到统一日志服务器

20.7 mkfs 写错

mkfs.ext4 /dev/sda
# 格式化整块盘,不是分区
# 数据全废

# 安全做法
# 1. mkfs 之前先确认盘
lsblk
fdisk -l /dev/sda
# 2. 加 -f 前确认
mkfs.ext4 /dev/sda1
# 写具体分区,不是 sda

20.8 fdisk / parted 写错

fdisk /dev/sdb
# 然后 w 写错
# 分区表破坏

# 安全做法
# 1. 改前备份分区表
sfdisk -d /dev/sda > /tmp/sda-part.bak
# 2. 重要盘先 umount
umount /data
# 3. 操作前看多一遍 fdisk -l

二十一、命令历史与审计

21.1 history

# 看历史
history

# 跑历史的某条
!1234

# 找命令
history | grep "rm -rf"

# 时间戳
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
# 之后 history 显示时间

# 写到统一文件
export HISTFILE=/var/log/bash_history/$(whoami)_$(date +%Y%m).log

21.2 auditd

yum install -y auditd

# 看规则
auditctl -l

# 加规则:监控 /etc/passwd 修改
auditctl -w /etc/passwd -p wa -k passwd_changes

# 触发后看
ausearch -k passwd_changes

# 永久规则
vim /etc/audit/rules.d/audit.rules
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes

21.3 sudo 日志

cat /var/log/secure
# CentOS / RHEL
cat /var/log/auth.log
# Ubuntu / Debian

# 看 sudo 行为
grep sudo /var/log/secure

二十二、命令效率提升

22.1 快捷键

# bash 快捷键
Ctrl + A    # 行首
Ctrl + E    # 行尾
Ctrl + U    # 删到行首
Ctrl + K    # 删到行尾
Ctrl + W    # 删一个词
Ctrl + R    # 反向搜索历史
Ctrl + L    # 清屏
Ctrl + C    # 中断
Ctrl + D    # 退出
Ctrl + Z    # 暂停

# 翻命令
↑ / ↓       # 历史

# Tab       # 补全

# !        # 执行历史
!!          # 上条
!$          # 上条最后一个参数
!*          # 上条所有参数
!123        # 历史第 123 条

22.2 别名

# ~/.bashrc
alias ll='ls -lh'
alias la='ls -lah'
alias l='ls -CF'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# -i:覆盖前确认
# 注意:rm -i 是个双刃剑,脚本里 rm 会被卡

alias h='history'
alias psg='ps -ef | grep'
alias ports='ss -tlnp'
alias myip='curl -s ifconfig.me'
alias reload='source ~/.bashrc'

# 服务器组
alias prod='ssh user@prod-01'
alias stage='ssh user@stage-01'

# 危险命令再确认
alias rm='echo "Use trash-put instead"'

22.3 函数

# 找大文件
bigfiles() {
    find / -type f -size +${1:-100M} 2>/dev/null | xargs du -h 2>/dev/null | sort -h | tail -${2:-20}
}
bigfiles 1G 10

# 杀进程
kp() {
    ps -ef | grep "$1" | grep -v grep
    echo -n "Kill? [y/N]: "
    read answer
    if [ "$answer" = "y" ]; then
        pkill "$1"
    fi
}

# 快速 SSH
sshhost() {
    ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $@
}

22.4 提示符

# ~/.bashrc
PS1='\u@\h:\w\$ '
# user@host:cwd$

# 带颜色
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# 显示 git 分支
parse_git_branch() {
    git branch 2>/dev/null | grep '*' | sed 's/* //'
}
PS1='\u@\h:\w(\$(parse_git_branch))\$ '

二十三、命令组合实战

23.1 找空文件

find / -type f -empty

# 删空文件
find /tmp -type f -empty -delete

23.2 批量改后缀

# 全部 .txt 改成 .md
for f in *.txt; do
    mv "$f" "${f%.txt}.md"
done

# 用 rename
rename 's/\.txt$/.md/' *.txt

23.3 找被改过但没提交的文件大小

git status --porcelain | awk '{print $2}' | xargs -I {} ls -lh {}

23.4 跑远程命令

# 一台
ssh user@host "ls /tmp"

# 多台
for host in prod-01 prod-02 prod-03; do
    echo"=== $host ==="
    ssh user@$host"uptime"
done

# 用 pssh
pssh -h hosts.txt -i "uptime"
# hosts.txt 一行一个 host

# 用 ansible
ansible all -i hosts -m shell -a "uptime"

23.5 文件批量处理

# 批量改权限
find /data -type d -exec chmod 755 {} \;
find /data -type f -exec chmod 644 {} \;

# 批量打包
find /data -name "*.log" -exec tar -czf logs.tar.gz {} +

# 批量传
find /data -name "*.log" | xargs -I {} scp {} user@backup:/backup/

23.6 查 Linux 系统信息

# 一行查系统版本
cat /etc/os-release
# NAME="CentOS Linux"
# VERSION="7 (Core)"
# ID="centos"
# ID_LIKE="rhel fedora"

# Ubuntu
lsb_release -a
# No LSB modules are available.
# Distributor ID: Ubuntu
# Description:    Ubuntu 22.04.3 LTS
# Release:        22.04
# Codename:       jammy

# 内核
uname -a

# CPU
lscpu | head

# 内存
free -h

# 磁盘
df -h

# 网络
ip a

# 启动时长
uptime

# 整体
hostnamectl

二十四、命令时间与调度

24.1 time

# 看命令耗时
time ls
# real    0m0.001s
# user    0m0.000s
# sys     0m0.001s

# 详细
/usr/bin/time -v ls
#    User time (seconds): 0.00
#    System time (seconds): 0.00
#    Percent of CPU this job got: 0%
#    Elapsed (wall clock) time: 0:00.00
#    ...

24.2 timeout

# 命令超时
timeout 10 ping 8.8.8.8
# 10 秒后自动停

# 跑慢命令
timeout 600 long_running_command

# 超时后发信号
timeout --signal=9 10 ping 8.8.8.8
# 超时后 SIGKILL

二十五、文件传输与同步

25.1 rsync 详细

# 基本
rsync -av /src/ /dst/

# 远程
rsync -av /src/ user@host:/dst/

# 走 SSH 选项
rsync -av -e "ssh -p 2222" /src/ user@host:/dst/

# 排除
rsync -av --exclude='*.log' --exclude='cache/' /src/ /dst/

# 排除文件
rsync -av --exclude-from='exclude.txt' /src/ /dst/
# exclude.txt 一行一个模式

# 限速
rsync -av --bwlimit=10m /src/ user@host:/dst/

# 断点续传
rsync -avP /src/ user@host:/dst/
# -P:--partial --progress

# 同步删除
rsync -av --delete /src/ /dst/

# dry-run
rsync -avn --delete /src/ /dst/

# 压缩
rsync -avz /src/ /dst/

# 保留硬链
rsync -avH /src/ /dst/
# -H:硬链

25.2 scp 详细

# 基础
scp file user@host:/dst/

# 目录
scp -r dir user@host:/dst/

# 限速
scp -l 1000 file user@host:/dst/
# 1000 Kbit/s

# 走 key
scp -i ~/.ssh/key file user@host:/dst/

# 保留权限
scp -p file user@host:/dst/

二十六、磁盘管理命令

26.1 fdisk

# 看
fdisk -l

# 改
fdisk /dev/sda
# m 帮助
# p 打印
# n 新建
# d 删
# t 改类型
# w 写
# q 不保存退出

26.2 parted

# 看
parted /dev/sda print

# 改
parted /dev/sda mklabel gpt
parted /dev/sda mkpart primary xfs 0% 100%

# 删
parted /dev/sda rm 1

# 改大小
parted /dev/sda resizepart 1 200GiB

26.3 mkfs

# ext4
mkfs.ext4 /dev/sda1

# xfs
mkfs.xfs /dev/sda1 -L data -f

# btrfs
mkfs.btrfs /dev/sda1

# 加参数
mkfs.ext4 -L data -m 1 /dev/sda1
# -m 1:保留块 1%
# -L:卷标

26.4 mount

# 临时挂载
mount /dev/sda1 /data

# 写 fstab
blkid /dev/sda1
# 拿 UUID
echo "UUID=xxx /data xfs defaults,noatime 0 0" >> /etc/fstab

# 验证
mount -a

# 重新挂载
mount -o remount,rw /data

二十七、LVM 命令

# PV
pvcreate /dev/sdb
pvs
pvdisplay

# VG
vgcreate data-vg /dev/sdb
vgextend data-vg /dev/sdd
vgs
vgdisplay

# LV
lvcreate -L 100G -n data-lv data-vg
lvextend -l +100%FREE /dev/data-vg/data-lv
lvreduce -L 100G /dev/data-vg/data-lv
# 缩 LV 高危
lvs
lvdisplay

# 扩 FS
xfs_growfs /data
resize2fs /dev/data-vg/data-lv

二十八、文本统计与分析

28.1 wc

wc -l file
# 行数

wc -w file
# 词数

wc -c file
# 字节数

wc -m file
# 字符数

28.2 head / tail

head -n 10 file
# 前 10 行

tail -n 10 file
# 后 10 行

tail -F file
# 实时跟踪

28.3 split

# 按行数拆
split -l 1000 file prefix_
# 每个 1000 行

# 按大小拆
split -b 100m file prefix_

# 按行数拆带后缀
split -l 1000 -d -a 3 file prefix_
# prefix_000, prefix_001, ...

28.4 nl

# 加行号
nl file

# 空行不加
nl -ba file

二十九、其他常用

29.1 date / cal

date
date +%F
# 2026-06-13
date +%T
# 14:30:00
date +"%F %T"
# 2026-06-13 14:30:00

cal
# 当月日历
cal 6 2026
# 2026 年 6 月

29.2 echo / printf

echo "hello"
echo -e "a\tb"
# -e:解释转义
echo "$var"

printf "%s\n" "hello"
printf "%d %s\n" 123 "abc"
# 格式化输出

29.3 yes

yes | command
# 自动回答 y

yes "no" | command
# 回答 no

29.4 seq / xargs

seq 1 10
# 1 2 3 ... 10

seq 1 2 10
# 1 3 5 7 9
# 步长 2

# 配合
seq 1 10 | xargs -I {} echo "task {}"

29.5 bc

# 计算器
echo "1+1" | bc
# 2
echo "scale=2; 10/3" | bc
# 3.33

29.6 watch

# 每秒跑一次
watch -n 1 "ls -lh /tmp"
# 默认 2 秒

# 高亮变化
watch -d -n 1 "free -h"

29.7 man

# 帮助
man ls

# 查命令
man -k network
# 模糊查询

# 章节
man 5 passwd
# 1 命令
# 2 系统调用
# 3 库函数
# 4 设备
# 5 配置文件
# 6 游戏
# 7 其他
# 8 系统管理命令

三十、运维命令速查表

# 系统
uname -a, hostname, uptime, date, who, w, last

# 进程
ps aux, top, htop, kill, pkill, pgrep, pidof, pstree

# CPU
top, mpstat, sar -u, lscpu, perf top

# 内存
free, vmstat, sar -r, slabtop, pmap

# 网络
ip, ss, netstat, ping, mtr, traceroute, tcpdump, iftop, nethogs, curl, wget, nc, ethtool

# 磁盘
df, du, lsblk, blkid, mount, fdisk, parted, iostat, iotop, fuser, lsof

# 文件
find, locate, stat, file, tree, ls, ln, chmod, chown, rsync, scp, tar, zip, dd

# 日志
tail, head, less, grep, awk, sed, journalctl, dmesg, logrotate

# 用户
useradd, usermod, userdel, passwd, chage, groupadd, id, su, sudo

# 服务
systemctl, journalctl, systemd-analyze

# 包
yum, dnf, apt-get, rpm, dpkg

# 定时
crontab, at, flock, systemd-timer

# 性能
strace, ltrace, perf, bcc, bpftrace

# 工具
tmux, screen, glances, dstat, nmon

三十一、上线 Checklist

  • [ ] bash / zsh 配好 alias
  • [ ] HISTTIMEFORMAT 配好
  • [ ] history 写到统一日志
  • [ ] 命令行编辑键熟练
  • [ ] 危险命令(rm / dd / chmod)有防线
  • [ ] auditd 装上,关键路径监控
  • [ ] sudo 日志在收
  • [ ] ssh 免密 + config 配置
  • [ ] tmux / screen 熟练使用
  • [ ] 编辑器 vim / nano 熟练
  • [ ] 监控告警命令背得出来(iostat / ss / df)
  • [ ] 紧急排错 Runbook 写好
  • [ ] 命令速查表存在 ~/.cheatsheet
  • [ ] 所有工具版本号记录
  • [ ] 包管理源换好
  • [ ] 常用 alias 同步到所有机器
  • [ ] 关键命令输出格式熟记
  • [ ] 知根知底能解释每个命令

文章到这里就结束了。命令这一块,没别的捷径,就是天天用、用熟。但更重要的不是”会用”,而是”知道什么时候用、什么时候不用、用了风险是什么”。生产里 rm -rf 出事的,十有八九是”知道这命令、不知道后果”。

转自:马哥Linux运维

版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除

想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

未经允许不得转载:17认证网 » Linux 高频运维命令全梳理,日常工作随手即用
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师