自动获取DMG文件的内容

时间:2018-01-14 07:32:17

标签: python bash dmg

我有一个Python程序,可以从文件中应用或删除多层加密。在这种情况下,我必须打开一个DMG来访问里面的ZIP文件。我使用hidutil来制作DMG,但我仍然坚持如何打开它并访问文件 - 我所见过的任何方法都依赖于安装,访问挂载点和卸载,我不能没有聪明地搜索它的安装位置。

我该怎么做?它不一定是在Python中,Bash解决方案很好。

3 个答案:

答案 0 :(得分:1)

基于this answer,您可以使用hdiutil info -plist通过Python获取dmg的挂载点。这样您就可以安装,查找安装点,列出内容并智能地卸载。

答案 1 :(得分:1)

您可以使用 7zip 列出并提取DMG文件的内容 - 网站为here

在macOS上, 7zip 可以使用 homebrew 安装:

brew install p7zip

然后,如果您有DMG文件,则可以使用以下内容列出内容:

7z l SomeDisk.dmg

示例输出

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs x64)

...
...

Modified = 2018-01-14 13:28:17

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2018-01-14 13:28:16 D....                            MyFunkyDMG
2018-01-14 13:28:16 D....                            MyFunkyDMG/.HFS+ Private Directory Data
2018-01-14 13:28:17 .....       524288       524288  MyFunkyDMG/.journal
2018-01-14 13:28:16 .....         4096         4096  MyFunkyDMG/.journal_info_block
2017-08-27 13:50:45 .....          255         4096  MyFunkyDMG/client.py
2017-08-27 13:49:22 .....          356         4096  MyFunkyDMG/server.py
2018-01-14 13:28:16 D....                            MyFunkyDMG/[HFS+ Private Data]
------------------- ----- ------------ ------------  ------------------------
2018-01-14 13:28:17             528995       536576  4 files, 3 folders

然后你可以使用:

提取一个名为FRED的新目录
7z x -oFRED SomeDisk.dmg 

使用 7zip 的一个好处是,在安装桌面时,磁盘不会突然闪现。

答案 2 :(得分:1)

这是一个bash版本,它解析hdiutil输出以提取zip文件访问的挂载点,然后解压缩dev条目:

#!/bin/bash

dmg_path="$1"

# use process redirection to capture the mount point and dev entry
IFS=$'\n' read -rd '\n' mount_point dev_entry < <(
    # mount the diskimage; leave out -readonly if making changes to the filesystem
    hdiutil attach -readonly -plist "$dmg_path" | \

    # convert output plist to json
    plutil -convert json - -o - | \

    # extract mount point and dev entry
    jq -r '
        .[] | .[] |
        select(."volume-kind" == "hfs") |
        ."mount-point" + "\n" + ."dev-entry"
    '
)

# work with the zip file
ls "$mount_point/*.zip"

# unmount the disk image
hdiutil detach "$dev_entry"