我正在使用 puppet 自动执行 Mac 安装。作为其中的一部分,我需要安装几个 .dmg 格式的程序。
我使用以下方法来安装它们:
sudo /usr/bin/hdiutil mount -plist -nobrowse -readonly -quiet -mountrandom /tmp Program.dmg
问题是某些 .dmg 文件附带许可证,因此脚本无法接受许可证。(使用 puppet 运行时没有 stdin/out,因此我无法手动批准它继续。)
有没有办法预先批准或强制批准许可证?
答案1
如果你有 GUI 并且能够并行执行两个命令行调用,则可以使用
/System/Library/CoreServices/DiskImageMounter.app/Contents/MacOS/DiskImageMounter /path/to/file.dmg
和
osascript accept.scpt
后者执行以下 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
在bash
,我可以写
/System/Library/CoreServices/DiskImageMounter.app/Contents/MacOS/DiskImageMounter file.dmg & osascript accept.scpt
答案2
当我遇到包含 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
(注意:我很确定并非所有上述选项都是绕过 EULA 所必需的,例如-nobrowse
,,,。但是,我使用了它们-noverify
,并且在没有它们的情况下也没有进行测试,所以我不想声称我没有测试过的东西。)-noautoopen
-mountpoint
我最终得到的是一个目录
bar.cdr
foo.dmg
right_here/
其中包含了没有被提示 EULAright_here/
的内容。foo.dmg
完成后请务必将其分离!
/usr/bin/hdiutil detach right_here/
了解更多信息:hdiutil(1) Mac OS X 手册页。
年龄变化率
答案3
如果只需要输入“Y”,则将 yes 命令放入 hdiutil 命令中:
yes | /bin/hdiutil [...]
这将模拟按“y”并在命令行返回。
要输入其他内容,只需将其作为参数放在命令行上:
yes accept | ...
这将在脚本中输入“接受”。
请注意,如果脚本多次要求输入,yes 命令将会输入多个条目。您可能会看到类似“broken pipe”的输出 - 这仅意味着您通过管道输入的命令已退出,而“yes”仍在发送输入。
答案4
如果您有需要接受的多页 EULA,您可以通过在q
接受命令的其余部分之前放置一个来进入接受部分(因为您需要的只是 中的接受退出命令less
,所以您也可以使用ZZ
或Q
)。
例如,如果 EULA 要求您键入y
以接受,则您可以运行:
yes qy | hdiutil attach ...