Как заставить Fabric автоматически (а не интерактивно) взаимодействовать с командами оболочки?Объединить с pexpect? - PullRequest
19 голосов
/ 28 ноября 2011

Поиск означает, что Fabric автоматически (вместо интерактивного взаимодействия с пользователем) взаимодействует с командами оболочки (и не только с запросами паролей, но также запрашивает ввод данных пользователем, когда нет "стандартного / интерактивного переопределения", подобного apt-get install -y доступно).

Этот вопрос вместе с этими документами Fabric предполагают, что Fabric может только "подтолкнуть интерактивность" назад к пользователю, работающему с Fabricпрограмма.Стремясь вместо этого полностью автоматизировать без какого-либо человеческого присутствия.Пока не решите «реальную» текущую проблему, просто готовьтесь к возможному будущему препятствию.

Возможно, полезно комбинировать с pexpect (или аналогичным, альтернативным механизмом), если Fabricне может обрабатывать исключительно все стандартные / приглашения автоматически?Надеюсь, это не должно быть "или / или" чем-то вроде .Почему бы не использовать оба (pexpect и Fabric), где это уместно, если применимо, в одной программе / автоматизации?

Ответы [ 3 ]

18 голосов
/ 04 апреля 2012

Как Гленн, я бы сказал, используйте pexpect; кроме того,

взгляните на эту оболочку, которую я написал для сценария поведения pexpect с фабрики:

from ilogue.fexpect import expect, expecting, run 

prompts = []
prompts += expect('What is your name?','John')
prompts += expect('Where do you live?','New York')

with expecting(prompts):
    run('command')

См. Также мой пост на fexpect или о том, как обрабатывать приглашения в ткани с pexpect

15 голосов
/ 08 декабря 2011

Это не или / или.Вам просто нужно выполнить команду fab через pexpect:

child = pexpect.spawn('fab <task>')
child.expect('prompt:')
child.send('reponse to prompt')
... etc

Команда fab такая же, как и любая другая команда, поэтому ее можно создавать через pexpect.

2 голосов
/ 07 ноября 2013

Для пользователей Windows используйте winpexpect . Убедитесь, что вы используете эту версию, на которую я ссылаюсь, поскольку эта версия исправляет некоторые ошибки в предыдущих версиях.

import sys, winpexpect
child = winpexpect.winspawn('ftp', ['<ftp host>'])
child.logfile = sys.stdout
child.expect('User.*:')
child.sendline('username')
child.expect('Password:')
child.direct_sendline('password')
child .sendline('ls')
print('Now enter the FTP interactive mode')
child.interact()
...