19

寻求意味着让Fabric自动(而不是用户交互地)与 shell 命令交互(不仅请求密码,而且在没有“stdin/interactive override”之类apt-get install -y的可用时请求用户输入)。

这个问题连同这些Fabric 文档表明 Fabric 只能将交互性“推送回”给运行 Fabric 程序的人类用户。寻求在没有任何人的情况下完全自动化。还没有要解决的“真正的”当前问题,只是为可能的未来障碍做准备。

如果 Fabric 不能自动处理所有标准输入/提示,与pexpect (或类似的替代机制)结合可能有用吗?希望它不需要是“非此即彼”之类的东西。如果适用,为什么不在同一程序/自动化中同时利用两者(pexpect 和 Fabric)?

4

3 回答 3

19

作为格伦,我会说使用 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 处理织物中的提示

于 2012-04-04T08:39:29.487 回答
15

这不是非此即彼。你只需要通过 pexpect 运行 fab 命令:

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

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

于 2011-12-08T11:59:14.753 回答
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()
于 2013-11-06T22:18:15.513 回答