macOS下通过Shell脚本自动化重置Navicat试用状态

张开发
2026/4/4 7:49:17 15 分钟阅读
macOS下通过Shell脚本自动化重置Navicat试用状态
1. 为什么需要重置Navicat试用状态Navicat作为数据库管理工具中的佼佼者其Premium版本功能强大但价格不菲。很多开发者在试用期结束后仍需要临时使用某些高级功能进行测试或演示。这时候重置试用状态就成了一个实际需求。我在多个项目交接期都遇到过这种情况客户临时需要查看特定数据库结构但正版授权还没审批下来或是团队新成员加入需要先用试用版熟悉操作。手动删除配置文件虽然可行但每次都要重复查找文件路径既费时又容易出错。这个Shell脚本的价值就在于自动化完成以下操作自动识别安装的Navicat版本精准定位不同版本对应的配置文件路径彻底删除试用期相关的注册信息一键完成所有清理操作2. 脚本工作原理深度解析2.1 版本检测机制脚本开头的这段代码非常关键file$(defaults read /Applications/Navicat\ Premium.app/Contents/Info.plist) regexCFBundleShortVersionString \([^\.]) [[ $file ~ $regex ]] version${BASH_REMATCH[1]}它通过读取应用的Info.plist文件使用正则表达式提取主版本号。我测试过从Navicat 12到17的各版本这个方法是通用的。这里有个细节要注意正则表达式([^\.])特意避开了小数点只匹配主版本号确保兼容各种小版本更新。2.2 配置文件路径匹配不同版本的Navicat在macOS中存储配置的位置有差异case $version in 17) file~/Library/Preferences/com.navicat.NavicatPremium.plist ;; 16) file~/Library/Preferences/com.navicat.NavicatPremium.plist ;; 15) file~/Library/Preferences/com.prect.NavicatPremium15.plist ;; esac从实际测试来看Navicat 16开始使用了统一的配置文件命名规范而15及更早版本采用了不同的前缀。我在团队内部维护了一个更完整的版本对照表包含到12版本的支持但考虑到大部分用户已经升级到较新版本这里只保留了最近三个大版本的支持。3. 完整脚本实现与增强改进3.1 基础脚本增强版这是我在原始脚本基础上优化后的版本增加了错误处理和日志输出#!/bin/bash set -e LOG_FILE~/navicat_reset.log echo [$(date)] 开始重置Navicat试用状态 | tee -a $LOG_FILE # 版本检测 app_path/Applications/Navicat Premium.app if [ ! -d $app_path ]; then echo 错误未找到Navicat Premium应用 | tee -a $LOG_FILE exit 1 fi file$(defaults read $app_path/Contents/Info.plist 21 | tee -a $LOG_FILE) regexCFBundleShortVersionString \([^\.]) if [[ $file ~ $regex ]]; then version${BASH_REMATCH[1]} echo 检测到Navicat Premium版本: $version | tee -a $LOG_FILE else echo 版本检测失败 | tee -a $LOG_FILE exit 1 fi # 配置文件路径匹配 case $version in 17|16) prefs_file~/Library/Preferences/com.navicat.NavicatPremium.plist ;; 15) prefs_file~/Library/Preferences/com.prect.NavicatPremium15.plist ;; *) echo 不支持版本: $version | tee -a $LOG_FILE exit 1 ;; esac # 删除试用信息 echo -n 正在重置试用时间... | tee -a $LOG_FILE if [ -f $prefs_file ]; then regex([0-9A-Z]{32}) prefs_content$(defaults read $prefs_file 21) if [[ $prefs_content ~ $regex ]]; then hash${BASH_REMATCH[1]} defaults delete $prefs_file $hash 21 | tee -a $LOG_FILE fi fi # 删除隐藏的验证文件 support_dir~/Library/Application\ Support/PremiumSoft\ CyberTech/Navicat\ CC/Navicat\ Premium/ if [ -d $support_dir ]; then regex\.([0-9A-Z]{32}) for hidden_file in $(ls -a $support_dir | grep ^\.); do if [[ $hidden_file ~ $regex ]]; then rm -f $support_dir$hidden_file 21 | tee -a $LOG_FILE fi done fi echo 完成 | tee -a $LOG_FILE echo [$(date)] 重置成功 | tee -a $LOG_FILE3.2 主要改进点完善的错误处理增加了应用存在性检查、版本读取失败处理操作日志记录所有操作记录到~/navicat_reset.log文件更健壮的路径处理所有路径变量都用引号包裹避免空格问题支持多隐藏文件原脚本只处理一个隐藏文件新版会清理所有匹配的隐藏文件4. 实际使用指南4.1 脚本部署步骤打开终端使用vim或nano创建脚本文件nano ~/navicat_reset.sh粘贴上述完整脚本内容按CtrlO保存CtrlX退出给脚本添加执行权限chmod x ~/navicat_reset.sh4.2 执行方式与验证执行脚本有两种方式# 方式一使用sh解释器 sh ~/navicat_reset.sh # 方式二直接运行需有执行权限 ~/navicat_reset.sh验证是否成功检查日志文件cat ~/navicat_reset.log打开Navicat查看关于页面中的试用期是否已重置4.3 设置定时自动执行如果需要定期自动重置可以使用crontab# 每天凌晨3点自动执行 (crontab -l 2/dev/null; echo 0 3 * * * ~/navicat_reset.sh) | crontab -5. 常见问题排查5.1 脚本执行报错问题现象提示Permission denied解决方案chmod x ~/navicat_reset.sh问题现象提示未找到Navicat Premium应用解决方案确认Navicat是否安装在/Applications目录如果是自定义安装路径修改脚本中的app_path变量5.2 重置后试用期未更新可能原因Navicat版本太旧或太新不在脚本支持范围内系统中有多个Navicat版本共存使用了非Premium版本排查步骤检查日志文件中的版本检测结果手动确认配置文件路径是否存在ls ~/Library/Preferences/com.navicat* ls ~/Library/Application\ Support/PremiumSoft\ CyberTech/6. 进阶使用技巧6.1 多版本支持扩展如果需要支持更多版本可以扩展case语句case $version in 17|16) prefs_file~/Library/Preferences/com.navicat.NavicatPremium.plist ;; 15) prefs_file~/Library/Preferences/com.prect.NavicatPremium15.plist ;; 12|13|14) prefs_file~/Library/Preferences/com.prect.NavicatPremium$version.plist ;; *) echo 不支持版本: $version | tee -a $LOG_FILE exit 1 ;; esac6.2 结合LaunchAgent实现后台监控创建~/Library/LaunchAgents/local.navicat.reset.plist?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyLabel/key stringlocal.navicat.reset/string keyProgramArguments/key array string/bin/bash/string string-c/string string~/navicat_reset.sh/string /array keyStartInterval/key integer604800/integer !-- 每周执行一次 -- keyRunAtLoad/key true/ /dict /plist加载配置launchctl load ~/Library/LaunchAgents/local.navicat.reset.plist

更多文章