macOS通过脚本安装Discord.dmg后出现签名验证异常问题
macOS 14.2.1脚本自动安装DMG应用后签名验证失败的解决办法
问题背景
在MacOS 14.2.1上用bash脚本自动化安装Discord的.dmg文件,执行步骤为:
- 挂载.dmg文件
- 将.dmg内的.app文件复制到/Applications目录
- 卸载.dmg
但脚本安装完成后,打开Discord时会弹出“无法打开,因为无法验证开发者”的提示,手动拖放安装则无此问题。Discord本身是经过官方签名验证的应用。
所用脚本
#!/bin/sh hdiutil attach ~/Downloads/Discord.dmg -quiet -nobrowse cp -rf /Volumes/Discord/Discord.app /Applications hdiutil detach /Volumes/Discord
签名验证错误信息
执行codesign --verify /Applications/Discord.app验证签名时,输出如下错误:
/Applications/Discord.app: bundle format is ambiguous (could be app or framework) In subcomponent: /Applications/Discord.app/Contents/Frameworks/Electron Framework.framework
问题原因
Discord基于Electron框架开发,这类应用的Contents/Frameworks目录下包含嵌套的框架bundle。用cp -rf递归复制时,会破坏框架的签名元数据和权限结构,导致macOS无法正确识别应用的签名。而手动拖放安装时,macOS会用专门的处理逻辑保留签名完整性。
解决方法
1. 替换复制命令为rsync
rsync能更好地保留文件的权限、元数据和签名信息,适合复制带签名的应用bundle:
修改脚本中的复制命令为:
rsync -a /Volumes/Discord/Discord.app /Applications/
完整优化后的脚本:
#!/bin/sh DMG_PATH=~/Downloads/Discord.dmg # 动态获取挂载路径,避免同名冲突 MOUNT_PATH=$(hdiutil attach "$DMG_PATH" -quiet -nobrowse | grep -E '/Volumes/.*' | awk '{print $NF}') # 用rsync复制应用 rsync -a "$MOUNT_PATH"/Discord.app /Applications/ # 卸载挂载点 hdiutil detach "$MOUNT_PATH" -quiet
2. 修复已损坏的应用签名(针对已用cp安装的情况)
如果已经用cp命令复制了应用,可以通过以下步骤修复:
- 移除应用的隔离属性:
sudo xattr -rd com.apple.quarantine /Applications/Discord.app - 重新签名应用(用临时签名让系统绕过验证,仅适用于信任的应用):
sudo codesign --force --deep --sign - /Applications/Discord.app
内容的提问来源于stack exchange,提问作者Youssef Hammad
相关产品推荐
相关产品推荐

