如何让Fabric自动(而不是用户交互式)与shell命令交互?结合pexpect?

时间:2011-11-28 03:55:31

标签: python deployment command-prompt fabric pexpect

寻求意味着让Fabric自动(而不是用户交互式)与shell命令交互(而不仅仅是对密码的请求,还有没有“stdin / interactive override”的请求用户输入,如{{1可用)。

This question以及这些Fabric docs表明Fabric只能“将交互性”推回给运行Fabric程序的人类用户。寻求在没有任何人类存在的情况下完全自动化。还没有解决“现实”的当前问题,只是为可能的未来障碍做准备。

如果Fabric不能自动独占处理所有stdin /提示,那么与pexpect(或类似的替代机制)结合可能很有用吗?希望它不需要是"either/or" kind of thing。为什么不在适当的情况下(如果适用)在相同的程序/自动化中同时利用(pexpect和Fabric)?

3 个答案:

答案 0 :(得分:18)

作为格伦,我会说使用pexpect;另外,

看看我写的这个包装器来编写来自fabric的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 or how to handle prompts in fabric with pexpect

上的博文

答案 1 :(得分:15)

它不是/或。您只需要通过pexpect运行fab命令:

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

fab命令就像任何其他命令一样,因此可以通过pexpect编写脚本。

答案 2 :(得分:2)

对于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()