How to get Fabric to automatically (instead of user-interactively) interact with shell commands? Combine with pexpect?

筅森魡賤 提交于 2019-11-27 19:26:28

As Glenn, I would say use pexpect; in addition,

have a look at this wrapper I wrote to script the pexpect behaviour from fabric:

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')

See also my blogpost on fexpect or how to handle prompts in fabric with pexpect

It's not either/or. You just need to run the fab command through pexpect:

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

The fab command is just like any other command, so it can be scripted through pexpect.

For Windows users, use winpexpect. Make sure to use this version I linked as this version fixes some bugs in previous versions.

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()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!