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生成