1410 字
7 分钟
macOS 开机自动挂载 NAS 脚本分享

项目来源
前段时间购买了MacBook Air,发现想要挂载NAS需要手动挂载,不能自动挂载。与AI对话后,编写了一个自动挂载脚本,现分享出来以帮助有类似需求的用户。
1. 准备工作
1.1 创建脚本文件
-
在您的主目录下创建脚本文件夹:
Terminal window mkdir -p ~/Tools/Scripts -
创建脚本文件:
Terminal window nano ~/Tools/Scripts/mount_nas.sh -
将脚本代码复制粘贴到文件中,根据自己的需求修改配置,然后保存并退出。
#!/bin/bash
exec &> "${HOME}/Tools/Scripts/mount_nas_log.txt"
# ==============================================================================# --- 开机自动挂载脚本 (在用户主目录创建挂载点) ---# ==============================================================================
# --- 配置区 ---# 格式: "昵称;服务器IP/路径;用户名"CONFIGS=("nas;192.168.10.1/onecreeper_nas;username")
# --- 准备工作 ---# 定义挂载点基准目录 (在用户主目录下)BASE_MOUNT_DIR="${HOME}/Mounts"echo "将在 ${BASE_MOUNT_DIR} 中创建挂载点..."mkdir -p "${BASE_MOUNT_DIR}" # -p 选项确保目录不存在时才创建,存在亦不报错
# --- 网络检查 ---UNIQUE_SERVERS=$(for config in "${CONFIGS[@]}"; do echo "$config" | cut -d';' -f2 | cut -d'/' -f1; done | sort -u)declare -a REACHABLE_SERVERS=()echo "正在检查所有 NAS/服务器是否在线..."
for SERVER_IP in $UNIQUE_SERVERS; do echo -n "正在检查服务器: $SERVER_IP... " if ping -c 2 -W 1 $SERVER_IP &> /dev/null; then echo "✅ 在线" REACHABLE_SERVERS+=("$SERVER_IP") else echo "❌ 超时" fidone
echo "服务器在线状态检查完毕。"
# --- 挂载逻辑 ---for config in "${CONFIGS[@]}"; do IFS=';' read -r NICKNAME FULL_PATH USERNAME <<< "$config" SERVER_IP=$(echo $FULL_PATH | cut -d'/' -f1) # 使用用户主目录下的挂载点 MOUNT_POINT="${BASE_MOUNT_DIR}/${NICKNAME}"
IS_SERVER_REACHABLE=false for item in "${REACHABLE_SERVERS[@]}"; do [[ "$item" == "$SERVER_IP" ]] && IS_SERVER_REACHABLE=true && break; done
if ! $IS_SERVER_REACHABLE; then echo "⏭️ 跳过挂载 '$NICKNAME' (服务器不可达)" continue fi
echo "----------------------------------------" echo "正在处理共享: $NICKNAME"
# 自动创建挂载点文件夹 mkdir -p "${MOUNT_POINT}"
if mount | grep -q " on ${MOUNT_POINT} "; then echo "状态:已挂载。" continue fi
NAS_PASSWORD=$(security find-internet-password -s "$SERVER_IP" -a "$USERNAME" -w) if [ -z "$NAS_PASSWORD" ]; then echo "❌ 错误:未能在钥匙串中找到 '$USERNAME@$SERVER_IP' 的密码。" continue fi
echo "正在尝试挂载到 ${MOUNT_POINT}"
if [[ "$USERNAME" == *"@"* ]]; then # 对用户名进行URL编码 ENCODED_USERNAME=$(echo "$USERNAME" | sed 's/@/%40/g') echo "提示: 检测到包含'@'的用户名,已自动编码为: ${ENCODED_USERNAME}" mount_smbfs -N "//${ENCODED_USERNAME}:${NAS_PASSWORD}@${FULL_PATH}" "${MOUNT_POINT}" else # 对于不含'@'的标准用户名,使用原始命令 mount_smbfs -N "//${USERNAME}:${NAS_PASSWORD}@${FULL_PATH}" "${MOUNT_POINT}" fi
if [ $? -eq 0 ]; then echo "✅ 成功挂载。" else echo "❌ 挂载失败。请检查网络、服务器状态、密码,或Windows端的共享/防火墙设置。" fidone
echo "----------------------------------------"echo "所有挂载任务已执行完毕。"exit 01.2 设置脚本权限
给脚本添加执行权限:
chmod +x ~/Tools/Scripts/mount_nas.sh1.3 配置NAS密码
脚本使用macOS的钥匙串来安全存储NAS密码。您需要为每个NAS服务器和用户名组合添加密码到钥匙串:
- 打开“访达”
- 左上角-前往-连接服务器
- 输入你的nas地址账号密码,勾选记住密码之类的提示就会自动保存到密钥串中了
2. 测试脚本
在设置自动运行之前,先手动测试脚本是否正常工作:
~/Tools/Scripts/mount_nas.sh检查输出和日志文件 ~/Tools/Scripts/mount_nas_log.txt,确认所有NAS共享文件夹都已成功挂载到 ~/Mounts 目录下。
3. 设置开机自动运行
使用自动操作将脚本变为程序
- 打开自动操作
- 新建文稿 > 应用程序
- 搜索”运行shell脚本”
- 脚本填入
Bash /Tools/Scripts/mount_nas.sh
使用登录项(用户级)
- 打开”系统偏好设置” > “用户与群组”
- 选择您的用户账户,点击”登录项”选项卡
- 点击左下角的锁图标并输入密码进行解锁
- 点击”+“按钮添加登录项
- 在文件选择对话框中,选择您刚刚创建的自动操作程序
- 确保新添加的登录项旁边的复选框已选中
此方法会在您登录用户账户时自动运行脚本。
4. 验证自动挂载
重启您的MacBook,登录后检查:
- 打开Finder,查看侧边栏是否出现挂载的NAS共享文件夹
- 检查
~/Mounts目录,确认所有NAS共享文件夹都已挂载 - 查看日志文件
~/Tools/Scripts/mount_nas_log.txt,确认脚本运行正常
常见问题与解决方案
1. 挂载失败:密码错误
如果日志显示”未能在钥匙串中找到密码”的错误,请检查:
- 确保已在钥匙串中正确添加了NAS服务器的密码
- 检查服务器IP地址和用户名是否与钥匙串中的记录完全匹配
- 尝试手动运行
security find-internet-password -s "服务器IP" -a "用户名" -w命令,确认能获取到密码
2. 挂载失败:网络问题
如果日志显示服务器不可达或挂载超时,请检查:
- 确保MacBook和NAS在同一网络中
- 检查NAS设备是否正常运行
- 确认NAS的IP地址没有变化
- 检查网络防火墙设置
3. 特殊字符用户名问题
如果您的用户名包含特殊字符(特别是”@”),脚本会自动处理。但如果仍遇到问题,您可以:
- 手动对用户名进行URL编码(将”@“替换为”%40”)
- 考虑在NAS/Windows上创建一个不含特殊字符的专用账户用于挂载
4. 挂载点权限问题
如果挂载成功但无法访问文件,可能是权限问题:
- 检查NAS上的共享权限设置
- 确保MacBook用户有足够的访问权限
- 尝试手动挂载并指定权限选项,如
mount_smbfs -N -o nobrowse "//user:pass@server/share" ~/Mounts/share
AI提问解决法
你去问问ai把,很强的。
macOS 开机自动挂载 NAS 脚本分享
https://blog.st.onecreeper.cn/posts/macbook自动挂载nas脚本/分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 353 天
部分内容可能已过时