脚本能自动挂载NFS共享吗?

wen 实用脚本 3

本文目录导读:

脚本能自动挂载NFS共享吗?

  1. 基本的Shell脚本挂载
  2. 更完善的脚本(带参数和错误处理)
  3. 自动挂载所有fstab中的NFS
  4. 使用Python脚本
  5. 使用expect自动处理密码(如果有)
  6. 添加到启动脚本
  7. 使用建议

是的,脚本可以自动挂载NFS共享,以下是几种常见的方法和示例脚本:

基本的Shell脚本挂载

#!/bin/bash
# NFS服务器信息
NFS_SERVER="192.168.1.100"
NFS_SHARE="/shared/data"
MOUNT_POINT="/mnt/nfs_share"
# 检查挂载点是否存在,不存在则创建
if [ ! -d "$MOUNT_POINT" ]; then
    mkdir -p "$MOUNT_POINT"
fi
# 检查是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
    echo "NFS共享已挂载"
else
    # 挂载NFS共享
    mount -t nfs "$NFS_SERVER:$NFS_SHARE" "$MOUNT_POINT"
    if [ $? -eq 0 ]; then
        echo "NFS共享挂载成功"
    else
        echo "NFS共享挂载失败"
        exit 1
    fi
fi

更完善的脚本(带参数和错误处理)

#!/bin/bash
# 使用方法函数
usage() {
    echo "用法: $0 -s <NFS服务器> -d <共享目录> -m <挂载点> [-o <挂载选项>]"
    exit 1
}
# 默认值
MOUNT_OPTIONS="rw,hard,intr,timeo=30"
# 解析参数
while getopts "s:d:m:o:" opt; do
    case $opt in
        s) NFS_SERVER="$OPTARG" ;;
        d) NFS_SHARE="$OPTARG" ;;
        m) MOUNT_POINT="$OPTARG" ;;
        o) MOUNT_OPTIONS="$OPTARG" ;;
        *) usage ;;
    esac
done
# 检查必要参数
if [ -z "$NFS_SERVER" ] || [ -z "$NFS_SHARE" ] || [ -z "$MOUNT_POINT" ]; then
    usage
fi
# 创建挂载点
if [ ! -d "$MOUNT_POINT" ]; then
    mkdir -p "$MOUNT_POINT" || { echo "创建挂载点失败"; exit 1; }
fi
# 检查NFS服务器是否可达
ping -c 1 "$NFS_SERVER" > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "NFS服务器 $NFS_SERVER 不可达"
    exit 1
fi
# 检查NFS服务是否运行
showmount -e "$NFS_SERVER" > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "NFS服务未在服务器上运行"
    exit 1
fi
# 卸载如果已经挂载
if mount | grep -q "$MOUNT_POINT"; then
    umount "$MOUNT_POINT" 2>/dev/null
fi
# 挂载NFS共享
mount -t nfs -o "$MOUNT_OPTIONS" "$NFS_SERVER:$NFS_SHARE" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
    echo "成功挂载 $NFS_SERVER:$NFS_SHARE 到 $MOUNT_POINT"
    echo "挂载选项: $MOUNT_OPTIONS"
else
    echo "挂载失败"
    exit 1
fi

自动挂载所有fstab中的NFS

#!/bin/bash
# 挂载所有fstab中定义的NFS共享
mount -a -t nfs
# 检查挂载状态
if [ $? -eq 0 ]; then
    echo "所有NFS共享已挂载"
else
    echo "部分NFS共享挂载失败"
fi

使用Python脚本

#!/usr/bin/env python3
import os
import subprocess
import sys
def mount_nfs(server, share, mount_point, options="rw,hard,intr"):
    """挂载NFS共享"""
    try:
        # 创建挂载点
        if not os.path.exists(mount_point):
            os.makedirs(mount_point)
        # 构建挂载命令
        cmd = f"mount -t nfs -o {options} {server}:{share} {mount_point}"
        # 执行挂载
        result = subprocess.run(cmd.split(), capture_output=True, text=True)
        if result.returncode == 0:
            print(f"成功挂载 {server}:{share} 到 {mount_point}")
            return True
        else:
            print(f"挂载失败: {result.stderr}")
            return False
    except Exception as e:
        print(f"错误: {e}")
        return False
if __name__ == "__main__":
    # 示例用法
    if mount_nfs("192.168.1.100", "/shared/data", "/mnt/nfs"):
        print("挂载成功")
    else:
        sys.exit(1)

使用expect自动处理密码(如果有)

#!/usr/bin/expect -f
# 如果NFS需要认证(通常不需要)
set timeout 30
set server "192.168.1.100"
set share "/shared/data"
set mount_point "/mnt/nfs"
spawn mount -t nfs $server:$share $mount_point
expect {
    "Password:" { send "your_password\r"; exp_continue }
    timeout { puts "挂载超时"; exit 1 }
    eof { puts "挂载完成" }
}

添加到启动脚本

添加到rc.local

# 编辑 /etc/rc.local
# 在 exit 0 之前添加:
mount -t nfs 192.168.1.100:/shared/data /mnt/nfs_share

使用systemd服务

创建 /etc/systemd/system/mount-nfs.service

[Unit]
Description=Mount NFS Share
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/mount -t nfs 192.168.1.100:/shared/data /mnt/nfs_share
RemainAfterExit=true
ExecStop=/usr/bin/umount /mnt/nfs_share
StandardOutput=journal
[Install]
WantedBy=multi-user.target

然后启用服务:

sudo systemctl enable mount-nfs.service
sudo systemctl start mount-nfs.service

使用建议

  1. 安全性考虑

    • 不要在脚本中硬编码密码
    • 使用SSH密钥认证,而不是密码
    • 限制脚本的访问权限 chmod 700 script.sh
  2. 最佳实践

    • 使用 -o hard,intr 选项提供更好的错误处理
    • 添加重试逻辑
    • 记录日志
    • 在/etc/fstab中配置自动挂载(最简单)
  3. 故障排除

    • 检查 showmount -e <server> 确认共享可用
    • 检查防火墙规则
    • 查看日志 tail -f /var/log/messages

选择哪种方法取决于你的具体需求:简单场景用fstab,需要复杂逻辑用shell脚本,需要更多功能用Python。

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