Обойти лицензионное соглашение при монтировании DMG в командной строке
Я автоматизирую установку моего Mac с помощью Puppet. Как часть этого мне нужно установить несколько программ, которые приходят в формате.dmg.
Я использую следующее, чтобы смонтировать их:
sudo /usr/bin/hdiutil mount -plist -nobrowse -readonly -quiet -mountrandom /tmp Program.dmg
Проблема в том, что некоторые файлы.dmg поставляются с прикрепленной лицензией, и поэтому скрипт застревает, принимая лицензию. (При запуске с puppet нет стандартного ввода / вывода, поэтому я не могу подтвердить его вручную, чтобы продолжить.)
Есть ли способ предварительно одобрить или принудительно одобрить лицензию?
7 ответов
Если у вас есть графический интерфейс и вы можете выполнять два вызова командной строки параллельно, вы можете использовать
/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
Это сработало для меня, когда я столкнулся с.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/
где right_here/
содержал содержимое foo.dmg
без приглашения для EULA.
Не забудьте отделить, когда вы закончите!
/usr/bin/hdiutil detach right_here/
Для получения дополнительной информации: hdiutil (1) Страница Mac OS X.
YMMV
Если для этого просто нужно ввести "Y", то передайте команду yes в команду hdiutil:
yes | /bin/hdiutil [...]
Это будет эмулировать нажатие клавиши 'y' и возврат в командную строку.
Чтобы ввести что-то еще, просто поместите это в командную строку в качестве параметра:
yes accept | ...
Это введет "принять" в сценарий.
Обратите внимание, что если сценарий запрашивает ввод несколько раз, команда yes добавит несколько записей. Вы можете увидеть вывод как "сломанный канал" - это просто означает, что команда, которую вы отправили в quit, пока "да" все еще отправляла ввод.
Недавно я наткнулся на DMG, у которого было лицензионное соглашение, и это действительно раздражало меня, так как я не мог писать сценарии вокруг него. Я понял, что если я преобразовал DMG в CDR, он обошел EULA при установке CDR.
Вот что я сделал:
hdiutil convert foo.dmg -format UDTO -o bar.cdr
hdiutil attach bar.cdr
rm foo.dmg <--optional
Надеюсь это поможет.
Если у вас есть многостраничное лицензионное соглашение, которое вам нужно принять, вы можете перейти к части принятия, поставив q
до остальной части вашей команды принятия (поскольку все, что вам нужно, это принятая команда выхода в less
Вы также можете использовать ZZ
или же Q
).
Например, если EULA требует от вас ввести y
принять, что ты побежал:
yes qy | hdiutil attach ...
Приведенное выше решение «да» не сработало на Биг-Суре, и я понял, что это связано с тем, что лицензионное соглашение передается через пейджер, который для меня можно изменить с помощью переменной среды PAGER. Следующая команда работает мгновенно и автоматически с ожидаемым результатом:
$ yes | PAGER=cat hdiutil attach <imagename>
<EULA>
expected CRC32 $228777A9
/dev/disk2 GUID_partition_scheme
/dev/disk2s1 Apple_HFS <mountpoint>
Разве вы не должны использовать собственные инструменты puppet для установки пакетов? Я сам администратор Radmind, и я не знаком с puppet, но проверка их вики показывает, что есть инструмент под названием pkgdmg, который может сделать то же самое, что вы пытаетесь выполнить.
http://projects.puppetlabs.com/projects/puppet/wiki/Puppet_Mac_Osx