bash
复制代码
#!/bin/bash
# 检查root权限
if [ "$EUID" -ne 0 ]; then
echo "需要管理员权限,请输入密码"
if ! sudo -v; then
echo "用户提权失败,请确认您有sudo权限"
exit 0
fi
exec sudo "$0" "$@"
fi
disk_names=() # 按顺序存储硬盘名称(不含/dev/)
disk_sizes=() # 按顺序存储对应硬盘的容量
# 筛选完全未挂载的硬盘(自身及所有分区均未挂载)
while read -r disk_name size; do
disk_names+=("$disk_name")
disk_sizes+=("$size")
done < <(
lsblk -n -o NAME,TYPE,SIZE | grep -v 'loop' | grep 'disk' | while read -r disk_name type size; do
# 检查磁盘所有分区是否均未挂载
partitions_mounted=$(lsblk -n -o MOUNTPOINT "/dev/$disk_name" | grep -v '^$')
if [ -z "$partitions_mounted" ]; then
echo "$disk_name $size" # 仅输出硬盘名称(如sdb)和大小
fi
done
)
# 需求1:输出未挂载硬盘的序号、名称、容量
echo "===== 未挂载硬盘列表 ====="
if [ ${#disk_names[@]} -eq 0 ]; then
echo "未发现未挂载的硬盘"
exit 0
fi
for index in "${!disk_names[@]}"; do
seq=$((index + 1)) # 序号从1开始
name="${disk_names[$index]}"
size="${disk_sizes[$index]}"
echo "序号: $seq | 硬盘名称: $name | 容量: $size"
done
echo -e "\n"
read -p "请输入要挂载的硬盘序号(1-${#disk_names[@]}):" selected_index
if ! [[ "$selected_index" =~ ^[0-9]+$ ]] || [ "$selected_index" -lt 1 ] || [ "$selected_index" -gt ${#disk_names[@]} ]; then
echo "错误:无效序号,必须是1-${#disk_names[@]}之间的数字"
exit 1
fi
selected_disk="${disk_names[$((selected_index - 1))]}"
disk_path="/dev/$selected_disk"
echo -e "\n已选择硬盘:$disk_path"
# 3. 检查并处理未格式化硬盘
fs_type=$(blkid -s TYPE -o value "$disk_path" 2>/dev/null || true)
if [ -z "$fs_type" ]; then
echo -e "\n检测到硬盘未格式化(无文件系统)"
read -p "是否用ext4格式格式化?(数据将全部删除,输入y确认):" confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "已取消操作:未格式化硬盘无法挂载"
exit 1
fi
echo "正在格式化 $disk_path(ext4)..."
mkfs.ext4 -F "$disk_path" # -F强制格式化,不提示
fs_type="ext4"
echo "格式化完成"
fi
# 4. 获取硬盘UUID(必须成功)
uuid=$(blkid -s UUID -o value "$disk_path" 2>/dev/null || true)
if [ -z "$uuid" ]; then
echo "错误:无法获取硬盘UUID(可能是硬件故障)"
exit 1
fi
# 5. 处理挂载点路径
default_mount="/mnt/$selected_disk"
read -p $'\n请输入挂载路径(留空使用默认:'"$default_mount"$'):' user_mount
mount_point="${user_mount:-$default_mount}"
# 创建挂载点并设置初始权限
if [ ! -d "$mount_point" ]; then
echo -e "\n创建挂载点:$mount_point"
mkdir -p "$mount_point"
chown "$SUDO_UID:$SUDO_GID" "$mount_point" # 确保挂载点归普通用户
fi
# 6. 处理fstab配置(存在则更新,不存在则添加)
fstab_entry="UUID=$uuid $mount_point $fs_type defaults"
fstab_bak="/etc/fstab.bak_$(date +%Y%m%d)"
[ -f "$fstab_bak" ] || cp /etc/fstab "$fstab_bak" # 每天备份一次
if grep -qs "^UUID=$uuid" /etc/fstab; then
echo -e "\nfstab中已存在该硬盘配置,正在更新..."
sed -i.bak "s|^UUID=$uuid.*|$fstab_entry|" /etc/fstab # 替换并备份旧行
else
echo -e "\n将配置写入fstab..."
echo "$fstab_entry" >> /etc/fstab
fi
# 7. 执行挂载并处理失败情况
echo -e "\n正在挂载硬盘到 $mount_point..."
if ! mount "$mount_point"; then
echo "错误:挂载失败,正在回滚fstab配置..."
sed -i "/^UUID=$uuid/d" /etc/fstab # 删除错误配置
exit 1
fi
# 8. 最终权限设置(确保所有普通用户可写)
chmod -R o+w "$mount_point"
# 显示结果
echo -e "\n===== 挂载成功! ====="
echo "硬盘路径:$disk_path"
echo "挂载点:$mount_point"
echo "UUID:$uuid"
echo "权限:普通用户可读写(所有用户均可修改)"
echo "重启后将自动挂载"