【问题标题】:Python Fabric : abort_on_prompts doesn't workPython Fabric:abort_on_prompts 不起作用
【发布时间】:2015-10-25 16:39:09
【问题描述】:

我试图在与 Fabric 建立 SSH 连接期间跳过提示。喜欢Python Fabric: Skip logins needing passwords。我在文档中读到选项 abort_on_prompts 应该这样做。但我不能让它工作。

#!/usr/bin/python

from fabric.api import *

env.abort_on_prompts=True

def remote_cmd(server_name):
  with settings(hide('output','running','warnings'),
                host_string=server_name,
                user = 'john',
                key_filename = '/home/john/id_rsa',
                warn_only=True):
  return run('ls /data/')


server_name = 'server01'
ls_result = remote_cmd(server_name)

这段代码一直要求我输入 server01 的密码(因为它没有公钥),而我想跳过它。

【问题讨论】:

  • 你确定你的/home/john/id_rsa.pub在远程.ssh/authorized_keys中吗?
  • 不,它不在远程;我不想这样,这就是为什么我想跳过它:)
  • 那您认为服务器如何对您进行身份验证?如何确定您是john 而无需提供密码或公钥?你能指望什么 ?停止/跳过连接的程序?
  • 是的,这就是我所期望的,因为“abort_on_prompts”应该这样做 -> Fabric documentation
  • 我在运行你的代码时没有这个问题:Fatal error: Needed to prompt for a connection or sudo password (host: xxx), but abort-on-prompts was set to True. Aborting

标签: python fabric ssh-keys


【解决方案1】:

感谢FunkySayu,我终于找到了解决方案以及问题所在。 我在 Debian 6 上使用了 Python 2.6.6 和 Fabric 0.9。 所以我在 Debian 8 上用 Python 2.7.9 和 Fabric 1.10 试了一下,效果很好!

abort_on_prompts 退出脚本,但我想跳过它。这是我找到的解决方案:

#!/usr/bin/python

from fabric.api import *

env.abort_on_prompts=True

def remote_cmd(server_name):
  with settings(hide('output','running','warnings'),
            host_string=server_name,
            user = 'john',
            key_filename = '/home/john/id_rsa',
            warn_only=True):
    return run('ls /data/')


servers = (('server01',), ('server02',))
for row in servers:
  server_name = row[0]

  print "Connection to ", server_name

  try:
    result_ls = remote_cmd(server_name)
    print result_ls
  except SystemExit:
    print server_name," doesn't have the key"

在此示例中,server01 在 authorized_key 文件中没有公钥。但没有坏处,脚本会继续运行,打印一条消息,然后在 server02 上运行命令。 我希望它很清楚:)

me@myserver:~$ ./test_fabric.py
Connection to  server01

Fatal error: Needed to prompt for a connection or sudo password (host: server01), but abort-on-prompts was set to True

Aborting.
server01  doesn't have the key

Connection to server02
[we see the results of ls command]

【讨论】:

  • 还可以在 Debian 7 上使用 Python 2.7.3 和 Fabric 1.8。
【解决方案2】:

为了使用 python fabric.api env.abort_on_prompts = True 并管理 abort 事件,必须将它与 try/except SystemExit 一起使用陈述。下面是一个简单的示例,abort_on_promt_test.py,用于在您的 localhost 中对其进行测试,为执行定义一个本地角色。

from fabric.api import settings, env, run
from termcolor import colored

env.roledefs = {
    'local': ['localhost'],
}


def command(cmd):
    """
Run a command in the host/s
    :param cmd: bash command to be executed
     eg: fab -R local command:"hostname"
     eg: fab -R local command:"ls -ltra"
    """

    env.abort_on_prompts = True
    try:
        with settings(warn_only=False):
            run(cmd)
    except SystemExit:
        print colored('===============================================', 'red')
        print colored('HOST: ' + env.host_string + ' aborted on prompt', 'red')
        print colored('===============================================', 'red')

这是其测试执行输出

delivery@delivery-E5450$ fab -f abort_on_promt_test.py -R local command:"hostname"
[localhost] Executing task 'command'
[localhost] run: hostname

Fatal error: Needed to prompt for a connection or sudo password (host: localhost), but abort-on-prompts was set to True

Aborting.
===============================================
HOST: localhost aborted on prompt
===============================================

Done.

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 2012-02-15
    • 2017-05-24
    • 2015-10-08
    • 2013-10-05
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多