Обойти лицензионное соглашение при монтировании DMG в командной строке

4743
Vitaly Kushner

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

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

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

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

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

16
Могли бы пойти на SF; Вы имеете дело с проблемами, возникающими при работе со многими машинами. Тем не менее, это также может пойти сюда. Kevin M 13 лет назад 0
Сделайте «да | hdiutil attach disk.dmg> / dev / null» - это наберет «Y» для вас. mauvedeity 12 лет назад 1

6 ответов на вопрос

17
sorens

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

(примечание: Я уверен, что достаточно не все из перечисленных выше вариантов необходимо обойти лицензионное соглашение, такие как -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

Это решение было идеальным, спасибо! neu242 11 лет назад 0
Спасибо - это хорошо работало с многостраничным соглашением, где повторное «у» не сработало. Lars Rohrbach 11 лет назад 1
У меня тоже сработало. Хотя мне просто нужна была первая строка, чтобы преобразовать его в файл CDR, тогда я могу просто прикрепить его без всех этих аргументов, и он работает. Maxime Viargues 6 лет назад 0
7
mauvedeity

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

yes | /bin/hdiutil [...] 

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

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

yes accept | ... 

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

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

Я никогда не пробовал это, поэтому я не знал о полном перенаправлении. Спасибо за +50! mauvedeity 12 лет назад 0
5
ciphershort

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

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

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

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

Это мне очень помогло! `Да | hdiutil ... `решения будут зависать для меня при вызове из сценария Python по какой-то безумной причине. Nathan 9 лет назад 0
2
Daniel Beck

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

/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 
Я забыл упомянуть, что я не использую марионетку. Поэтому этот ответ может быть ужасно бесполезным, но так как прошло несколько дней, я все равно написал. Daniel Beck 13 лет назад 0
хм я получаю сообщение об ошибке при попытке запустить osascript accept.scpt ➜ dotfiles git: (master) ✗ osascript accept.scpt osascript: accept.scpt: такого файла или каталога нет grant 8 лет назад 0
@grant Сначала вы должны создать файл с указанным содержимым. Daniel Beck 8 лет назад 0
1
cwhits

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

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

yes qy | hdiutil attach ... 
0
NReilingh

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

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

он не обрабатывает приложения, требующие принятия лицензии. Vitaly Kushner 13 лет назад 1
В самом деле; У меня сложилось впечатление, что вы будете создавать свои собственные пакеты без необходимости получения лицензии. Полагаю, таково мышление администратора Radmind. NReilingh 13 лет назад 0