无需手动查找挂载点,如何获取DMG内ZIP文件内容?(Python/Bash均可)
自动处理DMG挂载、文件访问与卸载的方案(Bash/Python)
我来帮你搞定这个问题——不用手动查找挂载路径,完全可以通过脚本自动完成DMG的挂载、内部ZIP文件访问,最后自动卸载的全流程。下面给你详细拆解两种可行方案:
Bash 方案(macOS原生,轻量直接)
Bash脚本直接调用hdiutil(macOS自带的磁盘镜像工具),可以轻松捕获挂载路径并处理后续操作:
完整脚本示例
#!/bin/bash # 配置参数 DMG_PATH="/path/to/your/encrypted.dmg" TARGET_ZIP="your_archive.zip" DESTINATION="/path/to/save/zip/" # 1. 创建临时挂载点(可选,比系统自动分配更可控) MOUNT_POINT="/tmp/dmg_temp_mount_$(uuidgen)" mkdir -p "$MOUNT_POINT" # 2. 挂载DMG(如果是加密DMG,会自动弹出密码框;如需静默处理,可加-passphrase参数) echo "正在挂载DMG文件..." if ! hdiutil attach "$DMG_PATH" -mountpoint "$MOUNT_POINT" -quiet; then echo "挂载失败,请检查DMG路径或密码" rmdir "$MOUNT_POINT" exit 1 fi # 3. 检查并复制ZIP文件 ZIP_FULL_PATH="$MOUNT_POINT/$TARGET_ZIP" if [ -f "$ZIP_FULL_PATH" ]; then echo "找到目标ZIP文件,正在复制..." cp "$ZIP_FULL_PATH" "$DESTINATION" echo "ZIP文件已保存到: $DESTINATION" else echo "挂载点中未找到指定的ZIP文件: $TARGET_ZIP" fi # 4. 卸载DMG并清理临时目录 echo "正在卸载DMG..." hdiutil detach "$MOUNT_POINT" -quiet rmdir "$MOUNT_POINT" echo "操作完成"
关键说明
- 用
uuidgen生成唯一临时挂载点,避免路径冲突 -quiet参数让命令输出更简洁,适合脚本自动化场景- 如果你的DMG是加密的,默认会弹出系统密码输入框;如果要在脚本中传递密码(不推荐明文硬编码),可以添加
-passphrase your_password参数
Python 方案(适合整合到你的加密/解密程序中)
如果要把这个流程整合到你的Python加密程序里,可以用subprocess模块调用系统命令,实现完全自动化:
完整代码示例
import subprocess import os import uuid def process_dmg(dmg_path, zip_filename, save_dir): # 创建唯一临时挂载点 mount_point = f"/tmp/dmg_mount_{uuid.uuid4().hex[:8]}" os.makedirs(mount_point, exist_ok=True) try: # 挂载DMG print("正在挂载DMG文件...") subprocess.run( ["hdiutil", "attach", dmg_path, "-mountpoint", mount_point, "-quiet"], check=True, capture_output=True, text=True ) # 检查ZIP文件是否存在 zip_full_path = os.path.join(mount_point, zip_filename) if not os.path.isfile(zip_full_path): print(f"错误:挂载点中未找到文件 {zip_filename}") return False # 复制ZIP到目标目录(这里可以替换成你的解密逻辑直接读取ZIP内容) print(f"正在处理ZIP文件: {zip_filename}") save_path = os.path.join(save_dir, zip_filename) subprocess.run( ["cp", zip_full_path, save_path], check=True, capture_output=True ) print(f"ZIP文件已成功保存到: {save_path}") except subprocess.CalledProcessError as e: print(f"操作失败: {e.stderr.strip()}") return False finally: # 确保DMG被卸载,临时目录被清理 if os.path.exists(mount_point): subprocess.run(["hdiutil", "detach", mount_point, "-quiet"], capture_output=True) os.rmdir(mount_point) print("DMG已卸载,临时目录已清理") return True # 调用示例 if __name__ == "__main__": DMG_FILE = "/path/to/your/encrypted.dmg" TARGET_ZIP = "your_archive.zip" SAVE_DIRECTORY = "/path/to/your/decode_folder/" process_dmg(DMG_FILE, TARGET_ZIP, SAVE_DIRECTORY)
关键说明
- 用
finally块确保无论操作成功与否,都会卸载DMG并清理临时目录,避免残留挂载点 - 可以把复制ZIP的逻辑替换成你的解密程序直接读取ZIP内容的代码,无需额外复制文件
- 如果DMG需要密码,同样可以在
hdiutil attach命令中添加-passphrase参数(注意密码安全,避免明文硬编码)
不管用哪种方案,都能彻底解决手动查找挂载路径的问题,完美整合到你的自动化流程里。
内容的提问来源于stack exchange,提问作者user7450368
相关产品推荐
相关产品推荐

