自动挂载网络驱动器的脚本怎么写

wen 实用脚本 2

跨平台实战指南(含Samba/NFS/WebDAV)

目录导读

  1. 为什么需要自动挂载脚本? —— 痛点与场景分析
  2. Linux/macOS 下的挂载脚本(cron + mount) —— 以Samba和NFS为例
  3. Windows 下的挂载脚本(PowerShell + net use) —— 含开机自启配置
  4. 进阶:利用 systemd 与 登录触发器实现“无感”挂载
  5. 常见错误排查与安全建议
  6. 高频问答(FAQ) —— 针对脚本编写中的5大坑

为什么需要自动挂载脚本?── 痛点与场景分析

在混合办公环境中,员工常需要访问 NAS(如群晖、威联通)或文件服务器共享目录,手动执行 mount 命令不仅繁琐,而且一旦网络断开或重启后,连接就失效。自动挂载脚本能解决三个核心问题:

自动挂载网络驱动器的脚本怎么写

  • 开机自启:无需每次手动输入账号密码。
  • 断线重连:通过循环检测或 -o 选项实现自动恢复。
  • 统一管理:将挂载逻辑集中到一个脚本,便于批量分发。

根据Linux基金会2023年报告,88%的企业服务器依赖脚本化存储挂载,本文基于Samba(CIFS)、NFS和WebDAV三种主流协议,提供可直接修改的Shell/Bat/PowerShell脚本。


Linux/macOS 下的挂载脚本(Shell + cron)── 以Samba和NFS为例

1 Samba/CIFS 挂载脚本(适用于群晖、Windows共享)

#!/bin/bash
# 自动挂载Samba共享,支持断线重连
MOUNT_POINT="/mnt/nas_backup"
SERVER="//192.168.1.100/backup"
USERNAME="your_username"
PASSWORD="your_password"
DOMAIN="WORKGROUP"   # 通常留空或填WORKGROUP
# 检查是否已挂载
if ! mountpoint -q "$MOUNT_POINT"; then
    mkdir -p "$MOUNT_POINT"
    mount -t cifs "$SERVER" "$MOUNT_POINT" -o username=$USERNAME,password=$PASSWORD,domain=$DOMAIN,vers=3.0,rw,uid=$(id -u),gid=$(id -g)
    echo "$(date) - Mounted $SERVER" >> /var/log/mount_nas.log
else
    echo "$(date) - Already mounted" >> /var/log/mount_nas.log
fi

注意:macOS 默认无 mount.cifs,需先安装 brew install cifs-utils,且挂载点改为 /Volumes/nas

2 NFS 挂载脚本

# 使用autofs实现按需挂载(更优雅)
sudo apt install autofs   # Debian/Ubuntu
echo "/- /etc/auto.nas" >> /etc/auto.master
cat > /etc/auto.nas <<EOF
/nfs_data  -rw,soft,intr  192.168.1.50:/volume1/data
EOF
sudo systemctl restart autofs

这样当你访问 /nfs_data 时,系统才会自动挂载,无需常驻资源。


Windows 下的挂载脚本(PowerShell + net use)── 含开机自启配置

1 基础批处理脚本(.bat)

@echo off
net use Z: \\192.168.1.100\共享文件夹 /user:DOMAIN\username "password" /persistent:yes

/persistent:yes 让系统记住映射,重启后自动恢复,但密码明文保存在凭据管理器中,安全性较低

2 PowerShell 进阶版(带错误处理与日志)

$drive = "Z:"
$server = "\\192.168.1.100\shared"
$credential = Get-Credential -UserName "DOMAIN\user" -Message "请输入NAS密码"
# 删除旧映射(如果存在)
if (Test-Path $drive) { net use $drive /delete /y }
try {
    New-PSDrive -Name "Z" -PSProvider FileSystem -Root $server -Credential $credential -Persist -ErrorAction Stop
    Write-EventLog -LogName Application -Source "MountScript" -Message "成功挂载 $server" -EventId 100
} catch {
    Write-EventLog -LogName Application -Source "MountScript" -Message "失败: $_" -EventId 101
}

开机自启方式:将.ps1 脚本放入 shell:startup 文件夹,或用任务计划程序(触发器设为“登录时”)。


进阶:利用 systemd 与 登录触发器实现“无感”挂载

1 Systemd 单元文件(Linux)

创建 /etc/systemd/system/mnt-nas.mount.automount 文件:

# mnt-nas.mount
[Unit]
After=network-online.target
Wants=network-online.target
[Mount]
What=//192.168.1.100/share
Where=/mnt/nas
Type=cifs
Options=credentials=/etc/nascreds,vers=3.0
[Install]
WantedBy=multi-user.target

之后启用:systemctl enable --now mnt-nas.automount,这样只有访问该目录时才触发挂载,完美实现按需加载。

2 macOS 使用 mount_smbfs + launchd

创建一个 /Library/LaunchAgents/com.test.mountnas.plist,设置 RunAtLoad 为 true,即可在用户登录时自动执行脚本。


常见错误排查与安全建议

关键错误速查表:

现象 原因 解法
mount error(13): Permission denied 密码错误/SMB版本过低 尝试 vers=2.0 或检查共享权限
mount error(112): Host is down 网络不通或NFS服务未启动 ping 测试+ showmount -e
Windows 提示“系统错误 53” 防火墙阻止445端口 开放TCP 445或改用WebDAV

安全三条铁律:

  1. 绝不硬编码密码,用 credentials=/etc/nascreds 文件(600权限)或 Get-Credential 交互输入。
  2. 使用 Kerberos 或 SSH 密钥 代替明文认证(适合NFSv4)。
  3. 对挂载点做访问控制,如 uid=1000,gid=1000,umask=077

高频问答(FAQ)——针对脚本编写中的5大坑

Q1:脚本能跨平台迁移吗?

  • 不能直接复用,建议保留统一的配置参数(如服务器IP、路径)在 .env 文件中,逻辑分支用 if (uname -a)$env:OS 判断。

Q2:每次重启后明明写了/persistent:yes,但Windows还是挂载失败?

  • 通常是因为“快速启动”影响了网络组件初始化,请到“控制面板→电源选项→选择电源按钮功能”中取消勾选“启用快速启动”。

Q3:如何实现断网后自动重连?

  • 在脚本中加一个 while 循环,每30秒检查挂载点是否存在文件,不行则重新挂载,但更推荐用 autofs,它天生支持空闲超时后卸载,访问时重新挂载。

Q4:WebDAV 挂载脚本怎么写?

  • Linux 上:mount -t davfs https://example.com/webdav /mnt/dav -o username=xxx(需安装 davfs2)。
  • Windows 上:net use * https://example.com/webdav /user:xxx(需启用 WebClient 服务)。

Q5:脚本中的日志会影响系统性能吗?

  • 高频写小型日志IO负担很小,但若担心SSD寿命,可改为内存日志(logger -t mount)或用 logrotate 每周轮转。

本文整合了Linux基金会、Microsoft技术社区及Stack Overflow的实践方案,与您共同探讨。首选方案优先级:Linux用 systemd.automount,Windows用“任务计划程序+PowerShell”,macOS用 launchd,动手前务必先在命令行手动执行一次所有命令,确认权限与防火墙无误,再脚本化部署。

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