Ubuntu 运维命令大全:从入门到精通的实战参考手册

Ubuntu 运维命令大全:从入门到精通的实战参考手册

本文系统梳理 Ubuntu 服务器日常运维中的高频命令与实战技巧,涵盖系统管理、文件操作、网络配置、服务部署、安全加固、性能调优等 18 大模块,共计 200+ 条命令与示例,适合运维工程师、后端开发者和 Linux 爱好者作为案头速查手册。


一、系统信息与基础操作

1.1 查看系统信息

bash 复制代码
# 查看系统版本
lsb_release -a
cat /etc/os-release
hostnamectl

# 查看内核版本
uname -a
uname -r          # 仅内核版本号
cat /proc/version

# 查看系统架构
arch
uname -m

# 查看系统运行时间与负载
uptime
uptime -p         # 以易读格式显示运行时间

# 查看主机名
hostname
hostnamectl set-hostname my-server    # 修改主机名

# 查看系统启动时间
who -b
systemd-analyze                     # 本次启动耗时
systemd-analyze blame              # 各服务启动耗时

1.2 日期与时间

bash 复制代码
# 查看与设置时区
timedatectl                           # 查看当前时间与时区
timedatectl list-timezones            # 列出所有可用时区
timedatectl set-timezone Asia/Shanghai

# 手动同步时间
sudo apt install ntpdate
sudo ntpdate ntp.ubuntu.com

# 启用 NTP 自动同步
sudo timedatectl set-ntp true
sudo timedatectl set-ntp false         # 关闭自动同步

# 查看日历
cal                                   # 当月日历
cal -y                                # 全年日历
cal 2026                              # 指定年份

1.3 关机与重启

bash 复制代码
# 立即关机
sudo shutdown -h now
sudo poweroff

# 定时关机(20分钟后)
sudo shutdown -h +20 "服务器将在20分钟后关机"

# 指定时间关机(今晚23:30)
sudo shutdown -h 23:30

# 取消关机计划
sudo shutdown -c

# 立即重启
sudo reboot
sudo shutdown -r now

# 定时重启(10分钟后)
sudo shutdown -r +10

二、文件与目录管理

2.1 目录操作

bash 复制代码
# 创建目录
mkdir dir1                            # 单层目录
mkdir -p dir1/dir2/dir3               # 递归创建多级目录
mkdir -v myproject                    # 显示创建过程

# 切换目录
cd /var/log                           # 绝对路径
cd ..                                 # 返回上级目录
cd -                                  # 返回上一次所在目录
cd ~                                  # 回到用户主目录
cd                                    # 同上

# 查看当前路径
pwd
pwd -P                                # 显示物理路径(解析软链接)

2.2 文件查看

bash 复制代码
# 查看文件内容
cat filename                          # 显示全部内容
cat -n filename                       # 显示行号
tac filename                           # 倒序显示(从最后一行开始)

# 分页查看
less filename                         # 可上下翻页,按 q 退出
more filename                         # 只能向下翻页

# 查看文件头部/尾部
head -n 20 filename                   # 前20行
tail -n 50 filename                   # 后50行
tail -f /var/log/syslog               # 实时追踪日志更新
tail -f -n 100 /var/log/syslog        # 实时追踪,先显示最后100行

# 查看文件类型与编码
file filename
file -i filename                      # 显示 MIME 类型

# 统计文件信息
wc -l filename                        # 统计行数
wc -w filename                        # 统计单词数
wc -c filename                        # 统计字节数
wc -l *.py                            # 统计所有 Python 文件行数

2.3 文件与目录的复制、移动、删除

bash 复制代码
# 复制文件
cp source.txt dest.txt
cp -i source.txt dest.txt             # 覆盖前提示确认
cp -v source.txt dest.txt             # 显示复制过程

# 递归复制目录
cp -r dir1/ dir2/
cp -a dir1/ dir2/                     # 保留所有属性(权限、属主、时间戳、软链接)

# 移动/重命名
mv old_name.txt new_name.txt
mv file.txt /tmp/                     # 移动到其他目录
mv -i file.txt /tmp/                  # 覆盖前提示

# 删除
rm file.txt                           # 删除文件
rm -i file.txt                        # 删除前确认
rm -r mydir/                          # 递归删除目录
rm -rf mydir/                         # 强制递归删除(慎用!)
rm -rf mydir/ 2>/dev/null            # 静默删除,不显示错误

2.4 文件查找

bash 复制代码
# find 命令
find /etc -name "*.conf"              # 按名称查找
find /var -type f -name "*.log"       # 仅查找文件
find /var -type d -name "log"         # 仅查找目录
find /home -user john                 # 按属主查找
find /tmp -size +100M                 # 查找大于100M的文件
find /var/log -mtime -7               # 7天内修改过的文件
find /var/log -mtime +30              # 30天前修改过的文件
find /tmp -mmin -60                   # 60分钟内修改过的文件
find . -maxdepth 2 -name "*.conf"     # 限制搜索深度为2层
find /var/log -name "*.log" -exec gzip {} \;    # 找到后逐个压缩
find /var/log -name "*.log" -delete   # 找到后直接删除

# locate 命令(更快,基于数据库)
sudo updatedb                         # 更新数据库
locate nginx.conf                     # 快速查找
locate -i nginx                       # 忽略大小写

# which / whereis / type
which python3                         # 查找可执行文件路径
whereis nginx                         # 查找二进制、源码、手册
type ls                               # 查看命令类型(内置/别名/外部命令)

2.5 文件内容搜索(grep)

bash 复制代码
# 基本搜索
grep "error" /var/log/syslog
grep -i "error" /var/log/syslog        # 忽略大小写
grep -v "debug" app.log                # 反向匹配(排除含 debug 的行)
grep -c "error" app.log                # 仅统计匹配行数
grep -n "error" app.log                # 显示行号
grep -r "192.168.1.1" /etc/            # 递归搜索目录
grep -rn "TODO" ./src/                 # 递归搜索并显示行号
grep -l "config" *.py                 # 只输出匹配的文件名
grep -A 3 "error" app.log              # 匹配行 + 后3行
grep -B 2 "error" app.log             # 匹配行 + 前2行
grep -C 3 "error" app.log             # 匹配行 + 前后各3行

# 正则匹配
grep -E "^[0-9]+" app.log              # 以数字开头的行
grep -E "error|warning|critical" app.log    # 多关键词匹配
grep -E "192\.168\.[0-9]+\.[0-9]+" /etc/hosts

# 高频组合
ps aux | grep nginx                   # 查找进程
netstat -tlnp | grep :80              # 查找端口
dpkg -l | grep nginx                  # 查找已安装软件包

2.6 软链接与硬链接

bash 复制代码
# 软链接(符号链接)
ln -s /var/log/myapp.log ~/myapp.log          # 创建软链接
ln -sf /var/log/myapp.log ~/myapp.log         # 强制覆盖已有链接
ln -s /opt/nginx/sbin/nginx /usr/local/bin/nginx

# 硬链接
ln source.txt hardlink.txt                    # 创建硬链接(不能跨文件系统)

# 查看链接指向
readlink -f ~/myapp.log                       # 显示最终目标路径
ls -l ~/myapp.log                             # 查看链接信息

2.7 文件权限与属主

bash 复制代码
# 查看权限
ls -l filename
ls -ld /var/www                      # 查看目录本身权限

# 修改权限
chmod 755 script.sh                  # rwxr-xr-x
chmod 644 config.txt                 # rw-r--r--
chmod +x deploy.sh                   # 添加执行权限
chmod -R 755 /var/www/               # 递归修改目录下所有文件

# 数字权限速查:
# 7 = rwx (读+写+执行)    6 = rw- (读+写)
# 5 = r-x (读+执行)       4 = r-- (只读)
# 0 = --- (无权限)

# 修改属主与属组
chown john:devops app.log             # 同时修改属主和属组
chown john app.log                    # 仅修改属主
chgrp devops app.log                  # 仅修改属组
chown -R www-data:www-data /var/www/  # 递归修改

# 特殊权限
chmod u+s /usr/bin/passwd             # SUID:以文件属主身份执行
chmod g+s /shared/project             # SGID:新建文件继承目录属组
chmod 1777 /tmp                       # Sticky Bit:只有属主能删自己的文件

2.8 文件打包与压缩

bash 复制代码
# tar 打包(最常用)
tar -cvf archive.tar dir/             # 打包(不压缩)
tar -zcvf archive.tar.gz dir/          # gzip 压缩
tar -jcvf archive.tar.bz2 dir/         # bzip2 压缩(更小,更慢)
tar -Jcvf archive.tar.xz dir/          # xz 压缩(最小,最慢)

# 解包
tar -xvf archive.tar                   # 解包 tar
tar -zxvf archive.tar.gz               # 解压 tar.gz
tar -jxvf archive.tar.bz2               # 解压 tar.bz2
tar -Jxvf archive.tar.xz               # 解压 tar.xz
tar -zxvf archive.tar.gz -C /opt/      # 解压到指定目录

# 查看(不解压)
tar -tvf archive.tar.gz

# zip / unzip
zip -r backup.zip dir/
zip -e backup.zip secret.txt           # 加密压缩(会提示输入密码)
unzip backup.zip
unzip backup.zip -d /opt/

# gzip / gunzip
gzip largefile.log                     # 压缩(原文件被替换)
gzip -k largefile.log                  # 压缩(保留原文件)
gunzip largefile.log.gz                # 解压
zcat largefile.log.gz                  # 查看压缩文件内容

# split 分卷
split -b 100M largefile.tar.gz part_   # 按100M分割
cat part_* > largefile.tar.gz          # 合并

三、用户与权限管理

3.1 用户管理

bash 复制代码
# 添加用户
sudo useradd -m -s /bin/bash john           # 创建用户并建立主目录,指定 Shell
sudo passwd john                            # 设置密码
sudo useradd -m -s /bin/bash -G sudo,devops john   # 创建并加入多个组

# adduser(交互式,更友好)
sudo adduser john

# 删除用户
sudo userdel john                           # 仅删除用户(保留主目录)
sudo userdel -r john                        # 删除用户并删除主目录
sudo userdel -rf john                       # 强制删除,即使用户在线

# 修改用户属性
sudo usermod -aG docker john                # 追加加入 docker 组(-a 必须配合 -G)
sudo usermod -s /bin/zsh john              # 修改默认 Shell
sudo usermod -L john                        # 锁定账户
sudo usermod -U john                        # 解锁账户
sudo usermod -l newname oldname             # 修改用户名
sudo usermod -d /home/newhome -m john       # 修改主目录并迁移文件

3.2 用户组管理

bash 复制代码
# 创建与删除组
sudo groupadd devops
sudo groupadd -g 2000 devops               # 指定 GID
sudo groupdel devops

# 修改组
sudo groupmod -n engineers devops          # 组改名
sudo groupmod -g 3000 devops               # 修改 GID

# 查看组信息
groups john                                 # 查看用户所属组
cat /etc/group                             # 查看所有组
getent group docker                        # 查看指定组信息

# 将用户加入/移除组
sudo gpasswd -a john docker                # 加入组
sudo gpasswd -d john docker                # 从组中移除
newgrp docker                              # 临时切换有效组(当前 Shell)

3.3 切换用户与提权

bash 复制代码
# 切换用户
su - john                                   # 切换到 john 并加载其环境变量
su john                                     # 切换但不加载环境变量
exit                                        # 退出切换

# sudo 提权
sudo command                                # 以 root 执行单条命令
sudo -u john command                        # 以指定用户执行
sudo -i                                     # 进入 root 交互式 Shell
sudo -s                                     # 进入 root 非登录式 Shell
sudo -k                                     # 使下次 sudo 重新输入密码

# sudo 配置
sudo visudo                                # 安全编辑 sudoers 文件
# 在文件中添加:
# john ALL=(ALL:ALL) ALL                   # john 可执行所有 sudo 命令
# john ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx  # 免密执行特定命令
# %devops ALL=(ALL) ALL                    # devops 组成员可 sudo

# 查看用户信息
id john                                     # 显示 UID、GID 及所属组
whoami                                      # 当前用户名
who                                         # 查看当前登录的所有用户
w                                           # 查看登录用户及其活动
last                                        # 查看登录历史
last -n 10                                  # 最近10次登录记录
lastb                                       # 查看失败的登录尝试

3.4 密码与安全策略

bash 复制代码
# 修改密码
passwd                                      # 修改自己的密码
sudo passwd john                            # 修改其他用户密码

# 密码过期策略
sudo chage -l john                          # 查看密码过期信息
sudo chage -M 90 john                       # 密码最大使用天数90天
sudo chage -m 7 john                        # 密码最小使用天数7天
sudo chage -W 7 john                        # 过期前7天警告
sudo chage -E 2026-12-31 john               # 账户过期日期
sudo chage -d 0 john                        # 强制下次登录修改密码

# 锁定/解锁账户
sudo passwd -l john                         # 锁定密码
sudo passwd -u john                         # 解锁密码

四、软件包管理(APT)

4.1 基础操作

bash 复制代码
# 更新软件源索引
sudo apt update

# 升级已安装的包
sudo apt upgrade                           # 升级(不删除旧包)
sudo apt full-upgrade                      # 升级(可删除旧包以解决依赖)
sudo apt dist-upgrade                      # 同 full-upgrade

# 安装软件包
sudo apt install nginx
sudo apt install nginx=1.18.0-0ubuntu1     # 安装指定版本
sudo apt install -y nginx                  # 自动确认
sudo apt install nginx mysql-server        # 同时安装多个
sudo apt install -y --no-install-recommends package   # 不安装推荐包

# 重新安装
sudo apt reinstall nginx

# 卸载
sudo apt remove nginx                      # 卸载(保留配置文件)
sudo apt purge nginx                       # 卸载并删除配置文件
sudo apt autoremove                        # 清理不再需要的依赖
sudo apt autoclean                          # 清理旧版包缓存

# 搜索与查看
apt search nginx                            # 搜索软件包
apt show nginx                              # 显示包详细信息
apt list --installed                        # 列出已安装的包
apt list --upgradable                       # 列出可升级的包
apt list --installed | grep nginx

# 下载但不安装
apt download nginx                          # 下载 deb 包到当前目录

4.2 软件源管理

bash 复制代码
# 查看当前软件源
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

# Ubuntu 22.04/24.04 使用新版 DEB822 格式源
cat /etc/apt/sources.list.d/ubuntu.sources

# 换源(以清华源为例,传统格式)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's|http://archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
sudo sed -i 's|http://security.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
sudo apt update

# 添加 PPA
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update

# 删除 PPA
sudo add-apt-repository --remove ppa:deadsnakes/ppa

4.3 dpkg 底层操作

bash 复制代码
# 安装本地 deb 包
sudo dpkg -i package.deb

# 卸载
sudo dpkg -r package                       # 卸载(保留配置)
sudo dpkg -P package                        # 彻底卸载

# 查看
dpkg -l                                    # 列出所有已安装包
dpkg -l | grep nginx
dpkg -L nginx                              # 查看包安装了哪些文件
dpkg -S /usr/bin/curl                      # 查找文件属于哪个包
dpkg -s nginx                              # 查看包状态信息

# 修复依赖问题
sudo apt --fix-broken install
sudo dpkg --configure -a

4.4 snap 包管理

bash 复制代码
# 安装
sudo snap install code --classic           # --classic 用于需要系统权限的应用
sudo snap install docker

# 查看与管理
snap list                                  # 已安装的 snap
snap find "editor"                         # 搜索

# 更新与卸载
sudo snap refresh code                     # 更新
sudo snap remove code                      # 卸载

# 查看服务
sudo snap services docker
sudo snap start docker
sudo snap stop docker

五、服务管理(systemd)

5.1 服务基本操作

bash 复制代码
# 启动/停止/重启
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx

# 重载配置(不中断服务)
sudo systemctl reload nginx

# 查看状态
sudo systemctl status nginx
systemctl is-active nginx                  # 检查是否运行中
systemctl is-enabled nginx                 # 检查是否开机自启

# 开机自启
sudo systemctl enable nginx                # 设置开机自启
sudo systemctl disable nginx               # 取消开机自启
sudo systemctl enable --now nginx         # 设置自启并立即启动

# 重新加载 systemd 配置文件
sudo systemctl daemon-reload

5.2 服务列表与依赖

bash 复制代码
# 列出所有服务
systemctl list-units --type=service                       # 所有已加载的服务
systemctl list-units --type=service --state=running       # 正在运行的
systemctl list-units --type=service --state=failed        # 失败的
systemctl list-unit-files --type=service                   # 所有已安装的服务文件

# 查看服务依赖关系
systemctl list-dependencies nginx
systemctl list-dependencies --reverse nginx               # 谁依赖了 nginx

# 查看服务日志
journalctl -u nginx -f                      # 实时查看
journalctl -u nginx --since today
journalctl -u nginx --since "2026-08-29 10:00" --until "2026-08-29 14:00"
journalctl -u nginx -n 50                   # 最近50条
journalctl -u nginx -p err                  # 仅错误级别

5.3 自定义服务文件

bash 复制代码
# 查看服务文件
systemctl cat nginx

# 编辑服务文件
sudo systemctl edit nginx --full            # 编辑主文件
sudo systemctl edit nginx                   # 创建 override(推荐,不修改原文件)

# 示例:override 限制资源
# sudo systemctl edit nginx
# 写入以下内容:
# [Service]
# LimitNOFILE=65536
# LimitNPROC=4096

# 编辑后重载
sudo systemctl daemon-reload
sudo systemctl restart nginx

5.4 日志管理(journalctl)

bash 复制代码
# 查看全部日志
journalctl                                 # 所有日志(分页)
journalctl -n 100                          # 最后100条
journalctl -f                              # 实时跟踪

# 按优先级过滤
journalctl -p err                          # 错误及以上
journalctl -p warning                      # 警告及以上
# 优先级:emerg(0) > alert(1) > crit(2) > err(3) > warning(4) > notice(5) > info(6) > debug(7)

# 按时间过滤
journalctl --since "1 hour ago"
journalctl --since "2026-08-29" --until "2026-08-29 12:00"
journalctl --since yesterday

# 按进程/用户过滤
journalctl _PID=12345
journalctl _UID=1000

# 按可执行文件过滤
journalctl /usr/sbin/nginx

# 查看内核日志
journalctl -k
journalctl -k -b                           # 本次启动的内核日志
journalctl -k -b -1                        # 上次启动的内核日志

# 日志磁盘占用
journalctl --disk-usage
sudo journalctl --vacuum-size=500M         # 限制日志占用500M
sudo journalctl --vacuum-time=7d            # 只保留7天

六、网络配置与诊断

6.1 IP 与网卡配置

bash 复制代码
# 查看网络接口
ip addr show                               # 查看所有接口
ip addr show eth0                          # 查看指定接口
ip -br addr                                # 简洁模式
ip link show                               # 仅查看链路状态
ip -s link show eth0                       # 查看接口统计信息

# 启用/禁用接口
sudo ip link set eth0 up
sudo ip link set eth0 down

# 配置 IP(临时)
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip addr del 192.168.1.100/24 dev eth0

# 配置默认网关
sudo ip route add default via 192.168.1.1
sudo ip route del default

# 查看/管理路由
ip route show
ip route get 8.8.8.8                       # 查看到某地址的路由

# DNS 配置
cat /etc/resolv.conf                       # 查看当前 DNS
# 永久配置 DNS(Netplan 方式,见下文)

6.2 Netplan 配置(Ubuntu 18.04+)

bash 复制代码
# 查看 Netplan 配置文件
ls /etc/netplan/
cat /etc/netplan/01-netcfg.yaml

# 示例配置(静态IP):
# network:
#   version: 2
#   ethernets:
#     eth0:
#       addresses:
#         - 192.168.1.100/24
#       routes:
#         - to: default
#           via: 192.168.1.1
#       nameservers:
#         addresses: [8.8.8.8, 114.114.114.114]

# 应用配置
sudo netplan apply
sudo netplan try                            # 测试应用(30秒后自动回滚)

# 验证
ip addr show

6.3 网络连通性诊断

bash 复制代码
# ping 测试
ping -c 4 8.8.8.8                          # 发送4个包
ping -c 4 -i 0.5 8.8.8.8                   # 间隔0.5秒
ping -W 3 -c 4 8.8.8.8                    # 超时3秒

# DNS 解析
dig example.com
dig @8.8.8.8 example.com                   # 指定 DNS 服务器
dig +short example.com                     # 仅返回 IP
dig example.com MX                          # 查询 MX 记录
dig example.com TXT                        # 查询 TXT 记录
nslookup example.com
host example.com

# traceroute 路由追踪
traceroute 8.8.8.8
traceroute -n 8.8.8.8                      # 不解析主机名(更快)
mtr 8.8.8.8                                # 持续动态路由追踪
mtr -n --report 8.8.8.8                   # 报告模式

# curl HTTP 请求
curl -I https://example.com                # 仅返回响应头
curl -o file.zip https://example.com/file.zip   # 下载文件
curl -X POST https://api.example.com/data -d '{"key":"value"}' -H "Content-Type: application/json"
curl -w "%{http_code}" -o /dev/null -s https://example.com   # 仅返回状态码
curl -L https://example.com               # 跟随重定向
curl --resolve example.com:443:1.2.3.4 https://example.com  # 指定解析IP

# wget 下载
wget https://example.com/file.tar.gz
wget -c https://example.com/file.tar.gz    # 断点续传
wget -O custom_name.tar.gz https://example.com/file.tar.gz
wget --limit-rate=1M https://example.com/file.tar.gz   # 限速下载
wget -q https://example.com/file.tar.gz   # 静默模式

6.4 端口与连接查看

bash 复制代码
# ss(推荐,替代 netstat)
ss -tlnp                                   # TCP监听端口 + 进程
ss -ulnp                                   # UDP监听端口
ss -tnp                                    # TCP已连接
ss -tln                                    # 仅TCP监听
ss -s                                      # 连接统计摘要

# netstat(需安装 net-tools)
sudo apt install net-tools
netstat -tlnp                              # TCP监听
netstat -ulnp                              # UDP监听
netstat -anp | grep :80                    # 查看80端口连接
netstat -rn                                # 查看路由表

# lsof 查看端口占用
sudo lsof -i :80                           # 谁在使用80端口
sudo lsof -i tcp                           # 所有TCP连接
sudo lsof -nP -i :443                      # 不解析名称和端口

# 查看特定进程的网络连接
ss -p | grep nginx

6.5 网络抓包

bash 复制代码
# tcpdump
sudo apt install tcpdump
sudo tcpdump -i eth0                       # 抓取 eth0 所有流量
sudo tcpdump -i eth0 port 80              # 仅抓80端口
sudo tcpdump -i eth0 host 192.168.1.100   # 仅抓特定主机
sudo tcpdump -i eth0 -c 100               # 抓100个包后停止
sudo tcpdump -i eth0 -w capture.pcap      # 保存为 pcap 文件
sudo tcpdump -i eth0 -nn port 443 and host 1.2.3.4    # 组合过滤
tcpdump -r capture.pcap                   # 读取 pcap 文件

# 常用过滤表达式:
# and/or/not   逻辑组合
# src host     源地址
# dst host     目标地址
# port         端口
# tcp/udp/icmp 协议

七、进程管理

7.1 查看进程

bash 复制代码
# ps 命令
ps aux                                     # 查看所有进程(BSD格式)
ps -ef                                     # 查看所有进程(标准格式)
ps -ef | grep nginx                        # 过滤特定进程
ps aux --sort=-%cpu | head -10            # CPU占用前10
ps aux --sort=-%mem | head -10            # 内存占用前10
ps -p 12345                                # 查看指定PID
ps -C nginx                                # 按命令名查看

# top(交互式)
top                                        # 实时进程监控
# top 中的快捷键:
#   P   按CPU排序
#   M   按内存排序
#   1   显示所有CPU核心
#   k   杀死进程
#   q   退出

# htop(增强版,需安装)
sudo apt install htop
htop

# pgrep / pidof
pgrep -f nginx                             # 按命令名查找PID
pgrep -u john                              # 按用户查找
pidof nginx                                # 获取进程PID

7.2 终止进程

bash 复制代码
# kill 命令
kill 12345                                 # 发送 SIGTERM(优雅终止)
kill -9 12345                              # 发送 SIGKILL(强制终止)
kill -15 12345                             # 发送 SIGTERM(同默认)
kill -HUP $(pidof nginx)                   # 发送 SIGHUP(重载配置)

# killall(按进程名)
killall nginx                              # 终止所有 nginx 进程
killall -9 nginx                           # 强制终止
killall -u john                            # 终止该用户的所有进程
killall -e -9 exact_match                  # 精确匹配进程名

# pkill
pkill -f "python app.py"                   # 按完整命令行匹配
pkill -u john                              # 按用户
pkill -f -- "-port 8080"                   # 按参数匹配

# 信号说明:
# SIGHUP(1)     挂起/重载配置
# SIGINT(2)     中断(Ctrl+C)
# SIGQUIT(3)    退出
# SIGKILL(9)    强制终止(不可被捕获/忽略)
# SIGTERM(15)   优雅终止(默认信号)
# SIGSTOP(19)   暂停
# SIGCONT(18)   继续

7.3 后台运行与作业管理

bash 复制代码
# 后台运行
command &                                  # 在后台运行
nohup command &                             # 后台运行,忽略挂断信号(终端关闭后仍运行)
nohup ./app.py > app.log 2>&1 &            # 重定向输出到日志文件

# disown(从 Shell 作业列表移除)
nohup command &; disown                     # 后台运行并脱离 Shell
disown -h %1                                # 标记作业不随 Shell 退出而终止

# jobs / fg / bg
jobs                                        # 查看后台作业
jobs -l                                     # 显示 PID
fg %1                                       # 将作业1调到前台
bg %1                                       # 让作业1在后台继续运行
Ctrl+Z                                      # 暂停前台作业(转为后台)

# 优先级调整
nice -n 10 command                          # 以优先级10运行(值越高优先级越低)
renice -n 5 -p 12345                        # 修改运行中进程的优先级

八、磁盘与存储管理

8.1 磁盘空间查看

bash 复制代码
# df 查看文件系统使用情况
df -h                                      # 人性化显示(GB/MB)
df -hT                                     # 显示文件系统类型
df -h --total                              # 显示总计
df -i                                      # 查看 inode 使用情况
df -h /var                                 # 查看指定目录所在分区

# du 查看目录/文件大小
du -sh /var/log                            # 查看目录总大小
du -sh *                                   # 当前目录下各项大小
du -h --max-depth=1 /var/                 # 只看一层子目录
du -sh /var/* | sort -rh | head -10       # 最大的10个目录
du -ah /var/log | sort -rh | head -20     # 最大的20个文件/目录

# 查看文件大小
ls -lhS /var/log/                          # 按大小排序
stat filename                              # 文件详细信息

8.2 磁盘分区与格式化

bash 复制代码
# 查看磁盘
lsblk                                      # 列出所有块设备
lsblk -f                                   # 显示文件系统信息
sudo fdisk -l                              # 列出所有磁盘分区
sudo parted -l                             # GPT 分区信息

# fdisk 分区(MBR)
sudo fdisk /dev/sdb
# 常用 fdisk 命令:m(帮助) n(新建) d(删除) p(打印) w(写入) q(退出)

# parted 分区(GPT,推荐大磁盘)
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary ext4 0% 100%

# 格式化
sudo mkfs.ext4 /dev/sdb1                   # 格式化为 ext4
sudo mkfs.xfs /dev/sdb1                    # 格式化为 xfs
sudo mkfs.btrfs /dev/sdb1                  # 格式化为 btrfs
sudo mkswap /dev/sdb2                      # 创建交换分区

# 挂载
sudo mount /dev/sdb1 /mnt/data             # 临时挂载
sudo mount -o ro /dev/sdb1 /mnt/data       # 只读挂载
sudo umount /mnt/data                      # 卸载
sudo umount -l /mnt/data                   # 懒卸载(等忙完后卸载)

8.3 开机自动挂载(fstab)

bash 复制代码
# 查看 UUID
sudo blkid
sudo blkid /dev/sdb1

# 编辑 fstab
sudo nano /etc/fstab
# 添加行(推荐用 UUID):
# UUID=xxxx-xxxx-xxxx /mnt/data  ext4  defaults  0  2
# /dev/sdb1            /mnt/data  ext4  defaults  0  2

# 验证 fstab 配置(不实际挂载,仅测试语法)
sudo findmnt --verify

# 挂载 fstab 中所有配置
sudo mount -a

8.4 LVM 逻辑卷管理

bash 复制代码
# 查看
sudo pvs                                    # 物理卷
sudo vgs                                    # 卷组
sudo lvs                                    # 逻辑卷
sudo lvdisplay                              # 逻辑卷详情

# 创建
sudo pvcreate /dev/sdb                      # 创建物理卷
sudo vgcreate vg_data /dev/sdb              # 创建卷组
sudo lvcreate -L 50G -n lv_data vg_data     # 创建50G逻辑卷
sudo mkfs.ext4 /dev/vg_data/lv_data         # 格式化

# 扩容
sudo lvextend -L +20G /dev/vg_data/lv_data  # 扩容20G
sudo lvextend -l +100%FREE /dev/vg_data/lv_data  # 使用所有剩余空间
sudo resize2fs /dev/vg_data/lv_data         # 扩展 ext4 文件系统
sudo xfs_growfs /dev/vg_data/lv_data        # 扩展 xfs 文件系统

# 缩容(ext4支持,xfs不支持)
sudo resize2fs /dev/vg_data/lv_data 30G     # 先缩小文件系统
sudo lvreduce -L 30G /dev/vg_data/lv_data   # 再缩小逻辑卷

8.5 Swap 交换分区

bash 复制代码
# 查看当前 swap
free -h
swapon --show

# 创建 swap 文件
sudo fallocate -l 2G /swapfile              # 创建2G文件
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 调整 swappiness(值越低越倾向使用物理内存)
cat /proc/sys/vm/swappiness                 # 查看当前值(默认60)
sudo sysctl vm.swappiness=10                # 临时修改
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf   # 永久修改

# 关闭 swap
sudo swapoff /swapfile
sudo rm /swapfile

九、防火墙与安全

9.1 UFW 防火墙

bash 复制代码
# 基本操作
sudo ufw enable                            # 启用防火墙
sudo ufw disable                           # 关闭
sudo ufw status                             # 查看状态
sudo ufw status verbose                     # 详细状态
sudo ufw reload                             # 重载规则

# 允许/拒绝端口
sudo ufw allow 80/tcp                       # 允许80端口TCP
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp                       # SSH
sudo ufw deny 3306/tcp                      # 拒绝3306
sudo ufw delete allow 3306/tcp             # 删除规则

# 按服务名
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

# 限制访问来源
sudo ufw allow from 192.168.1.0/24 to any port 3306    # 仅允许内网访问MySQL
sudo ufw allow from 192.168.1.100 to any port 22       # 仅允许特定IP SSH

# 端口范围
sudo ufw allow 3000:3100/tcp

# 默认策略
sudo ufw default deny incoming              # 默认拒绝所有入站
sudo ufw default allow outgoing             # 默认允许所有出站

# 重置
sudo ufw reset                             # 重置所有规则

9.2 iptables(底层防火墙)

bash 复制代码
# 查看规则
sudo iptables -L                            # 查看所有规则
sudo iptables -L -n                         # 不解析IP/端口名称
sudo iptables -L -n -v --line-numbers       # 带行号和详细统计

# 添加规则
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT      # 允许80端口
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT      # 允许SSH
sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT   # 允许内网访问MySQL
sudo iptables -A INPUT -j DROP                           # 拒绝其余所有入站

# 删除规则(按行号)
sudo iptables -D INPUT 3                    # 删除第3条INPUT规则

# 保存与恢复
sudo apt install iptables-persistent
sudo netfilter-persistent save              # 保存规则
sudo netfilter-persistent reload            # 恢复规则

# NAT 转发
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:8080
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo sysctl -w net.ipv4.ip_forward=1        # 开启转发

9.3 fail2ban 防暴力破解

bash 复制代码
# 安装
sudo apt install fail2ban

# 查看状态
sudo systemctl status fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd            # 查看 sshd jail 状态
sudo fail2ban-client status sshd            # 查看被封禁的IP

# 配置(推荐创建 local 文件,不直接修改主配置)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
# [sshd]
# enabled = true
# port = 22
# maxretry = 3
# bantime = 3600
# findtime = 600

sudo systemctl restart fail2ban

# 手动解封/封禁
sudo fail2ban-client set sshd unbanip 1.2.3.4
sudo fail2ban-client set sshd banip 1.2.3.4

9.4 SSH 安全配置

bash 复制代码
# 编辑 SSH 配置
sudo nano /etc/ssh/sshd_config
# 推荐安全设置:
# Port 2222                              # 修改默认端口
# PermitRootLogin no                      # 禁止 root 登录
# PasswordAuthentication no              # 禁用密码登录(仅密钥)
# MaxAuthTries 3                         # 最大认证尝试
# LoginGraceTime 30                       # 登录超时
# AllowUsers john                        # 仅允许特定用户
# ClientAliveInterval 300                # 空闲超时检查间隔
# ClientAliveCountMax 2                  # 空闲超时次数

# 重启 SSH 使配置生效
sudo systemctl restart sshd

# SSH 密钥管理
ssh-keygen -t ed25519 -C "john@server"      # 生成密钥对(推荐)
ssh-keygen -t rsa -b 4096 -C "john@server"   # RSA 4096位
ssh-copy-id john@192.168.1.100              # 安装公钥到远程
ssh -i ~/.ssh/id_ed25519 john@server        # 指定密钥
ssh -p 2222 john@server                     # 指定端口

# SSH 隧道与转发
ssh -L 8080:localhost:80 john@server        # 本地端口转发
ssh -R 8080:localhost:80 john@server        # 远程端口转发
ssh -D 1080 john@server                     # 动态 SOCKS 代理

# SSH 配置文件
# ~/.ssh/config
# Host myserver
#     HostName 192.168.1.100
#     User john
#     Port 2222
#     IdentityFile ~/.ssh/id_ed25519
#     ServerAliveInterval 60

十、定时任务

10.1 crontab

bash 复制代码
# 编辑当前用户的定时任务
crontab -e

# 查看当前用户的定时任务
crontab -l

# 编辑其他用户的
sudo crontab -e -u john
sudo crontab -l -u john

# 删除所有定时任务
crontab -r

# Cron 表达式格式:
# ┌───── 分钟 (0-59)
# │ ┌─── 小时 (0-23)
# │ │ ┌─ 日 (1-31)
# │ │ │ ┌ 月 (1-12)
# │ │ │ │ ┌ 周 (0-7, 0和7都是周日)
# │ │ │ │ │
# * * * * * command

# 示例:
# 0 2 * * *      /opt/backup.sh                # 每天凌晨2点执行
# */10 * * * *   /opt/check.sh                 # 每10分钟执行
# 0 0 * * 0      /opt/weekly.sh               # 每周日凌晨执行
# 0 0 1 * *      /opt/monthly.sh             # 每月1日凌晨执行
# 30 8-18 * * 1-5  /opt/work.sh              # 工作日8:30-18:30每小时30分执行
# 0 0 * * *      /opt/script.sh > /dev/null 2>&1    # 不发送邮件

10.2 系统级定时任务

bash 复制代码
# 系统目录方式(不依赖 crontab -e)
sudo nano /etc/cron.d/mytask
# 写入:
# SHELL=/bin/bash
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 0 2 * * * root /opt/backup.sh

# 预定义目录(按固定周期执行)
# /etc/cron.daily/     每天执行
# /etc/cron.weekly/    每周执行
# /etc/cron.monthly/   每月执行
# /etc/cron.hourly/    每小时执行

# 示例:放入每日目录
sudo cp backup.sh /etc/cron.daily/
sudo chmod +x /etc/cron.daily/backup.sh

# anacron(适合非7x24运行的机器,错过的任务会补执行)
cat /etc/anacrontab

10.3 systemd timer(现代替代方案)

bash 复制代码
# 创建服务单元文件
sudo nano /etc/systemd/system/backup.service
# [Unit]
# Description=Backup Service
# [Service]
# Type=oneshot
# ExecStart=/opt/backup.sh

# 创建定时器单元文件
sudo nano /etc/systemd/system/backup.timer
# [Unit]
# Description=Daily Backup Timer
# [Timer]
# OnCalendar=*-*-* 02:00:00
# Persistent=true
# [Install]
# WantedBy=timers.target

# 启用
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

# 查看
systemctl list-timers --all
systemctl status backup.timer

十一、系统监控与性能调优

11.1 实时监控工具

bash 复制代码
# 系统资源总览
top                                         # CPU/内存/进程
htop                                        # top 增强版(需安装)
atop                                        # 长期监控(需安装)

# 内存
free -h                                     # 内存使用概况
free -h -s 1                                # 每秒刷新
vmstat 1 5                                  # 每秒采样,共5次
vmstat -d                                   # 磁盘IO统计

# CPU
mpstat 1 5                                  # 每秒采样(需 sysstat 包)
cat /proc/cpuinfo                           # CPU信息
lscpu                                       # CPU架构信息
nproc                                       # CPU核心数

# 磁盘IO
iostat -x 1 5                               # 扩展统计,每秒采样
iotop                                       # 查看哪个进程在读写磁盘(需安装)
sudo iotop -o                               # 仅显示有IO活动的进程

# 网络流量
iftop                                       # 实时网络流量(需安装)
nethogs                                     # 按进程查看网络流量
vnstat                                       # 流量统计(需安装)
vnstat -h                                   # 按小时统计

11.2 性能分析

bash 复制代码
# 系统负载
uptime                                     # 1/5/15分钟平均负载
cat /proc/loadavg

# 内存分析
cat /proc/meminfo
# 关键指标:
# MemTotal/MemFree/MemAvailable    总量/空闲/可用
# Buffers/Cached                  缓冲/缓存
# SwapTotal/SwapFree              交换分区

# 磁盘性能测试
sudo dd if=/dev/zero of=/tmp/testfile bs=1M count=1000 oflag=direct
sudo hdparm -Tt /dev/sda                    # 磁盘读写速度测试

# 进程追踪
strace -p 12345                             # 追踪进程系统调用
strace -c -p 12345                          # 统计系统调用
ltrace -p 12345                             # 追踪库函数调用

# 火焰图(需安装 perf-tools)
sudo perf record -F 99 -p 12345 -g -- sleep 30
sudo perf script | flamegraph.pl > flame.svg

# sar 历史性能数据(需 sysstat)
sar -u                                     # CPU使用率
sar -r                                     # 内存
sar -d                                     # 磁盘IO
sar -n DEV                                 # 网络流量
sar -f /var/log/sa/sa29                    # 查看29号的数据

11.3 内核参数调优(sysctl)

bash 复制代码
# 查看当前参数
sysctl -a | grep net.core.somaxconn
cat /proc/sys/net/core/somaxconn

# 临时修改
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w vm.swappiness=10

# 永久修改
sudo nano /etc/sysctl.d/99-custom.conf
# 常用优化参数:
# # 网络优化
# net.core.somaxconn = 65535
# net.core.netdev_max_backlog = 65535
# net.ipv4.tcp_max_syn_backlog = 65535
# net.ipv4.tcp_tw_reuse = 1
# net.ipv4.tcp_fin_timeout = 15
# net.ipv4.ip_local_port_range = 10000 65535
# # 内存优化
# vm.swappiness = 10
# vm.overcommit_memory = 1
# # 文件描述符
# fs.file-max = 2097152
# # 安全
# net.ipv4.conf.all.rp_filter = 1
# net.ipv4.icmp_echo_ignore_broadcasts = 1
# net.ipv4.conf.all.accept_redirects = 0

# 应用
sudo sysctl -p /etc/sysctl.d/99-custom.conf

11.4 资源限制(limits)

bash 复制代码
# 查看当前限制
ulimit -a
ulimit -n                                  # 查看文件描述符上限

# 临时调整
ulimit -n 65535                            # 当前会话生效

# 永久调整(PAM 方式)
sudo nano /etc/security/limits.conf
# 在文件末尾添加:
# *  soft  nofile  65535
# *  hard  nofile  65535
# *  soft  nproc   65535
# *  hard  nproc   65535
# root  soft  nofile  65535
# root  hard  nofile  65535

# systemd 服务方式的资源限制
# sudo systemctl edit nginx
# [Service]
# LimitNOFILE=65535
# LimitNPROC=65535

11.5 文件描述符

bash 复制代码
# 查看系统全局文件描述符限制
cat /proc/sys/fs/file-max
cat /proc/sys/fs/file-nr                    # 已分配/未使用/最大值

# 查看进程的文件描述符
ls /proc/$(pidof nginx)/fd/                # 列出进程打开的所有fd
ls /proc/$(pidof nginx)/fd/ | wc -l        # 统计数量
lsof -p $(pidof nginx) | wc -l             # 使用 lsof

十二、日志管理

12.1 系统日志

bash 复制代码
# rsyslog 日志位置
# /var/log/syslog          系统主日志
# /var/log/auth.log        认证日志(登录、sudo等)
# /var/log/kern.log        内核日志
# /var/log/dmesg           启动信息
# /var/log/daemon.log      守护进程日志

# 查看
tail -f /var/log/syslog                    # 实时跟踪
grep "Failed password" /var/log/auth.log   # 查找失败的登录
grep "sudo" /var/log/auth.log              # 查找 sudo 操作

# dmesg 内核日志
dmesg
dmesg -T                                   # 显示可读时间戳
dmesg --level=err                          # 仅错误
dmesg | grep -i usb                        # USB 相关

# 清理日志
sudo journalctl --vacuum-size=200M         # 限制 journal 占用
sudo truncate -s 0 /var/log/syslog         # 清空文件(保留文件)
sudo rm /var/log/syslog.1                  # 删除轮转的旧日志

12.2 日志轮转(logrotate)

bash 复制代码
# 查看 logrotate 配置
cat /etc/logrotate.conf
ls /etc/logrotate.d/

# 自定义轮转配置示例
sudo nano /etc/logrotate.d/myapp
# /var/log/myapp/*.log {
#     daily
#     rotate 7
#     compress
#     delaycompress
#     missingok
#     notifempty
#     create 0644 www-data www-data
#     postrotate
#         systemctl reload myapp
#     endscript
# }

# 手动执行
sudo logrotate -d /etc/logrotate.d/myapp   # 调试模式(干运行)
sudo logrotate -f /etc/logrotate.d/myapp   # 强制执行
sudo logrotate -f /etc/logrotate.conf      # 全部强制执行

12.3 应用日志分析常用技巧

bash 复制代码
# 按时间段筛选
awk '/2026-08-29 1[0-2]:/' /var/log/syslog          # 10:00-12:59
awk '/Aug 29 1[0-4]:/' /var/log/syslog               # 10:00-14:59

# 统计 IP 访问频次(如 Nginx 日志)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 统计 HTTP 状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 提取 4xx/5xx 错误请求
awk '$9 ~ /^4|^5/ {print}' /var/log/nginx/access.log

# 统计 URL 访问 Top 10
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 合并多个日志文件并按时间排序
sort -m -k1,1 file1.log file2.log

十三、文件传输与同步

13.1 scp

bash 复制代码
# 上传本地文件到远程
scp file.txt john@192.168.1.100:/home/john/
scp -P 2222 file.txt john@192.168.1.100:/home/john/    # 指定端口
scp -i ~/.ssh/id_key file.txt john@192.168.1.100:/tmp/  # 指定密钥

# 下载远程文件到本地
scp john@192.168.1.100:/var/log/syslog ./

# 传输目录
scp -r mydir/ john@192.168.1.100:/tmp/

# 两台远程之间传输
scp john@host1:/file john@host2:/file

13.2 rsync(增量同步,推荐)

bash 复制代码
# 基本同步
rsync -avz source/ remote:/path/           # 同步目录到远程
rsync -avz remote:/path/ source/           # 从远程拉取
rsync -avz --progress source/ remote:/path/  # 显示进度

# 常用参数:
# -a  归档模式(保留权限、属主、时间、软链接等)
# -v  详细输出
# -z  压缩传输
# -P  显示进度 + 支持断点续传
# --delete  删除目标中源端已不存在的文件(保持完全一致)
# --exclude  排除文件

# 实用示例
rsync -avz --delete /var/www/ user@server:/var/www/          # 网站镜像同步
rsync -avz --exclude='*.log' /app/ user@server:/app/         # 排除日志
rsync -avz --exclude-from='exclude.txt' /app/ user@server:/app/  # 从文件读取排除列表
rsync -avz --max-size='50M' source/ dest/                     # 仅同步50M以下文件
rsync -avz --remove-source-files source/ dest/                # 同步后删除源文件

# 本地备份
rsync -avz --delete /data/ /backup/data/

13.3 wget 与 curl 下载

bash 复制代码
# 批量下载
wget -i url_list.txt                       # 从文件读取 URL 列表
wget -i url_list.txt -P /downloads/        # 指定保存目录

# 镜像网站
wget --mirror --convert-links --page-requisites --no-parent https://example.com/docs/

# curl 批量上传
curl -F "file=@photo.jpg" https://example.com/upload
curl -F "file=@doc.pdf" -F "name=report" https://example.com/upload

十四、备份与恢复

14.1 常用备份策略

bash 复制代码
# tar 全量备份
sudo tar -zcvf /backup/system-$(date +%Y%m%d).tar.gz \
    --exclude=/backup \
    --exclude=/proc \
    --exclude=/sys \
    --exclude=/dev \
    --exclude=/run \
    --exclude=/tmp \
    /

# tar 增量备份
sudo tar -zcvf /backup/inc-$(date +%Y%m%d).tar.gz \
    --listed-incremental=/backup/snapshot.snar \
    /var/www/

# 恢复
sudo tar -zxvpf /backup/system-20260829.tar.gz -C /     # 全量恢复
sudo tar --listed-incremental=/backup/snapshot.snar \
    -zxvpf /backup/inc-20260829.tar.gz -C /              # 增量恢复

14.2 数据库备份

bash 复制代码
# MySQL 逻辑备份
mysqldump -u root -p mydb > mydb_$(date +%Y%m%d).sql
mysqldump -u root -p --all-databases > alldb_$(date +%Y%m%d).sql
mysqldump -u root -p --single-transaction mydb > mydb.sql    # InnoDB 一致性备份
mysqldump -u root -p --no-data mydb > schema.sql             # 仅结构
mysqldump -u root -p --no-create-info mydb > data.sql        # 仅数据

# MySQL 恢复
mysql -u root -p mydb < mydb.sql
mysql -u root -p < alldb.sql

# PostgreSQL 备份与恢复
pg_dump -U postgres mydb > mydb.sql
pg_dumpall -U postgres > alldb.sql
psql -U postgres mydb < mydb.sql

14.3 rsync 定时备份脚本示例

bash 复制代码
#!/bin/bash
# /opt/backup-rsync.sh

BACKUP_DIR="/backup/$(date +%Y%m%d)"
SOURCE="/var/www/"
REMOTE="backup@nas::backup"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# rsync 同步
rsync -avz --delete \
    --exclude='*.log' \
    --exclude='cache/' \
    "$SOURCE" "$BACKUP_DIR/"

# 检查执行结果
if [ $? -eq 0 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') Backup completed: $BACKUP_DIR" >> /var/log/backup.log
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') Backup FAILED!" >> /var/log/backup.log
    # 发送告警(如配置了邮件)
    echo "Backup failed on $(hostname)" | mail -s "Backup Alert" admin@example.com
fi

# 清理30天前的备份
find /backup -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;

十五、Shell 脚本常用技巧

15.1 文本处理三剑客

bash 复制代码
# sed(流编辑器)
sed 's/old/new/g' file.txt                 # 全局替换
sed -i 's/old/new/g' file.txt             # 直接修改文件
sed -i.bak 's/old/new/g' file.txt         # 修改并备份原文件
sed -n '10,20p' file.txt                  # 打印10-20行
sed '/^#/d' file.txt                      # 删除注释行
sed '/^$/d' file.txt                      # 删除空行
sed '3a\new line' file.txt                # 在第3行后添加
sed -e 's/a/A/g' -e 's/b/B/g' file.txt   # 多条命令

# awk(文本分析)
awk '{print $1, $4}' access.log           # 打印第1和第4列
awk -F: '{print $1, $3}' /etc/passwd      # 以:分割,打印第1和第3列
awk 'NR==5' file.txt                      # 打印第5行
awk 'NR>=10 && NR<=20' file.txt           # 打印10-20行
awk '$3 > 100' file.txt                   # 第3列大于100的行
awk '{sum += $1} END {print sum}' nums.txt    # 求和
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log  # 统计IP频次
awk 'length > 80' file.txt                # 超过80字符的行

# cut / sort / uniq / tr
cut -d: -f1 /etc/passwd                   # 以:分割取第1列
cut -c1-10 file.txt                       # 取每行前10个字符
sort file.txt                             # 排序
sort -rn file.txt                         # 逆序数字排序
sort -u file.txt                          # 排序并去重
uniq file.txt                             # 去除相邻重复行
sort file.txt | uniq -c                   # 去重并统计出现次数
sort file.txt | uniq -c | sort -rn        # 按出现次数降序排列
tr 'a-z' 'A-Z' < file.txt                 # 小写转大写
tr -d '\r' < windows.txt > unix.txt       # 删除回车符
tr -s ' ' < file.txt                      # 压缩连续空格为单个

15.2 实用组合命令

bash 复制代码
# 查找并删除大文件
find /var/log -type f -size +500M -exec ls -lh {} \;
find /var/log -type f -size +500M -exec rm -f {} \;

# 查找并修改权限
find /var/www -type f -name "*.php" -exec chmod 644 {} \;
find /var/www -type d -exec chmod 755 {} \;

# 批量重命名
for f in *.JPG; do mv "$f" "${f%.JPG}.jpg"; done
rename 's/.JPG$/.jpg/' *.JPG               # 使用 rename 命令

# 快速查看最占空间的文件/目录
du -ah /var | sort -rh | head -20

# 查找并终止占用端口的进程
sudo fuser -k 8080/tcp                     # 杀死占用8080的进程
sudo kill $(sudo lsof -t -i:8080)          # 另一种方式

# 统计代码行数
find . -name "*.py" | xargs wc -l | tail -1
find . -name "*.py" -exec cat {} \; | wc -l

# 批量解压
for f in *.tar.gz; do tar -zxf "$f"; done

# 监控命令输出变化
watch -n 2 'ls -l /var/log/syslog'         # 每2秒查看一次
watch -n 5 -d 'ss -tln'                     # 每5秒刷新并高亮变化

15.3 判断与循环

bash 复制代码
# 条件判断
if [ -f /etc/nginx/nginx.conf ]; then
    echo "Nginx config exists"
fi

if [ ! -d /var/backup ]; then
    mkdir -p /var/backup
fi

if [ $? -eq 0 ]; then
    echo "Success"
else
    echo "Failed"
fi

# for 循环
for i in {1..10}; do
    echo "Server $i"
done

for file in *.log; do
    gzip "$file"
done

for ip in 192.168.1.{1..10}; do
    ping -c 1 -W 1 "$ip" >/dev/null 2>&1 && echo "$ip is up"
done

# while 循环
while read line; do
    echo "$line"
done < file.txt

i=0
while [ $i -lt 10 ]; do
    echo $i
    ((i++))
done

十六、Docker 与容器管理

16.1 Docker 基础

bash 复制代码
# 安装 Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER               # 当前用户加入 docker 组
# 重新登录后生效

# 镜像管理
docker pull nginx:latest
docker images
docker rmi nginx
docker build -t myapp:1.0 .
docker tag myapp:1.0 registry.com/myapp:1.0
docker push registry.com/myapp:1.0
docker save -o myapp.tar myapp:1.0           # 导出镜像
docker load -i myapp.tar                     # 导入镜像

# 容器管理
docker run -d --name web -p 80:80 nginx      # 后台运行并映射端口
docker run -it --name test ubuntu:22.04 bash    # 交互式运行
docker run -d --name db \
    -e MYSQL_ROOT_PASSWORD=secret \
    -v /data/mysql:/var/lib/mysql \
    mysql:8

docker ps                                    # 查看运行中的容器
docker ps -a                                 # 查看所有容器
docker stop web
docker start web
docker restart web
docker rm web
docker rm -f $(docker ps -aq)               # 强制删除所有容器

# 进入容器
docker exec -it web bash
docker exec -it web sh                      # 镜像无 bash 时用 sh
docker attach web                           # 连接到容器主进程

# 查看日志与信息
docker logs web
docker logs -f --tail 100 web
docker inspect web
docker stats                                # 实时资源占用
docker top web                              # 容器内进程

# 清理
docker system prune                         # 清理无用数据
docker system prune -a                      # 清理所有未使用的镜像
docker volume prune                         # 清理未使用的卷
docker image prune -a                      # 清理所有未使用镜像

16.2 Docker Compose

bash 复制代码
# 安装
sudo apt install docker-compose-plugin     # Ubuntu 22.04+

# 常用命令
docker compose up -d                       # 后台启动
docker compose up -d --build               # 重新构建并启动
docker compose down                        # 停止并删除
docker compose down -v                     # 同时删除卷
docker compose ps                          # 查看状态
docker compose logs -f web                 # 查看日志
docker compose exec web bash               # 进入容器
docker compose restart web                # 重启单个服务
docker compose pull                        # 拉取最新镜像

16.3 容器运维常用技巧

bash 复制代码
# 查看容器资源限制
docker inspect web --format '{{.HostConfig.Memory}}'

# 容器与主机文件互拷
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./nginx.conf web:/etc/nginx/nginx.conf

# 查看容器内网络
docker network ls
docker network inspect bridge
docker network create mynet
docker run --network mynet --name app myapp

# 数据卷管理
docker volume ls
docker volume create mydata
docker volume inspect mydata
docker volume rm mydata

# 查看容器磁盘占用
docker system df
docker system df -v                        # 详细信息

十七、系统更新与升级

17.1 常规更新

bash 复制代码
# 更新所有软件包
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y                      # 清理不需要的包
sudo apt autoclean                          # 清理旧包缓存

# 清理 apt 缓存释放空间
sudo du -sh /var/cache/apt/archives/
sudo apt clean                              # 清理所有缓存包
sudo apt autoclean                          # 仅清理过期的缓存包

17.2 大版本升级(LTS 到 LTS)

bash 复制代码
# 安装升级工具
sudo apt install update-manager-core

# 检查并升级
sudo do-release-upgrade                     # 正式版升级
sudo do-release-upgrade -d                  # 升级到开发版

# 升级前准备(建议)
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
sudo apt clean
# 备份重要数据
# 确认磁盘空间充足

17.3 内核管理

bash 复制代码
# 查看已安装内核
dpkg --list | grep linux-image
uname -r                                    # 当前运行的内核

# 查看可用内核
apt list --installed | grep linux-image

# 删除旧内核(保留当前和上一个)
sudo apt purge linux-image-5.15.0-25-generic
sudo update-grub                            # 更新 GRUB

# 安全自动清理
sudo apt autoremove --purge                 # 自动清理旧内核和依赖

十八、实用工具与快捷操作

18.1 文本编辑器

bash 复制代码
# nano(最简单)
nano filename
# Ctrl+O 保存  Ctrl+X 退出  Ctrl+K 剪切行  Ctrl+U 粘贴  Ctrl+W 搜索

# vim
vim filename
# 命令模式:i(插入) ESC(回命令模式) :w(保存) :q(退出) :wq(保存退出)
# :q!(强制退出不保存)  /word(搜索)  dd(删除行)  yy(复制行)  p(粘贴)
# :%s/old/new/g(全局替换)  :set number(显示行号)

# 设置默认编辑器
sudo update-alternatives --config editor

18.2 终端效率工具

bash 复制代码
# 历史命令
history
history | grep nginx                       # 搜索历史
!!                                          # 执行上一条命令
sudo !!                                     # 以 root 执行上一条
!100                                        # 执行第100条历史命令
!nginx                                      # 执行最近以 nginx 开头的命令
Ctrl+R                                      # 反向搜索历史(交互式)

# 命令别名
alias ll='ls -alF'
alias la='ls -A'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias df='df -h'
alias free='free -h'
alias ports='ss -tlnp'

# 永久别名:写入 ~/.bashrc 或 ~/.bash_aliases
# source ~/.bashrc  # 立即生效

18.3 系统信息一键查看

bash 复制代码
# 快速查看系统概况
echo "=== OS ===" && cat /etc/os-release | head -5
echo "=== Kernel ===" && uname -r
echo "=== CPU ===" && lscpu | grep -E "^(Model name|CPU\(s\)|Thread|Core)"
echo "=== Memory ===" && free -h
echo "=== Disk ===" && df -h /
echo "=== Uptime ===" && uptime
echo "=== IP ===" && hostname -I

18.4 实用运维脚本片段

bash 复制代码
# 一键查看服务器公网IP
curl ifconfig.me
curl ipinfo.io/ip
curl -s checkip.amazonaws.com

# 批量检测端口连通性
for port in 22 80 443 3306 6379; do
    timeout 2 bash -c "echo >/dev/tcp/192.168.1.100/$port" 2>/dev/null \
    && echo "Port $port: OPEN" \
    || echo "Port $port: CLOSED"
done

# 快速释放内存(清理缓存)
sync && sudo sysctl -w vm.drop_caches=3

# 查找最近修改的文件
find /etc -type f -mtime -1                # 24小时内修改过的配置文件
find /var/www -type f -mmin -60            # 60分钟内修改过的文件

# 一键查看系统所有监听端口及对应进程
sudo ss -tlnp | awk 'NR>1{print $4, $6}' | sort

# 生成随机密码
openssl rand -base64 16
tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 20; echo

# 生成 SSH 密钥对
ssh-keygen -t ed25519 -C "$(whoami)@$(hostname)" -f ~/.ssh/id_ed25519

附录:命令速查表

常用快捷键

快捷键 功能
Ctrl+A 光标移到行首
Ctrl+E 光标移到行尾
Ctrl+U 删除光标前到行首的内容
Ctrl+K 删除光标到行尾的内容
Ctrl+W 删除光标前一个单词
Ctrl+R 反向搜索历史命令
Ctrl+L 清屏(同 clear
Ctrl+C 终止当前命令
Ctrl+Z 挂起当前命令(用 fg 恢复)
Ctrl+D 退出当前 Shell(同 exit
Tab 自动补全
Tab Tab 显示所有补全选项

常见目录速查

路径 说明
/etc 系统配置文件
/var/log 系统日志
/var/www Web 根目录(常见)
/opt 第三方软件安装目录
/home 用户主目录
/tmp 临时文件(重启后可能清空)
/usr/local/bin 用户自编译程序
/srv 服务数据目录
/etc/systemd/system 自定义 systemd 服务文件
/etc/cron.d 系统级定时任务
/etc/netplan 网络配置(Netplan)
/etc/apt/sources.list.d APT 软件源
~/.ssh SSH 密钥与配置
~/.bashrc Bash 配置(别名、环境变量等)

权限数字速查

数字 权限 说明
7 rwx 读+写+执行
6 rw- 读+写
5 r-x 读+执行
4 r-- 只读
3 -wx 写+执行
2 -w- 只写
1 --x 只执行
0 --- 无权限

常见组合:755(目录/脚本)、644(普通文件)、600(密钥文件)、700(私有目录)


本文基于 Ubuntu 22.04 LTS / 24.04 LTS 整理,部分命令在其他 Linux 发行版上同样适用。建议在实际生产环境中操作前先在测试环境验证。

DuMate AI生成

相关推荐
前端 贾公子24 分钟前
第09章:上下文与记忆 (2)
java·服务器·前端
CDN36034 分钟前
节点智能调度实操:解决出海区域访问快慢不均、节点拥堵、跨洋延迟高,CDN 全网择优落地方案
运维·服务器·网络
roman_日积跬步-终至千里1 小时前
【数据治理(6)】DataOps 不是调度工具,而是让数据产品长期可信的运行机制
java·服务器·网络
白清羽2 小时前
7.3系统安装docker
运维·docker·容器
Dovis(誓平步青云)2 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
翼龙云_cloud3 小时前
阿里云国际渠道代理商:如何在ECS上部署Flask应用?
运维·数据库·阿里云·flask·云计算
GGG7663 小时前
Python 运维自动化:psutil+IPy 系统与网络信息采集深度实战
运维·python·云原生·pip
可乐鸡翅yeah_3 小时前
个人 / 外包流媒体项目交付实战,M3U8 验收与问题闭环完整工作流
运维·网络·python·低代码·django·m3u8·在线播放
2601_962071573 小时前
如何利用SpringSecurity进行认证与授权
java·服务器·数据库