Debian-Shell

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.shchmod 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 逻辑卷管理(高级)

  • pvcreatevgcreatelvcreate 等,适合动态调整磁盘空间。

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年

拾光印记
更新于 2026-03-07
上一篇 没有了
下一篇 没有了

文档目录