Как заставить 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()
Другие вопросы по тегам