如何使用python fabric自动回答提示?

aem*_*mdy 29 python command-prompt fabric

我想运行一个命令,提示我输入yes/no或y/n或者其他什么.如果我只是运行命令local("my_command")然后它停止并要求我输入.当我输入所需内容时,脚本继续工作.如何自动响应提示?

Tim*_*nin 45

从版本开始1.9,Fabric包含一种正确管理方式.

有关 Fabric文档中提示部分说:

提示词典允许用户控制交互式提示.如果在命令的标准输出流中找到字典中的键,Fabric将自动回答相应的字典值.

您应该能够使Fabric自动回答如下提示:

with settings(prompts={'Do you want to continue [Y/n]? ': 'Y'}):
    run('apt-get update')
    run('apt-get upgrade')
Run Code Online (Sandbox Code Playgroud)

  • 很确定这应该是非正式接受的答案. (3认同)
  • @aemdy这应该是现在接受的答案,开箱即用,没有任何问题. (3认同)

小智 21

我使用简单的回声管道来回答Fabric的提示.

run('echo "yes\n"| my_command')
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`yes`命令:`run("yes | my_command")` (2认同)

Jas*_*sch 12

注意:这个答案已有几年的历史了,同时面料(有趣的是看起来相似)实现了这个.请参阅下面的@timothée-jeannin的答案.

请参阅/sf/answers/700534481/

pip install fexpect

from ilogue.fexpect import expect, expecting, run 

prompts = []
prompts += expect('What is your name?','John')
prompts += expect('Are you at stackoverflow?','Yes')

with expecting(prompts):
    run('my_command')
Run Code Online (Sandbox Code Playgroud)

Fexpect通过使用pexpect补充了对结构的提示


sla*_*law 5

Fabric 2.1中,这可以使用通过调用包(Fabric 2.1 的依赖项)提供的自动响应示例来完成:

>>> from invoke import Responder
>>> from fabric import Connection
>>> c = Connection('host')
>>> sudopass = Responder(
...     pattern=r'\[sudo\] password:',
...     response='mypassword\n',
... )
>>> c.run('sudo whoami', pty=True, watchers=[sudopass])
[sudo] password:
root
<Result cmd='sudo whoami' exited=0>
Run Code Online (Sandbox Code Playgroud)

请注意,这不仅限于 sudo 密码,还可以在任何有匹配模式和预设响应(可能不是密码)的地方使用。

有几个提示:

  1. pty=True不是必需的,但可能很重要因为它使流程看起来更真实。例如,如果您有一个提示,希望得到是/否答案才能继续,没有它(pty=True)您的命令仍然会运行;除了 之外,您的选择/输入(由 指定response不会像人们预期的那样显示为键入的答案
  2. pattern在 中指定的内容通常Responder可以在行尾包含空格,因此当 看起来watcher不匹配时尝试添加空格。
  3. 根据观察者文档末尾讨论的注释:

    Responder 的模式参数被视为正则表达式,需要更多的关注(注意我们如何在上面的示例中转义方括号),但也提供了更多的功能。

    因此,不要忘记在必要时进行转义(使用反斜杠)。