项目来源
前段时间购买了MacBook Air,发现想要挂载NAS需要手动挂载,不能自动挂载。与AI对话后,编写了一个自动挂载脚本,现分享出来以帮助有类似需求的用户。
1. 准备工作
1.1 创建脚本文件
- 在您的主目录下创建脚本文件夹:
mkdir -p ~/Tools/Scripts
- 创建脚本文件:
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 "❌ 超时"
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服务器和用户名组合添加密码到钥匙串:
- 打开“访达”
- 左上角-前往-连接服务器
- 输入你的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把,很强的。

Comments NOTHING