Debian 12 系统管理与 Shell 脚本编程完全指南
本文档旨在为 Debian 12 用户提供一个全面的参考手册,涵盖系统管理的常用命令、网络配置、服务管理、性能监控、安全设置,以及 Shell 脚本编程的完整语法与实践技巧。内容从基础到进阶,包含大量示例,帮助读者快速掌握 Debian 系统的运维与自动化能力。
第一部分:Debian 12 系统管理命令大全
1. 基础命令与系统信息
1.1 基本命令
| 命令 | 说明 | 示例 |
|---|---|---|
ls | 列出目录内容 | ls -la /home 显示所有文件(包括隐藏)的详细信息 |
cd | 切换目录 | cd /var/log |
pwd | 显示当前路径 | pwd |
echo | 输出字符串或变量 | echo $HOME |
cat | 查看文件内容 | cat /etc/os-release |
less | 分页查看文件 | less /var/log/syslog |
head / tail | 查看文件头部/尾部 | tail -f /var/log/nginx/access.log 实时追踪 |
man | 查看命令手册 | man ls |
which | 查找命令路径 | which python3 |
history | 命令历史 | history \| grep apt |
clear | 清屏 | clear |
1.2 系统信息查询
| 命令 | 说明 | 示例 |
|---|---|---|
uname -a | 显示内核与系统信息 | uname -r 查看内核版本 |
hostnamectl | 显示或修改主机名及相关信息 | hostnamectl set-hostname myserver |
cat /etc/debian_version | 查看 Debian 版本 | cat /etc/debian_version |
lsb_release -a | 显示发行版详细信息 | lsb_release -a |
uptime | 系统运行时间与负载 | uptime |
date | 显示或设置系统时间 | date +"%Y-%m-%d %H:%M:%S" |
cal | 显示日历 | cal 2025 |
bc | 计算器 | echo "scale=2; 10/3" \| bc |
1.3 帮助与文档
help:查看 Shell 内置命令帮助(如help cd)info:查看更详细的 GNU 文档(如info grep)whatis:显示命令的简要说明apropos:搜索相关命令(如apropos network)
2. 文件与目录操作
2.1 创建、删除、移动、复制
| 命令 | 说明 | 示例 |
|---|---|---|
mkdir | 创建目录 | mkdir -p /tmp/test/subdir 递归创建 |
rmdir | 删除空目录 | rmdir emptydir |
rm | 删除文件或目录 | rm -rf /tmp/test 强制递归删除 |
cp | 复制 | cp -a source dest 归档复制(保留属性) |
mv | 移动或重命名 | mv oldname newname |
touch | 创建空文件或更新时间戳 | touch file.txt |
ln | 创建链接 | ln -s /real/file symlink 软链接 |
2.2 文件属性与权限
| 命令 | 说明 | 示例 |
|---|---|---|
chmod | 修改权限 | chmod 755 script.sh 或 chmod u+x script.sh |
chown | 修改所有者 | chown user:group file.txt |
chgrp | 修改所属组 | chgrp developers file.txt |
umask | 设置默认权限掩码 | umask 022(新文件权限 644,目录 755) |
lsattr / chattr | 查看/修改文件特殊属性 | chattr +i important.conf 设置不可修改 |
2.3 文件查找与定位
| 命令 | 说明 | 示例 |
|---|---|---|
find | 强大搜索工具 | find /var -name "*.log" -mtime -7 7天内修改的日志 |
locate | 快速搜索文件名(需更新数据库) | locate nginx.conf |
whereis | 查找命令的二进制、源码和 man 页 | whereis ls |
which | 查找命令路径 | which systemctl |
type | 显示命令类型(内置、别名、外部) | type cd |
3. 文本处理三剑客:grep、sed、awk
3.1 grep:文本搜索
# 基本用法
grep "error" /var/log/syslog
grep -i "warning" /var/log/syslog # 忽略大小写
grep -r "main" /etc/nginx/ # 递归搜索
grep -v "debug" app.log # 排除匹配行
grep -E "error|fail" log.txt # 扩展正则(多个模式)
grep -c "success" access.log # 统计匹配行数
3.2 sed:流编辑器
# 替换文本
sed 's/old/new/g' file.txt # 替换所有 old 为 new
sed -i 's/old/new/g' file.txt # 直接修改文件
# 删除行
sed '/^#/d' config.conf # 删除注释行
# 打印特定行
sed -n '10,20p' file.txt # 打印10-20行
# 行后追加
sed '/pattern/a\new line' file.txt
3.3 awk:文本处理工具
# 打印特定列
awk '{print $1, $3}' data.txt # 打印第1和第3列
awk -F: '{print $1}' /etc/passwd # 指定分隔符为冒号
# 条件过滤
awk '$3 > 100 {print $1}' data.txt
# 内置变量
awk '{print NR, $0}' file.txt # 显示行号
# 统计求和
awk '{sum+=$1} END {print sum}' numbers.txt
4. 用户与组管理
4.1 用户管理
| 命令 | 说明 | 示例 |
|---|---|---|
useradd | 创建用户 | useradd -m -G sudo -s /bin/bash alice |
usermod | 修改用户属性 | usermod -aG docker alice 添加到 docker 组 |
userdel | 删除用户 | userdel -r alice 同时删除家目录和邮件池 |
passwd | 修改用户密码 | passwd alice |
chage | 修改密码过期信息 | chage -l alice 查看密码策略 |
id | 显示用户 ID 和所属组 | id alice |
4.2 组管理
| 命令 | 说明 | 示例 |
|---|---|---|
groupadd | 创建组 | groupadd developers |
groupmod | 修改组属性 | groupmod -n newname oldname |
groupdel | 删除组 | groupdel developers |
gpasswd | 管理组成员 | gpasswd -a alice developers 添加用户到组 |
4.3 查看登录用户
| 命令 | 说明 |
|---|---|
who | 显示当前登录用户 |
w | 显示登录用户及其活动 |
last | 显示最近登录记录 |
lastlog | 显示所有用户的最近登录时间 |
5. 磁盘与文件系统管理
5.1 磁盘分区与格式化
# 查看磁盘
lsblk
fdisk -l
# 分区(以 /dev/sdb 为例)
fdisk /dev/sdb
# 在交互界面中使用 n 新建分区,w 保存
# 格式化
mkfs.ext4 /dev/sdb1
mkfs.xfs /dev/sdb2
mkswap /dev/sdb3 # 创建交换分区
swapon /dev/sdb3 # 启用交换
# 挂载
mount /dev/sdb1 /mnt/data
# 永久挂载:编辑 /etc/fstab,添加一行
UUID=xxx /mnt/data ext4 defaults 0 2
5.2 磁盘空间查看
df -h # 查看文件系统使用情况
du -sh /home # 统计目录大小
du -h --max-depth=1 /var # 显示 /var 下各目录大小
ncdu # 交互式磁盘分析工具(需安装)
5.3 文件系统检查与修复
umount /dev/sdb1 # 先卸载
fsck /dev/sdb1 # 检查并修复
fsck -f /dev/sdb1 # 强制检查即使看起来干净
5.4 LVM 逻辑卷管理(高级)
pvcreate、vgcreate、lvcreate等,适合动态调整磁盘空间。
6. 软件包管理:APT 与 DPKG
6.1 APT 高级包管理工具
# 更新软件源列表
apt update
# 升级所有已安装软件
apt upgrade
# 升级系统版本(谨慎)
apt full-upgrade
# 安装软件
apt install nginx
# 删除软件(保留配置文件)
apt remove nginx
# 彻底删除(包括配置文件)
apt purge nginx
# 自动删除不再需要的依赖
apt autoremove
# 搜索软件包
apt search nginx
# 显示软件包信息
apt show nginx
# 列出已安装软件
apt list --installed
6.2 DPKG 底层包管理
# 安装本地 .deb 包
dpkg -i package.deb
# 移除包
dpkg -r package
# 列出包中文件
dpkg -L package
# 查找文件属于哪个包
dpkg -S /bin/ls
# 重新配置已安装包
dpkg-reconfigure package
6.3 软件源配置
源文件:/etc/apt/sources.list 和 /etc/apt/sources.list.d/ 下的文件。
# 示例:添加阿里云镜像
deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware
deb-src https://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware
7. 进程与作业管理
7.1 查看进程
ps aux # 所有进程
ps -ef # 全格式
ps -eLf # 显示线程
top / htop # 动态监控
pstree # 树状显示
pgrep nginx # 查找 nginx 进程 PID
7.2 终止进程
kill PID # 默认 SIGTERM
kill -9 PID # 强制 SIGKILL
pkill nginx # 根据进程名终止
killall nginx # 同上
7.3 作业控制
command & # 后台运行
jobs # 列出后台作业
fg %1 # 将作业1调回前台
bg %1 # 将作业1放到后台运行
Ctrl+Z # 挂起当前前台进程
nohup command & # 退出终端后继续运行
7.4 优先级控制
nice -n 10 command # 以较低优先级启动
renice -n 5 -p PID # 调整运行中进程优先级
8. 系统服务管理(Systemd)
Debian 12 使用 systemd 作为初始化系统。
| 命令 | 说明 | 示例 |
|---|---|---|
systemctl start service | 启动服务 | systemctl start nginx |
systemctl stop service | 停止服务 | systemctl stop nginx |
systemctl restart service | 重启服务 | systemctl restart nginx |
systemctl reload service | 重载配置(不中断) | systemctl reload nginx |
systemctl enable service | 设置开机自启 | systemctl enable nginx |
systemctl disable service | 禁用开机自启 | systemctl disable nginx |
systemctl status service | 查看服务状态 | systemctl status nginx |
systemctl list-units --type=service | 列出所有服务 | |
systemctl daemon-reload | 重新加载 systemd 配置 | 修改 unit 文件后执行 |
journalctl -u service | 查看服务日志 | journalctl -u nginx -f 实时跟踪 |
9. 网络配置与管理
9.1 网络接口配置
# 查看接口
ip addr show
ip link show
# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down
# 临时配置 IP
ip addr add 192.168.1.100/24 dev eth0
ip route add default via 192.168.1.1
# 永久配置(编辑 /etc/network/interfaces 或使用 NetworkManager)
# Debian 12 默认使用 ifupdown,也可安装 netplan 或 NetworkManager
9.2 DNS 配置
- 编辑
/etc/resolv.conf(临时) - 永久配置:在
/etc/network/interfaces中添加dns-nameservers 8.8.8.8,或使用 systemd-resolved。
9.3 网络测试与诊断
ping -c 4 baidu.com
traceroute baidu.com
mtr baidu.com # 结合 ping 和 traceroute
ss -tuln # 查看监听端口
netstat -tuln # 同上(需安装 net-tools)
nmap localhost # 扫描开放端口
curl -I https://example.com
wget -O /dev/null https://example.com
9.4 防火墙管理
Debian 12 支持 nftables(默认)和 iptables。简单防火墙可使用 ufw。
# ufw 使用示例
apt install ufw
ufw enable
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow from 192.168.1.0/24 to any port 22
ufw status numbered
10. 性能监控与调优
10.1 系统负载
uptime
cat /proc/loadavg
top
htop
10.2 CPU 监控
mpstat -P ALL 1 # 每个 CPU 核心使用情况
sar -u 1 5 # 每1秒采样5次
10.3 内存监控
free -h
vmstat 1
cat /proc/meminfo
10.4 磁盘 I/O
iostat -x 1 # 详细 I/O 统计
iotop # 按进程显示 I/O(需安装)
dstat # 全能监控
10.5 网络带宽
iftop # 实时流量(需安装)
nethogs # 按进程显示(需安装)
vnstat # 流量统计(需初始化)
iptraf-ng # 交互式监控
10.6 日志查看
journalctl -f # 实时跟踪系统日志
dmesg -w # 实时内核日志
tail -f /var/log/syslog
11. 备份与恢复
11.1 使用 rsync
# 本地同步
rsync -av /source/ /destination/
# 远程同步
rsync -avz /local/ user@remote:/backup/
# 增量备份 + 删除目标多余文件
rsync -av --delete /source/ /backup/
11.2 使用 tar 打包
# 创建备份
tar -czf backup-$(date +%Y%m%d).tar.gz /etc /home
# 解压恢复
tar -xzf backup-20250101.tar.gz -C /restore
11.3 使用 dd 克隆磁盘
dd if=/dev/sda of=/dev/sdb bs=4M status=progress
11.4 数据库备份
# MySQL/MariaDB
mysqldump -u root -p dbname > db.sql
# PostgreSQL
pg_dump dbname > db.sql
12. 安全加固
12.1 SSH 安全配置
编辑 /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
Port 2222 # 更改默认端口
AllowUsers alice bob
然后重启 systemctl restart sshd。
12.2 自动安全更新
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
12.3 使用 fail2ban 防止暴力破解
apt install fail2ban
systemctl enable fail2ban --now
12.4 审计与日志
auditd:系统调用审计logwatch:日志分析报告
第二部分:Shell 脚本编程完全教程
1. Shell 基础
1.1 脚本结构
#!/bin/bash
# 这是注释
echo "Hello, World!"
- 第一行
#!称为 shebang,指定解释器。 - 保存文件后赋予执行权限:
chmod +x script.sh
1.2 执行方式
./script.sh # 需要执行权限
bash script.sh # 作为参数执行
source script.sh # 在当前 Shell 中执行(可保留变量)
. script.sh # 同 source
2. 变量进阶
2.1 变量替换与默认值
| 语法 | 说明 |
|---|---|
${var:-default} | 若 var 未定义或为空,返回 default |
${var:=default} | 若 var 未定义或为空,赋值为 default 并返回 |
${var:+value} | 若 var 已定义且非空,返回 value,否则返回空 |
${var:?error} | 若 var 未定义或为空,输出 error 并退出 |
示例:
echo ${USER:-guest}
: ${PORT:=8080} # 如果 PORT 未设置,设为 8080
2.2 字符串操作
str="hello world"
echo ${#str} # 长度 11
echo ${str:6} # 从第6个字符开始:world
echo ${str:6:3} # 从第6个取3个:wor
echo ${str/world/earth} # 替换第一个 world
echo ${str//o/a} # 替换所有 o 为 a
2.3 只读变量与 declare
declare -r readonly_var="不可改"
declare -i number=10 # 声明整数
number="abc" # 会被赋值为0
declare -a array # 声明数组
declare -A map # 声明关联数组
3. 数组高级操作
3.1 索引数组
fruits=("apple" "banana" "orange")
fruits[3]="grape"
# 获取所有元素
echo "${fruits[@]}"
echo "${fruits[*]}" # 所有元素作为单个字符串
# 数组长度
echo "${#fruits[@]}"
# 带索引遍历
for i in "${!fruits[@]}"; do
echo "$i: ${fruits[$i]}"
done
3.2 关联数组(需要 Bash 4+)
declare -A user
user[name]="Alice"
user[age]=30
user[city]="New York"
echo "${user[name]}"
echo "${!user[@]}" # 输出所有键
4. 运算符与表达式
4.1 算术运算
# 方法1:$(( ))
a=5
b=$((a * 3 + 2))
# 方法2:let
let "c = a + b"
# 方法3:expr(过时,注意空格)
c=`expr $a + $b`
# 方法4:bc 处理浮点数
echo "scale=2; $a / 3" | bc
4.2 条件测试
推荐使用 [[ ]](Bash 关键字)而不是 [ ],支持更多操作符和模式匹配。
if [[ $a -gt 0 && $a -lt 10 ]]; then
echo "a 在 1-9 之间"
fi
# 字符串比较
if [[ $str == "hello" ]]; then
echo "相等"
fi
# 正则匹配
if [[ $str =~ ^h.*o$ ]]; then
echo "以 h 开头,以 o 结尾"
fi
# 文件测试
if [[ -f "$file" && -r "$file" ]]; then
echo "文件存在且可读"
fi
5. 流程控制深入
5.1 case 语句模式匹配
case $1 in
start)
echo "Starting..."
;;
stop|kill)
echo "Stopping..."
;;
[0-9][0-9]) # 两位数字
echo "Number: $1"
;;
*) # 默认
echo "Unknown option"
;;
esac
5.2 select 菜单
PS3="请选择操作:"
select opt in 启动 停止 重启 退出; do
case $opt in
启动)
echo "启动服务"
;;
停止)
echo "停止服务"
;;
重启)
echo "重启服务"
;;
退出)
break
;;
*)
echo "无效选择"
;;
esac
done
5.3 循环控制
# 遍历文件
for file in /etc/*.conf; do
echo "处理 $file"
done
# while 读取文件
while IFS= read -r line; do
echo "行: $line"
done < /etc/hosts
# 无限循环
while true; do
# do something
sleep 1
done
6. 函数深入
6.1 函数定义与返回值
# 返回值只能是整数 0-255
get_number() {
return 42
}
get_number
echo $? # 输出 42
# 通过 echo 返回字符串
get_string() {
echo "Hello"
}
result=$(get_string)
6.2 局部变量与作用域
global_var="全局"
func() {
local local_var="局部"
global_var="被修改"
echo "内部:$local_var"
}
func
echo "外部:$global_var" # 输出:被修改
# echo $local_var # 为空(已销毁)
6.3 函数库示例
创建 utils.sh:
#!/bin/bash
log_info() {
echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
echo "[ERROR] $1" >&2
}
在脚本中引入:
source ./utils.sh
log_info "脚本开始"
7. 输入/输出重定向进阶
7.1 文件描述符
- 0:标准输入
- 1:标准输出
- 2:标准错误
# 重定向 stdout 和 stderr 到不同文件
command > out.txt 2> err.txt
# 将 stderr 重定向到 stdout
command > all.log 2>&1
command &> all.log # 简写
# 丢弃所有输出
command > /dev/null 2>&1
# 将 stdout 追加到文件,同时显示在终端
command | tee output.txt
# 将 stdout 和 stderr 都通过管道
command 2>&1 | tee output.txt
7.2 Here Document 高级用法
# 忽略前导 tab(使用 <<-)
cat <<-EOF
这是一行
另一行
EOF
# 变量替换(默认替换)
name="Alice"
cat <<EOF
Hello, $name
EOF
# 禁止变量替换(加引号)
cat <<'EOF'
变量 $name 不会被展开
EOF
7.3 Here String
grep "error" <<< "This is an error message"
8. 信号处理与陷阱
8.1 常用信号
SIGINT(2):Ctrl+C 中断SIGTERM(15):终止SIGKILL(9):强制终止(无法捕获)SIGHUP(1):挂起(常用来重载配置)
8.2 使用 trap 捕获信号
cleanup() {
echo "正在清理临时文件..."
rm -f /tmp/tempfile
exit 0
}
trap cleanup SIGINT SIGTERM
# 忽略信号
trap '' SIGINT
# 恢复默认处理
trap - SIGINT
8.3 防止脚本被多次运行
lockfile=/tmp/myscript.lock
if [ -e "$lockfile" ]; then
echo "脚本已在运行,退出"
exit 1
fi
touch "$lockfile"
trap "rm -f $lockfile" EXIT # 脚本退出时删除锁
# 脚本主体...
9. 脚本调试技巧
9.1 调试选项
bash -n script.sh # 语法检查(不执行)
bash -x script.sh # 跟踪执行,显示每行命令及其展开
bash -v script.sh # 显示输入的每一行
9.2 在脚本中开启调试
set -x # 开启调试
set +x # 关闭调试
set -e # 遇到错误立即退出
set -u # 使用未定义变量时报错
set -o pipefail # 管道中任一命令失败即失败
常用组合:
set -euo pipefail
9.3 自定义调试输出
DEBUG=true
debug() {
if $DEBUG; then
echo "DEBUG: $*" >&2
fi
}
debug "变量值为 $var"
10. 正则表达式与模式匹配
10.1 在条件测试中使用正则
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "有效邮箱"
fi
10.2 使用 grep 与正则
grep -E "^[0-9]{3}-[0-9]{4}$" phones.txt # 匹配电话格式
grep -P "\d{3}-\d{4}" phones.txt # 使用 Perl 正则(GNU grep)
10.3 sed 中的正则
sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2}/日期/g' file.txt
11. 实用脚本示例
11.1 系统信息收集脚本
#!/bin/bash
echo "======== 系统信息 ========"
echo "主机名: $(hostname)"
echo "操作系统: $(lsb_release -d | cut -f2)"
echo "内核版本: $(uname -r)"
echo "CPU: $(lscpu | grep 'Model name' | cut -f2 -d: | xargs)"
echo "内存总量: $(free -h | awk '/^Mem/ {print $2}')"
echo "磁盘使用:"
df -h | grep '^/dev/'
11.2 自动备份脚本
#!/bin/bash
set -euo pipefail
backup_dir="/backup/$(date +%Y%m%d)"
mkdir -p "$backup_dir"
rsync -av --delete /home/ "$backup_dir/home/"
rsync -av --delete /etc/ "$backup_dir/etc/"
tar -czf "$backup_dir/var-log.tar.gz" /var/log
echo "备份完成于 $(date)" >> /var/log/backup.log
11.3 网络连通性检查
#!/bin/bash
hosts=("google.com" "github.com" "baidu.com")
for host in "${hosts[@]}"; do
if ping -c 2 -W 2 "$host" > /dev/null 2>&1; then
echo "$host 可达"
else
echo "$host 不可达"
fi
done
12. 高级主题
12.1 进程替换
# 比较两个命令的输出
diff <(ls /dir1) <(ls /dir2)
# 将命令输出作为文件读取
while read line; do
echo "$line"
done < <(grep "error" /var/log/syslog)
12.2 协进程 (coproc)
coproc MY { command; }
12.3 子 Shell 与分组
# 在子 Shell 中执行(不影响当前环境)
(
cd /tmp
echo "当前在 $PWD"
)
echo "仍在原目录 $PWD"
# 在当前 Shell 分组(可重定向)
{
echo "第一行"
echo "第二行"
} > output.txt
12.4 间接变量引用
var_name="USER"
echo ${!var_name} # 输出当前用户名
12.5 关联数组作为字典
declare -A config
config["db_host"]="localhost"
config["db_port"]=3306
echo "${config[db_host]}:${config[db_port]}"
结语
本指南涵盖了 Debian 12 系统管理的常用命令与 Shell 脚本编程的核心知识,从基础到高级,从系统维护到自动化任务,希望能成为你日常工作的得力参考。Debian 作为稳定可靠的 Linux 发行版,结合强大的 Shell 脚本,能让你轻松驾驭各种运维场景。
不断实践、不断探索,你将发现 Shell 脚本与 Linux 系统的无穷魅力。Happy Hacking!
文档版本:v1.0 | 最后更新:2025年