Linux硬盘挂载脚本

  • 系统:Ubuntu 16.04.7
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 "重启后将自动挂载"
相关推荐
tianyuanwo4 分钟前
SSH会话管理实战:识别与清理非法连接的完整指南
运维·ssh
小豆子范德萨6 分钟前
两台window配置SSH免密登录
运维·ssh
小北方城市网40 分钟前
第 6 课:Vue 3 工程化与项目部署实战 —— 从本地开发到线上发布
大数据·运维·前端·ai
旖旎夜光1 小时前
Linux(3)(下)
linux·学习
小鹿学程序2 小时前
任务一-1.子任务一:基础环境准备
linux·bigdata
Nautiluss2 小时前
一起玩XVF3800麦克风阵列(十)
linux·人工智能·python·音频·语音识别·实时音视频·dsp开发
悲喜自渡7212 小时前
Python 编程(gem5 )
java·linux·开发语言
曹牧2 小时前
C#:记录日志
服务器·前端·c#
不怕犯错,就怕不做2 小时前
RK3562 +RK817的dts布尔属性解析(uboot基础知识)
linux·驱动开发·嵌入式硬件
记得记得就1513 小时前
docker作业
运维·docker·容器