本帖最后由 iPJ241111 于 2025-10-25 14:13 编辑
1
🛡️ U盘自动检测与保护系统
自动检测、校验并安全挂载 USB 存储设备(含 MD5 验证机制)
📘 功能概述
本系统通过 udev + systemd + Bash 脚本 实现对 U 盘的自动识别与安全挂载。
核心目标:
- 当检测到新的 U 盘插入时:
- 自动检查是否存在合法文件
2.txt
- 校验其 MD5 值 是否匹配预设值
- 根据校验结果自动选择 读写 (rw) 或 只读 (ro) 模式挂载
- 当 U 盘拔出时:
📂 目录结构
/home/li/cku/
├── jcu.sh # U盘插入时自动执行的检测/挂载脚本
├── jcu-remove.sh # U盘拔出时自动执行的卸载脚本
/etc/systemd/system/
├── jcu@.service # systemd 服务模板(插入事件)
├── jcu-remove@.service # systemd 服务模板(移除事件)
/etc/udev/rules.d/
└── 98-usb-block.rules # udev 规则,触发 systemd 服务
⚙️ 脚本内容
🔹 /home/li/cku/jcu.sh
#!/bin/bash
# /home/li/cku/jcu.sh
# 自动检测U盘是否含有合法的2.txt(含MD5校验)
LOG_FILE="/var/log/jcu.log"
TEMP_MOUNT="/media/li/upan"
FINAL_MOUNT="/media/li/usb_disk"
DEV_PATH="$1"
VALID_MD5="9c63baf1d3fa5457ffc016df7e14aeea"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
if [ -z "$DEV_PATH" ]; then
log "错误:未提供设备路径"
exit 1
fi
mkdir -p "$TEMP_MOUNT" "$FINAL_MOUNT"
umount -l "$DEV_PATH" >/dev/null 2>&1
umount -l "$TEMP_MOUNT" >/dev/null 2>&1
umount -l "$FINAL_MOUNT" >/dev/null 2>&1
if mount -o ro "$DEV_PATH" "$TEMP_MOUNT" >/dev/null 2>&1; then
if [ -f "$TEMP_MOUNT/2.txt" ]; then
FILE_MD5=$(md5sum "$TEMP_MOUNT/2.txt" | awk '{print $1}')
log "检测到2.txt, MD5=$FILE_MD5"
if [ "$FILE_MD5" = "$VALID_MD5" ]; then
MODE="rw"
log "2.txt MD5验证通过,设置为读写挂载"
else
MODE="ro"
log "2.txt MD5不匹配,设置为只读挂载"
fi
else
MODE="ro"
log "未检测到2.txt,设置为只读挂载"
fi
umount "$TEMP_MOUNT"
else
log "错误:临时挂载失败 $DEV_PATH"
exit 1
fi
if mount -o "$MODE" "$DEV_PATH" "$FINAL_MOUNT" >/dev/null 2>&1; then
log "成功以$MODE模式挂载 $DEV_PATH 到 $FINAL_MOUNT"
else
log "挂载失败:$DEV_PATH"
fi
exit 0
🔹 /home/li/cku/jcu-remove.sh
#!/bin/bash
# 自动卸载 U 盘脚本
# 日志写入:/var/log/jcu.log
LOGFILE="/var/log/jcu.log"
FINAL_MOUNT="/media/li/usb_disk"
DEV_PATH="$1"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOGFILE"
}
if [ -z "$DEV_PATH" ]; then
log "错误:未提供设备路径"
exit 1
fi
log "[移除] 检测到设备:$DEV_PATH"
if mount | grep -q "$FINAL_MOUNT"; then
log "挂载点 $FINAL_MOUNT 正在使用,尝试卸载..."
umount -l "$FINAL_MOUNT" 2>/dev/null
if [ $? -eq 0 ]; then
log "已成功卸载挂载点:$FINAL_MOUNT"
else
log "卸载失败:$FINAL_MOUNT"
exit 1
fi
else
log "挂载点 $FINAL_MOUNT 当前未挂载,无需卸载"
fi
exit 0
🧩 udev 规则
KERNEL=="sd[a-z][0-9]", ACTION=="add", RUN+="/bin/systemctl start jcu@%k.service"
KERNEL=="sd[a-z][0-9]", ACTION=="remove", RUN+="/bin/systemctl start jcu-remove@%k.service"
⚙️ systemd 服务模板
/etc/systemd/system/jcu@.service
[Unit]
Description=自动执行 U 盘挂载脚本 (%i)
After=systemd-udevd.service
[Service]
Type=oneshot
ExecStart=/home/li/cku/jcu.sh /dev/%i
TimeoutSec=20
[Install]
WantedBy=multi-user.target
/etc/systemd/system/jcu-remove@.service
[Unit]
Description=自动执行 U 盘卸载脚本 (%i)
After=systemd-udevd.service
[Service]
Type=oneshot
ExecStart=/home/li/cku/jcu-remove.sh /dev/%i
TimeoutSec=15
[Install]
WantedBy=multi-user.target
🚀 安装与启用步骤
# 复制脚本
sudo mkdir -p /home/li/cku
sudo cp jcu.sh jcu-remove.sh /home/li/cku/
sudo chmod +x /home/li/cku/*.sh
# 部署 systemd 服务
sudo cp jcu@.service jcu-remove@.service /etc/systemd/system/
sudo systemctl daemon-reload
# 部署 udev 规则
sudo cp 98-usb-block.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
# 查看日志
cat /var/log/jcu.log
🧾 更新记录
| 日期 |
内容 |
| 2025-10-25 |
首次发布:自动检测、MD5验证、安全挂载、自动卸载、日志记录 |
|