如何在macOS中稳定映射并挂载路由器导出的带盘符共享分区?
兄弟,这个盘符和挂载点乱跳的问题确实够闹心的——尤其是靠shell脚本管数据的时候,映射一变整个流程都炸。先捋清楚你的情况:Archer AXE75 v1.0(固件1.1.9 Build 20231115)导出的三个SMB分区用G/H/I标识,但macOS自动给挂成/Volumes/router、router-1、router-2,而且每次挂载的对应关系还不固定,你现在靠一个源脚本来匹配,但想找更靠谱的办法,甚至试过自动挂载器但没搞明白文档对吧?
我给你两个方向的解决方案,一个是优化你现有的脚本,另一个是彻底用autofs搞定稳定挂载:
一、优化现有匹配脚本,提升可靠性
你当前的脚本思路是对的,但可以写得更健壮,能处理异常情况(比如某个分区没挂载、disk_part文件内容不对)。把你的脚本改成这样:
#! /bin/echo this file should be sourced, not executed die() { echo "FATAL ERROR: $*" >&2 exit 1 } # 遍历所有路由器相关的SMB挂载点 for mount_point in /Volumes/router*; do # 检查disk_part文件是否存在 disk_part_file="${mount_point}/disk_part" if [ -f "$disk_part_file" ]; then drive_letter=$(cat "$disk_part_file") # 验证是不是我们预期的盘符G/H/I if [[ "$drive_letter" =~ ^[GHI]$ ]]; then # 导出变量,比如G_disk=/Volumes/router,H_disk=/Volumes/router-1 eval "${drive_letter}_disk=\"${mount_point}\"" echo "Mapped drive ${drive_letter} to ${mount_point}" else die "Invalid drive letter '$drive_letter' found in ${disk_part_file}" fi else echo "Warning: No disk_part file in ${mount_point}" >&2 fi done
这个版本会逐个检查挂载点,验证盘符合法性,比原来的通配符匹配更稳妥,还能给出警告信息。
二、用autofs(自动挂载器)彻底解决映射不稳定问题
autofs是macOS自带的自动挂载工具,能让你自定义固定挂载点,完全摆脱macOS自动生成的router/router-1这种可变名称,一步到位解决映射乱跳的问题。我给你一步步讲怎么配置:
步骤1:创建固定挂载目录
先在/Volumes下建三个对应盘符的固定目录,以后就用这些路径访问:
sudo mkdir -p /Volumes/router_G /Volumes/router_H /Volumes/router_I
步骤2:编辑autofs主配置文件
打开主配置文件/etc/auto_master:
sudo nano /etc/auto_master
在文件末尾加一行(注意不要动其他内容):
/Volumes/router_ /etc/auto_router -nosuid,soft
这里/Volumes/router_是挂载前缀,/etc/auto_router是我们接下来要写的映射规则文件,-nosuid,soft是挂载选项(soft表示挂载失败不会卡住进程)。
步骤3:编写映射规则文件
创建并编辑/etc/auto_router:
sudo nano /etc/auto_router
按格式添加每个盘符的挂载规则(把路由器IP、用户名、密码换成你自己的):
G -fstype=smbfs,username=你的共享用户名,password=你的共享密码 ://192.168.1.1/G H -fstype=smbfs,username=你的共享用户名,password=你的共享密码 ://192.168.1.1/H I -fstype=smbfs,username=你的共享用户名,password=你的共享密码 ://192.168.1.1/I
⚠️ 不想明文写密码的话,可以把密码存在钥匙串,或者创建一个权限为600的~/.smbcredentials文件,里面写:
username=你的用户名 password=你的密码
然后把挂载选项改成-fstype=smbfs,credentials=~/.smbcredentials。
步骤4:重启autofs服务
让配置生效:
sudo automount -vc
之后,当你访问/Volumes/router_G时,系统会自动挂载对应的G分区,而且这个挂载点是固定死的——不管路由器怎么导出盘符,你脚本里直接用/Volumes/router_G、router_H这些路径就行,再也不用处理映射匹配的麻烦了。
如果你的路由器支持改共享名,最好把G/H/I改成有意义的名字(比如Media、Docs),这样挂载点更直观,但如果路由器只能用盘符,上面的方法完全够用。
备注:内容来源于stack exchange,提问作者Bruce

