16

Я автоматизирую установку моего Mac с помощью Puppet. В рамках этого мне нужно установить несколько программ в формате .dmg.

Я использую следующее для их монтирования:

sudo /usr/bin/hdiutil mount -plist -nobrowse -readonly -quiet -mountrandom /tmp Program.dmg

Проблема в том, что некоторые файлы .dmg поставляются с прикрепленной лицензией, поэтому скрипт застревает, принимая лицензию. (При запуске с puppet нет стандартного ввода / вывода, поэтому я не могу подтвердить его вручную, чтобы продолжить.)

Есть ли способ предварительно одобрить или принудительно одобрить лицензию?

6 ответов6

17

Это сработало для меня, когда я столкнулся с .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 без запроса лицензионного соглашения.

Не забудьте отсоединиться, когда вы закончите!

/usr/bin/hdiutil detach right_here/

Для получения дополнительной информации: hdiutil(1) Страница Mac OS X.

YMMV

7

Если для этого просто нужно ввести "Y", то передайте команду yes в команду hdiutil:

yes | /bin/hdiutil [...]

Это будет эмулировать нажатие клавиши 'y' и возврат в командную строку.

Чтобы ввести что-то еще, просто поместите это в командную строку в качестве параметра:

yes accept | ...

Это введет «принять» в сценарий.

Обратите внимание, что если скрипт запрашивает ввод несколько раз, команда yes добавит несколько записей. Вы можете увидеть вывод как «сломанный канал» - это просто означает, что команда, которую вы отправили в quit, пока «да» все еще отправляла ввод.

5

Недавно я столкнулся с DMG, у которого было лицензионное соглашение, и это действительно раздражало меня, так как я не мог писать сценарии вокруг него. Я понял, что если я преобразовал DMG в CDR, он обошел EULA при установке CDR.

Вот что я сделал:

hdiutil convert foo.dmg -format UDTO -o bar.cdr
hdiutil attach bar.cdr
rm foo.dmg <--optional

Надеюсь это поможет.

2

Если у вас есть графический интерфейс и вы можете выполнять два вызова командной строки параллельно, вы можете использовать

/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
1

Если у вас есть многостраничное лицензионное соглашение, которое вам нужно принять, вы можете перейти к части принятия, поставив q перед остальной частью вашей команды принятия (так как все, что вам нужно, - это принятая команда выхода за less , вы также можете использовать ZZ или Q).

Например, если лицензионное соглашение требует от вас ввести y чтобы принять:

yes qy | hdiutil attach ...
0

Разве вы не должны использовать собственные инструменты puppet для установки пакетов? Я сам администратор Radmind, и я не знаком с puppet, но проверка их вики показывает, что есть инструмент под названием pkgdmg, который может сделать то же самое, что вы пытаетесь выполнить.

http://projects.puppetlabs.com/projects/puppet/wiki/Puppet_Mac_Osx#packagepkgdmg

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .