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 "重启后将自动挂载"
相关推荐
日取其半万世不竭9 小时前
用 Portainer 可视化管理 Docker:容器再多也不用背命令了
运维·docker·容器
2023自学中9 小时前
Linux 图形系统
linux
kirs_ur9 小时前
ECC & LDPC — SSD 的数据卫士
服务器·数据库·性能优化
mounter62511 小时前
高性能网络技术演进与创新探索:RDMA、eBPF/XDP 深度解析及 LSF/MM/BPF 2023 专题演讲
linux·ebpf·linux kernel·kernel·rdma·xdp
动恰客流统计11 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
名字还没想好☜12 小时前
Python itertools 实战:用 groupby、chain、islice 优雅处理大数据流
linux·windows·python·迭代器·itertools
ziguo112214 小时前
深入浅出 C/C++ 数据类型:从入门到踩坑
linux·c语言·c++·windows·visual studio
无垠的广袤14 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
会编程的土豆15 小时前
MySQL 入门:库、表、行、主键是什么
linux·数据库·网络协议·http
砍材农夫16 小时前
运维|devops|jenkins构建应用发布
运维·jenkins·devops