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 "重启后将自动挂载"
相关推荐
menge233320 小时前
Linux DNS域名解析服务器练习
linux·运维·服务器
努力成为一个程序猿.20 小时前
Clickhouse数据副本和分片
运维·clickhouse·debian
m0_4955627820 小时前
Swift-static和class
java·服务器·swift
wsad053220 小时前
CentOS 7 更换腾讯云 yum 源及 EPEL 源
linux·centos·腾讯云
wdfk_prog20 小时前
[Linux]学习笔记系列 -- [kernel]kallsyms
linux·笔记·学习
emiya_saber21 小时前
Linux 进程调度管理
linux·运维·服务器
不脱发的程序猿21 小时前
嵌入式Linux:线程同步(读写锁)
linux·嵌入式
yangzhi_emo21 小时前
配置dns主从服务
linux·运维·服务器
SongYuLong的博客1 天前
Linux开源代码汇总
linux·运维·服务器
JiMoKuangXiangQu1 天前
Linux 内存管理 (5):buddy 内存分配简要流程
linux·内存管理·buddy 分配器