吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2650|回复: 34
收起左侧

[其他原创] 对 U 盘的自动识别与安全挂载

  [复制链接]
iPJ241111 发表于 2025-10-25 14:07
本帖最后由 iPJ241111 于 2025-10-25 14:13 编辑

image.png

1

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验证、安全挂载、自动卸载、日志记录

免费评分

参与人数 6吾爱币 +5 热心值 +3 收起 理由
youkee2 + 1 + 1 谢谢@Thanks!
lzd759125184 + 1 + 1 谢谢@Thanks!
cux666 + 1 谢谢@Thanks!
Rabbit1124 + 1 谢谢@Thanks!
tcxd1993 + 1 谢谢@Thanks!
matrixzpc + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lanyemuxue 发表于 2025-11-14 10:16
很不错,可以在银河麒麟机器上试试,现在国产化用的比较多,很实用。
xy1687 发表于 2025-10-26 10:33
tjy0916 发表于 2025-10-26 09:35
chenbin8467645 发表于 2025-10-26 08:04
感谢分享,谢谢
cux666 发表于 2025-10-25 22:17
找一下老U盘试一下。
Abina010 发表于 2025-10-25 17:03
蹲一波   感谢大佬
thomasyang2005 发表于 2025-10-25 14:16
不懂代码,看着挺安全实用。有成品就好了。
不知道改成啥 发表于 2025-10-25 15:01
格式化了不就完蛋了?
bachelor66 发表于 2025-10-25 15:02
Linux的 ?                                      
waimn 发表于 2025-10-25 15:37
什么系统的~!!1
 楼主| iPJ241111 发表于 2025-10-25 16:57
thomasyang2005 发表于 2025-10-25 14:16
不懂代码,看着挺安全实用。有成品就好了。

这样也挺好配置的, 后面打算做成安装包的格式
 楼主| iPJ241111 发表于 2025-10-25 16:58

linux应该都行, 我在Debian上使用的
 楼主| iPJ241111 发表于 2025-10-25 17:04

是的, 我在Debian上使用的
 楼主| iPJ241111 发表于 2025-10-25 17:07
不知道改成啥 发表于 2025-10-25 15:01
格式化了不就完蛋了?

代码里没有主动对U盘格式化, 要是自己格式化了 再把认证文件放到U盘就行.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-17 19:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表