如何编写自动挂载网络存储脚本

wen 实用脚本 1

本文目录导读:

如何编写自动挂载网络存储脚本

  1. NFS 自动挂载脚本
  2. SMB/CIFS 自动挂载脚本
  3. 智能自动挂载脚本(支持多种协议)
  4. 配置文件示例
  5. 系统自启动设置
  6. 使用说明

我来教你编写自动挂载网络存储(如 NFS、SMB/CIFS)的脚本。

NFS 自动挂载脚本

基础版本

#!/bin/bash
# NFS 自动挂载脚本
# 使用前请修改变量
# 配置参数
NFS_SERVER="192.168.1.100"
NFS_SHARE="/shared/path"
MOUNT_POINT="/mnt/nfs_share"
CRED_FILE="/etc/nfs_credentials"
# 检查是否为 root 用户
if [[ $EUID -ne 0 ]]; then
   echo "此脚本需要 root 权限运行" 
   exit 1
fi
# 创建挂载点
mkdir -p $MOUNT_POINT
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
    echo "目录 $MOUNT_POINT 已经挂载"
    exit 0
fi
# 检测网络连通性
ping -c 2 $NFS_SERVER > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "无法连接到 NFS 服务器 $NFS_SERVER"
    exit 1
fi
# 安装 nfs-common(如果未安装)
if ! command -v mount.nfs &> /dev/null; then
    apt-get update && apt-get install -y nfs-common
    # 对于 CentOS/RHEL: yum install -y nfs-utils
fi
# 挂载 NFS 共享
mount -t nfs -o vers=4,hard,intr,rsize=1048576,wsize=1048576 \
    $NFS_SERVER:$NFS_SHARE $MOUNT_POINT
if [ $? -eq 0 ]; then
    echo "NFS 挂载成功: $MOUNT_POINT"
else
    echo "NFS 挂载失败"
    exit 1
fi

SMB/CIFS 自动挂载脚本

支持密码文件

#!/bin/bash
# SMB/CIFS 自动挂载脚本
# 配置参数
SMB_SERVER="//192.168.1.100"
SMB_SHARE="/shared_folder"
MOUNT_POINT="/mnt/smb_share"
USERNAME="your_username"
PASSWORD="your_password"
DOMAIN="WORKGROUP"  # 可选
# 检查 root 权限
if [[ $EUID -ne 0 ]]; then
   echo "此脚本需要 root 权限运行" 
   exit 1
fi
# 创建凭据文件(提高安全性)
create_credentials() {
    local cred_file="/etc/smb_credentials"
    cat > $cred_file << EOF
username=$USERNAME
password=$PASSWORD
domain=$DOMAIN
EOF
    chmod 600 $cred_file
    echo $cred_file
}
# 创建挂载点
mkdir -p $MOUNT_POINT
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
    echo "目录 $MOUNT_POINT 已经挂载"
    exit 0
fi
# 安装 cifs-utils
if ! command -v mount.cifs &> /dev/null; then
    apt-get update && apt-get install -y cifs-utils
fi
# 创建凭据文件
CRED_FILE=$(create_credentials)
# 挂载 SMB 共享
mount -t cifs -o credentials=$CRED_FILE,vers=3.0,uid=$(id -u),gid=$(id -g),file_mode=0755,dir_mode=0755 \
    "$SMB_SERVER$SMB_SHARE" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
    echo "SMB 挂载成功: $MOUNT_POINT"
else
    echo "SMB 挂载失败"
    exit 1
fi

智能自动挂载脚本(支持多种协议)

#!/bin/bash
# 智能网络存储自动挂载脚本
# 支持 NFS、SMB/CIFS、SSHFS
set -e
# 配置函数
load_config() {
    # 从配置文件读取
    if [ -f "/etc/network-mount.conf" ]; then
        source "/etc/network-mount.conf"
    else
        # 默认配置
        NETWORK_SHARES=(
            "nfs|192.168.1.100:/shared/data|/mnt/data"
            "smb|//192.168.1.100/shared/docs|/mnt/docs|user|pass"
            "sshfs|user@192.168.1.100:/home/shared|/mnt/remote"
        )
    fi
}
# 检查依赖
check_dependencies() {
    local type=$1
    case $type in
        nfs)
            command -v mount.nfs &> /dev/null || \
                install_package "nfs-common" "nfs-utils"
            ;;
        smb)
            command -v mount.cifs &> /dev/null || \
                install_package "cifs-utils"
            ;;
        sshfs)
            command -v sshfs &> /dev/null || \
                install_package "sshfs"
            ;;
    esac
}
# 安装软件包
install_package() {
    local deb_pkg=$1
    local rpm_pkg=$2
    if command -v apt-get &> /dev/null; then
        apt-get update && apt-get install -y $deb_pkg
    elif command -v yum &> /dev/null; then
        yum install -y $rpm_pkg
    elif command -v dnf &> /dev/null; then
        dnf install -y $rpm_pkg
    else
        echo "未支持的包管理器"
        exit 1
    fi
}
# 挂载单个共享
mount_share() {
    local share_type=$1
    local share_source=$2
    local mount_point=$3
    local credentials=$4
    # 创建挂载点
    mkdir -p "$mount_point"
    # 检查是否已挂载
    if mount | grep -q "$mount_point"; then
        echo "跳过 $mount_point:已经挂载"
        return 0
    fi
    # 检查网络
    local server=$(echo $share_source | grep -oP '(\d{1,3}\.){3}\d{1,3}')
    if [ -z "$server" ]; then
        server=$(echo $share_source | cut -d'@' -f2 | cut -d':' -f1)
    fi
    ping -c 1 -W 2 $server &> /dev/null || {
        echo "无法连接到 $server,跳过 $mount_point"
        return 1
    }
    # 执行挂载
    case $share_type in
        nfs)
            check_dependencies "nfs"
            mount -t nfs -o vers=4,hard,intr "$share_source" "$mount_point"
            ;;
        smb)
            check_dependencies "smb"
            if [ -n "$credentials" ]; then
                echo "$credentials" > /tmp/smb_cred_$$ 
                mount -t cifs -o credentials=/tmp/smb_cred_$$ \
                    "$share_source" "$mount_point"
                rm -f /tmp/smb_cred_$$
            else
                mount -t cifs "$share_source" "$mount_point"
            fi
            ;;
        sshfs)
            check_dependencies "sshfs"
            sshfs -o allow_other,default_permissions \
                "$share_source" "$mount_point"
            ;;
    esac
    if [ $? -eq 0 ]; then
        echo "成功挂载 $share_type: $mount_point"
    else
        echo "挂载失败: $share_type $share_source"
        return 1
    fi
}
# 主函数
main() {
    # 检查 root 权限
    if [[ $EUID -ne 0 ]]; then
        echo "请以 root 权限运行此脚本"
        exit 1
    fi
    # 加载配置
    load_config
    # 遍历并挂载所有共享
    for share in "${NETWORK_SHARES[@]}"; do
        IFS='|' read -r type source mount cred <<< "$share"
        mount_share "$type" "$source" "$mount" "$cred" || true
    done
}
# 执行主函数
main "$@"

配置文件示例

创建 /etc/network-mount.conf

# 网络存储挂载配置
# 格式: type|source|mount_point|credentials(可选)
# NFS 共享
NETWORK_SHARES+=(
    "nfs|192.168.1.100:/srv/nfs/data|/mnt/data"
    "nfs|192.168.1.101:/exports/backup|/mnt/backup"
)
# SMB 共享
NETWORK_SHARES+=(
    "smb|//192.168.1.100/shared|/mnt/shared|username=admin\npassword=secret\ndomain=WORKGROUP"
)
# SSHFS 共享
NETWORK_SHARES+=(
    "sshfs|user@192.168.1.200:/home/shared|/mnt/sshfs"
)

系统自启动设置

创建 systemd 服务

# /etc/systemd/system/network-mount.service
[Unit]
Description=Network Storage Auto Mount
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/auto-mount.sh
ExecStop=/usr/local/bin/auto-umount.sh
User=root
[Install]
WantedBy=multi-user.target

启用服务

# 保存脚本到 /usr/local/bin/
sudo chmod +x /usr/local/bin/auto-mount.sh
# 启用服务
sudo systemctl daemon-reload
sudo systemctl enable network-mount.service
sudo systemctl start network-mount.service

使用说明

  1. 脚本权限chmod +x script.sh
  2. 运行脚本sudo ./auto-mount.sh
  3. 配置文件路径/etc/network-mount.conf
  4. 日志检查:使用 journalctl -u network-mount.service 查看日志

这些脚本会根据网络状态自动判断是否尝试挂载,支持多种协议,并会自动处理依赖安装。

抱歉,评论功能暂时关闭!