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 "重启后将自动挂载"
相关推荐
PeaceKeeper76 小时前
简易的arm-linux库文件移植
linux·运维·arm开发
运维帮手大橙子6 小时前
最近面试题总结
linux·服务器·网络
黄毛火烧雪下12 小时前
【Ruby 】脚本和自动化语言 常用的内容
运维·自动化·ruby
Madison-No712 小时前
【Linux】gcc/g++编辑器 && 初识动静态库 && 程序翻译过程
linux·服务器
小白不想白a13 小时前
【shell】每日shell练习:安全日志入侵检测/系统配置文件合规检查
运维·服务器
字节逆旅14 小时前
一个从从容容,一个连滚带爬:scp 与 rsync 的不同人生
linux
洛克大航海14 小时前
Linux 中新建用户
linux·运维·服务器
位步14 小时前
在linux系统中使用通用包安装 Mysql
android·linux·mysql
dehuisun14 小时前
jenkins流水线部署springboot项目
运维·jenkins