Как заставить Fabric автоматически (а не интерактивно) взаимодействовать с командами оболочки? Объединить с pexpect?
Поиск означает, что Fabric автоматически (а не в интерактивном режиме) взаимодействует с командами оболочки (и не только запрашивает пароли, но также запрашивает ввод данных пользователем, когда нет "stdin/interactive override", подобного apt-get install -y
доступен).
Этот вопрос, наряду с этими документами Fabric, предполагает, что Fabric может только "подтолкнуть интерактивность" к пользователю-пользователю, который запускает программу Fabric. Стремясь вместо этого полностью автоматизировать без какого-либо человеческого присутствия. Пока еще не решена "реальная" текущая проблема, просто готовьтесь к возможному будущему препятствию.
Возможно, полезно сочетать его с pexpect (или аналогичным альтернативным механизмом), если Fabric не может обрабатывать только все стандартные запросы / запросы автоматически? Надеюсь, что это не обязательно должно быть "или / или". Почему бы не использовать оба (pexpect и Fabric), где это уместно, если применимо, в одной программе / автоматизации?
3 ответа
Как Гленн, я бы сказал, используйте 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
Это не либо / или. Вам просто нужно запустить команду fab через pexpect:
child = pexpect.spawn('fab <task>')
child.expect('prompt:')
child.send('reponse to prompt')
... etc
Команда fab, как и любая другая команда, может быть написана через pexpect.
Для пользователей 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()