在命令行上安装 DMG 时绕过许可协议

Vit*_*ner 16 dmg-image hdiutil macos

我正在使用 puppet 自动化我的 Mac 安装。作为其中的一部分,我需要安装几个 .dmg 格式的程序。

我使用以下方法安装它们:

sudo /usr/bin/hdiutil mount -plist -nobrowse -readonly -quiet -mountrandom /tmp Program.dmg
Run Code Online (Sandbox Code Playgroud)

问题是某些 .dmg 文件附带了许可证,因此脚本无法接受许可证。(使用 puppet 运行时没有 stdin/out,所以我无法手动批准它继续。)

有没有办法预先批准或强制批准许可证?

小智 18

当我遇到一个包含 EULA 的 .dmg 时,这对我有用,我想通过命令行安装它而无需用户交互......

/usr/bin/hdiutil convert -quiet foo.dmg -format UDTO -o bar
/usr/bin/hdiutil attach -quiet -nobrowse -noverify -noautoopen -mountpoint right_here bar.cdr
Run Code Online (Sandbox Code Playgroud)

(注意:我有理由确信并非所有上述选项都需要绕过 EULA,例如-nobrowse, -noverify, -noautoopen, -mountpoint。但是,我使用了它们并且我没有在没有它们的情况下进行测试,所以我不想声称我没有测试过。)

我最终得到的是一个目录

bar.cdr
foo.dmg
right_here/
Run Code Online (Sandbox Code Playgroud)

其中right_here/包含 的内容,foo.dmg而不会提示您输入 EULA。

完成后一定要分离!

/usr/bin/hdiutil detach right_here/
Run Code Online (Sandbox Code Playgroud)

更多信息:hdiutil(1) Mac OS X 手册页

青年会


小智 7

如果只需要输入“Y”,则将 yes 命令通过管道输入 hdiutil 命令:

yes | /bin/hdiutil [...]
Run Code Online (Sandbox Code Playgroud)

这将模拟按“y”并在命令行中返回。

要键入其他内容,只需将其作为参数放在命令行上:

yes accept | ...
Run Code Online (Sandbox Code Playgroud)

这将在脚本中输入“接受”。

请注意,如果脚本多次要求输入,yes 命令将输入​​多个条目。您可能会看到类似 'broken pipe' 的输出 - 这仅意味着您通过管道输入的命令退出而 'yes' 仍在发送输入。


小智 6

我最近遇到了一个带有 EULA 的 DMG,这让我很恼火,因为我无法围绕它编写脚本。我发现如果我将 DMG 转换为 CDR,它会在安装 CDR 时绕过 EULA。

这是我所做的:

hdiutil convert foo.dmg -format UDTO -o bar.cdr
hdiutil attach bar.cdr
rm foo.dmg <--optional
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


Dan*_*eck 2

如果您有 GUI 并且能够并行执行两个命令行调用,则可以使用

/System/Library/CoreServices/DiskImageMounter.app/Contents/MacOS/DiskImageMounter /path/to/file.dmg
Run Code Online (Sandbox Code Playgroud)

osascript accept.scpt
Run Code Online (Sandbox Code Playgroud)

后者执行以下 AppleScript:

tell application "System Events"
    delay 5 # wait 5 seconds -- I tested it using two terminal tabs and needed the time
    key code 48 # press tab 4 times in the license window
    key code 48
    key code 48
    key code 48
    keystroke " " # press space to click "accept"
end tell
Run Code Online (Sandbox Code Playgroud)

在 中bash,我能够写

/System/Library/CoreServices/DiskImageMounter.app/Contents/MacOS/DiskImageMounter file.dmg & osascript accept.scpt
Run Code Online (Sandbox Code Playgroud)