/etc/udev/rules.d/99-usb-mount.rules
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/local/bin/usb-mount.sh"
ACTION=="remove", SUBSYSTEMS=="usb", RUN+="/usr/local/bin/usb-umount.sh"
无注释版
/usr/local/bin/usb-mount.sh
#!/bin/bash
MOUNT_POINT="/mnt"
devices=$(lsblk -no NAME,TRAN | grep usb | awk '{print $1}')
for device in $devices; do
partitions=$(lsblk -no NAME,TRAN,PARTLABEL $device | grep -v usb | grep -v "Microsoft reserved partition" | sed "s/└─//g" | awk '{print $1}')
for partition in $partitions; do
[ ! -d "$MOUNT_POINT/$partition" ] && mkdir -p "$MOUNT_POINT/$partition"
if ! mountpoint -q "$MOUNT_POINT/$partition"; then
mount -o uid=$(id -u),gid=$(id -g),umask=000 /dev/$partition "$MOUNT_POINT/$partition"
fi
done
done
/usr/local/bin/usb-umount.sh
#!/bin/bash
MOUNT_POINT="/mnt"
mounted_devices=$(awk '/\/mnt/ {print $1}' /proc/mounts | sed "s/\/dev\///g")
for device in $mounted_devices; do
if ! lsblk -o NAME,TRAN | grep -q "$device"; then
umount "/dev/$device"
rmdir "$MOUNT_POINT/$device"
fi
done
说明
mount -o uid=$(id -u),gid=$(id -g),umask=000 /dev/$partition "$MOUNT_POINT/$partition"
这里是因为exFAT等格式不支持权限,如果直接chmod虽然不会报错但也没法改,只能模拟权限。
如果只需要读取的话可以删掉命令参数,改成:
mount /dev/$partition "$MOUNT_POINT/$partition"
有注释版(可以不看)
/usr/local/bin/usb-mount.sh
#!/bin/bash
# 定义挂载点和日志文件路径
MOUNT_POINT="/mnt"
LOG_FILE="/usr/local/bin/usb.log"
# 获取所有USB设备
devices=$(lsblk -no NAME,TRAN | grep usb | awk '{print $1}')
for device in $devices; do
echo "$(date) - Detected USB device: $device" >> "$LOG_FILE"
# 获取设备的所有分区
partitions=$(lsblk -no NAME,TRAN,PARTLABEL /dev/sda | grep -v usb | grep -v "Microsoft reserved partition" | sed "s/└─//g" | awk '{print $1}')
for partition in $partitions; do
echo "$(date) - Detected partition: $partition" >> "$LOG_FILE"
# 检查挂载点是否存在,如果不存在则创建
[ ! -d "$MOUNT_POINT/$partition" ] && mkdir -p "$MOUNT_POINT/$partition" && echo "$(date) - Created mount point: $MOUNT_POINT/$partition" >> "$LOG_FILE"
# 尝试挂载分区
if ! mountpoint -q "$MOUNT_POINT/$partition"; then
mount -o uid=$(id -u),gid=$(id -g),umask=000 /dev/$partition "$MOUNT_POINT/$partition" && echo "$(date) - Partition $partition mounted on $MOUNT_POINT/$partition" >> "$LOG_FILE" || echo "$(date) - Failed to mount $partition on $MOUNT_POINT/$partition" >> "$LOG_FILE"
else
echo "$(date) - Partition $partition is already mounted" >> "$LOG_FILE"
fi
done
done
echo "$(date) - USB mount process completed" >> "$LOG_FILE"
/usr/local/bin/usb-umount.sh
#!/bin/bash
# 定义挂载点和日志文件路径
MOUNT_POINT="/mnt"
LOG_FILE="/usr/local/bin/usb.log"
echo "$(date) - Starting USB unmount process" >> "$LOG_FILE"
# 获取当前挂载的USB设备
mounted_devices=$(awk '/\/mnt/ {print $1}' /proc/mounts | sed "s/\/dev\///g")
for device in $mounted_devices; do
echo "$(date) - Checking device: $device" >> "$LOG_FILE"
# 检查设备是否仍然存在
if ! lsblk -o NAME,TRAN | grep -q "$device"; then
# 卸载设备
umount "/dev/$device" && echo "$(date) - Device $device unmounted" >> "$LOG_FILE" || echo "$(date) - Failed to unmount $device" >> "$LOG_FILE"
rmdir "$MOUNT_POINT/$device"
else
echo "$(date) - Device $device alive" >> "$LOG_FILE"
fi
done
echo "$(date) - USB unmount process completed" >> "$LOG_FILE"