AI 摘要

Mac每次开机都要手动挂载NAS?别让繁琐操作拖慢你的效率!这个脚本能自动检测网络、读取钥匙串密码,一键挂载所有共享文件夹。告别重复劳动,让NAS像本地磁盘一样随开随用——科技本该如此省心。

项目来源

前段时间购买了MacBook Air,发现想要挂载NAS需要手动挂载,不能自动挂载。与AI对话后,编写了一个自动挂载脚本,现分享出来以帮助有类似需求的用户。

1. 准备工作

1.1 创建脚本文件

  1. 在您的主目录下创建脚本文件夹:
   mkdir -p ~/Tools/Scripts
  1. 创建脚本文件:
   nano ~/Tools/Scripts/mount_nas.sh
  1. 将脚本代码复制粘贴到文件中,根据自己的需求修改配置,然后保存并退出。
#!/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 "❌ 超时" 
    fi
done

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端的共享/防火墙设置。" 
    fi
done

echo "----------------------------------------" 
echo "所有挂载任务已执行完毕。" 
exit 0

1.2 设置脚本权限

给脚本添加执行权限:

chmod +x ~/Tools/Scripts/mount_nas.sh

1.3 配置NAS密码

脚本使用macOS的钥匙串来安全存储NAS密码。您需要为每个NAS服务器和用户名组合添加密码到钥匙串:

  1. 打开“访达”
  2. 左上角-前往-连接服务器
  3. 输入你的nas地址账号密码,勾选记住密码之类的提示就会自动保存到密钥串中了

2. 测试脚本

在设置自动运行之前,先手动测试脚本是否正常工作:

~/Tools/Scripts/mount_nas.sh

检查输出和日志文件 ~/Tools/Scripts/mount_nas_log.txt,确认所有NAS共享文件夹都已成功挂载到 ~/Mounts 目录下。

3. 设置开机自动运行

使用自动操作将脚本变为程序

  1. 打开自动操作
  2. 新建文稿 > 应用程序
  3. 搜索"运行shell脚本"
  4. 脚本填入 Bash /Tools/Scripts/mount_nas.sh

使用登录项(用户级)

  1. 打开"系统偏好设置" > "用户与群组"
  2. 选择您的用户账户,点击"登录项"选项卡
  3. 点击左下角的锁图标并输入密码进行解锁
  4. 点击"+"按钮添加登录项
  5. 在文件选择对话框中,选择您刚刚创建的自动操作程序
  6. 确保新添加的登录项旁边的复选框已选中

此方法会在您登录用户账户时自动运行脚本。

4. 验证自动挂载

重启您的MacBook,登录后检查:

  1. 打开Finder,查看侧边栏是否出现挂载的NAS共享文件夹
  2. 检查~/Mounts目录,确认所有NAS共享文件夹都已挂载
  3. 查看日志文件~/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把,很强的。

没啥好说的,本博客的创造者
最后更新于 2026-01-17