Files
tms-bbt-config-pkg/tms-bbt-config/manual_usb_check.sh
2026-01-02 03:54:30 +08:00

77 lines
3.5 KiB
Bash

#!/bin/bash
# 定义你的修复脚本路径
FIX_SCRIPT="/home/smart/.tms3/starter/usb_disk_fix_script.sh"
LOG_FILE="/var/log/usb_disk_fix.log" # 这个日志文件路径和修复脚本中的一致
echo "----------------------------------------------------"
echo "$(date): Manual USB disk check started."
echo "----------------------------------------------------"
# 检查修复脚本是否存在
if [ ! -x "$FIX_SCRIPT" ]; then
echo "错误:修复脚本 '$FIX_SCRIPT' 不存在或没有执行权限。"
echo "请确保脚本已正确放置并设置了可执行权限。"
exit 1
fi
# 查找所有 USB 分区
USB_PARTITIONS_TO_CHECK=""
# 1. 首先,识别所有传输类型为 'usb' 的磁盘 (例如 /dev/sdc)
# -o NAME,TYPE,TRAN -p -n: 输出设备名、类型、传输协议,完整路径,不显示标题
# awk '$2 == "disk" && $3 == "usb" {print $1}': 过滤出类型为 'disk' 且传输协议为 'usb' 的设备名
USB_DISK_NAMES=$(lsblk -o NAME,TYPE,TRAN -p -n | awk '$2 == "disk" && $3 == "usb" {print $1}')
if [ -z "$USB_DISK_NAMES" ]; then
echo "$(date): 未发现任何 USB 磁盘。"
else
echo "$(date): 发现以下 USB 磁盘: $USB_DISK_NAMES"
for disk_name in $USB_DISK_NAMES; do
# 2. 对于每个 USB 磁盘,找到它下面的所有分区 (例如 /dev/sdc1)
# -o NAME,TYPE -p -n "$disk_name": 列出指定磁盘下的设备名和类型
# awk '$2 == "part" {gsub(/^[[:space:]]*[├└][─]*/, "", $1); print $1}': 过滤出类型为 'part' 的分区名
# 并使用 gsub() 函数去除 lsblk 输出中的前导字符 (如 '└─')
PARTITIONS_ON_DISK=$(lsblk -o NAME,TYPE -p -n "$disk_name" | awk '$2 == "part" {gsub(/^[[:space:]]*[├└][─]*/, "", $1); print $1}')
USB_PARTITIONS_TO_CHECK="$USB_PARTITIONS_TO_CHECK $PARTITIONS_ON_DISK"
done
fi
# 去除重复的设备路径,并确保路径是唯一的
USB_PARTITIONS_TO_CHECK=$(echo "$USB_PARTITIONS_TO_CHECK" | tr ' ' '\n' | sort -u | tr '\n' ' ')
if [ -z "$USB_PARTITIONS_TO_CHECK" ]; then
echo "$(date): 未发现任何 USB 分区需要检查。"
echo "----------------------------------------------------"
echo "$(date): Manual USB disk check finished."
echo "----------------------------------------------------"
exit 0
fi
echo "$(date): 发现以下 USB 分区,将逐一进行检查:"
echo "$USB_PARTITIONS_TO_CHECK"
echo ""
for dev_path in $USB_PARTITIONS_TO_CHECK; do
# 确保 dev_path 不为空或只包含空格
if [ -n "$dev_path" ]; then
echo "----------------------------------------------------"
echo "$(date): 正在检查分区: $dev_path"
echo "----------------------------------------------------"
# 调用你的修复脚本。现在修复脚本会直接将输出打印到终端。
# 确保当前脚本也以 sudo 运行,或者修复脚本已经配置为无密码 sudo。
# 最简单的方式是直接让用户以 sudo 运行此脚本。
"$FIX_SCRIPT" "$dev_path"
# 更新此消息,因为输出现在在终端可见
echo "$(date): 对 $dev_path 的检查已完成。详细信息请查看终端输出和日志文件: $LOG_FILE"
echo ""
fi
done
echo "----------------------------------------------------"
echo "$(date): 所有发现的 USB 分区检查已完成。"
echo "$(date): 详细的修复进度和结果已显示在终端,并记录在 '$LOG_FILE' 中。"
echo "----------------------------------------------------"
sleep 5 # 保持终端窗口打开,以便用户查看最终消息