如何让Fabric自动与shell命令交互?结合pexpect?

19 投票
3 回答
8008 浏览
提问于 2025-04-17 07:12

想要让 Fabric 自动与命令行指令互动,而不是让用户手动输入(不仅仅是输入密码,还包括在没有像 apt-get install -y 这样的“非交互式”选项时需要用户输入的内容)。

这个问题和这些 Fabric 文档 表明,Fabric 只能把交互的部分推给正在运行 Fabric 程序的人。希望能实现完全自动化,不需要任何人参与。目前还没有“真实”的问题需要解决,只是在为未来可能遇到的障碍做准备。

如果 Fabric 不能完全自动处理所有的输入和提示,可能可以考虑结合使用 pexpect(或者其他类似的工具)。希望这不是一个“只能选一个”的情况。如果可以的话,为什么不在同一个程序或自动化中同时利用 pexpect 和 Fabric 呢?

3 个回答

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()
15

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

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

fab 命令和其他命令一样,所以可以通过 pexpect 来编写脚本。

19

作为Glenn,我建议你使用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的文章,讲的是如何在fabric中用pexpect处理提示信息

撰写回答