#!/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 # 保持终端窗口打开,以便用户查看最终消息