我有一个Python程序,可以从文件应用或删除多层加密。在这种情况下,我必须打开DMG才能访问里面的ZIP文件。我使用hidutil
制作DMG,但我被困在如何打开它和访问文件上 - 我见过的任何方法都依赖于挂载,访问挂载点和卸载,如果不智能地搜索它被安装到的位置,我就无法做到这一点。
我该怎么做?它不一定在Python中,Bash解决方案很好。
您可以使用 7zip 列出和提取 DMG 文件的内容 - 网站在这里。
在macOS上,7zip可以使用以下方法安装自制软件:
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 的一个好处是磁盘不会在挂载时突然在桌面上闪烁。
这是一个 bash 版本,它解析 hdiutil 输出以提取用于 zip 文件访问的挂载点和用于之后分离的开发条目:
#!/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"
基于这个答案,你可以使用 hdiutil info -plist
通过 Python 获取 dmg 的挂载点。这样,您就可以智能地装载、查找挂载点、列出内容和卸载。