Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

взгляните на эту оболочку, я написал в script поведение 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

Ответ 2

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

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

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

Ответ 3

Для пользователей 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()