You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需手动查找挂载点,如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:35:45