101

您如何配置结构以使用 SSH 密钥文件(例如,Amazon EC2 实例)连接到远程主机?

4

8 回答 8

152

由于某种原因,找到一个带有 SSH 密钥文件使用示例的简单 fabfile 并不容易。我写了一篇关于它的博客文章(带有匹配的要点)。

基本上,用法是这样的:

from fabric.api import *

env.hosts = ['host.name.com']
env.user = 'user'
env.key_filename = '/path/to/keyfile.pem'

def local_uname():
    local('uname -a')

def remote_uname():
    run('uname -a')

重要的部分是设置env.key_filename环境变量,以便 Paramiko 配置在连接时可以查找它。

于 2011-03-16T15:22:29.703 回答
69

在这里还值得一提的是,您可以为此使用命令行参数:

fab command -i /path/to/key.pem [-H [user@]host[:port]]
于 2011-03-16T23:35:24.133 回答
64

Fabric 1.4 提供的另一个很酷的功能 - Fabric 现在支持 SSH 配置

如果您的~/.ssh/config文件中已经包含所有 SSH 连接参数,Fabric 将原生支持它,您需要做的就是添加:

env.use_ssh_config = True

在您的 fabfile 的开头。

于 2012-03-27T10:21:58.487 回答
19

对于fabfile中的 fabric2,请使用以下内容:

from fabric import task, Connection

@task
def staging(ctx):
    ctx.name = 'staging'
    ctx.user = 'ubuntu'
    ctx.host = '192.1.1.1'
    ctx.connect_kwargs.key_filename = os.environ['ENV_VAR_POINTS_TO_PRIVATE_KEY_PATH']

@task
def do_something_remote(ctx):
    with Connection(ctx.host, ctx.user, connect_kwargs=ctx.connect_kwargs) as conn:
        conn.sudo('supervisorctl status')

并运行它:

fab staging do_something_remote

更新:
对于多台主机(一台主机也可以),您可以使用:

from fabric2 import task, SerialGroup

@task
def staging(ctx):
    conns = SerialGroup(
        'user@10.0.0.1',
        'user@10.0.0.2',
        connect_kwargs=
        {
            'key_filename': os.environ['PRIVATE_KEY_TO_HOST']
        })
    ctx.CONNS = conns
    ctx.APP_SERVICE_NAME = 'google'

@task
def stop(ctx):
    for conn in ctx.CONNS:
        conn.sudo('supervisorctl stop ' + ctx.APP_SERVICE_NAME)

并使用 fab 或 fab2 运行它:

fab staging stop
于 2018-08-08T09:58:17.730 回答
15

对我来说,以下方法不起作用:

env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]

或者

fab command -i /path/to/key.pem [-H [user@]host[:port]]

但是,以下操作:

env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]

或者

env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"
于 2014-02-18T07:04:21.610 回答
7

我今天必须这样做,我的 .py 文件尽可能简单,就像在@YuvalAdam 的答案中发布的那样,但我仍然不断收到输入密码的提示......

查看paramiko(fabric for ssh 使用的库)日志,我发现了这一行:

不兼容的 ssh 对等点(没有可接受的 kex 算法)

我更新paramiko了:

sudo pip install paramiko --upgrade

现在它正在工作。

于 2015-02-09T12:18:26.693 回答
1

如上所述,Fabric 会在一段时间后支持 .ssh/config 文件设置,但是为 ec2 使用 pem 文件似乎是有问题的。IOW 正确设置的 .ssh/config 文件将通过 'ssh servername' 从命令行工作,并且当 env.host=['servername'] 时无法使用 'fab sometask'。

通过在我的 fabfile.py 中指定 env.key_filename='keyfile' 并复制我的 .ssh/config 中已有的 IdentityFile 条目来克服这个问题。

这可以是 Fabric 或 paramiko,在我的例子中是 Fabric 1.5.3 和 Paramiko 1.9.0。

于 2013-02-06T20:29:59.923 回答
1

这些答案都不适用于 py3.7、fabric2.5.0 和 paramiko 2.7.1。

但是,在文档中使用 PKey 属性确实有效:http: //docs.fabfile.org/en/2.5/concepts/authentication.html#private-key-objects

from paramiko import RSAKey
ctx.connect_kwargs.pkey = RSAKey.from_private_key_file('path_to_your_aws_key')
with Connection(ctx.host, user, connect_kwargs=ctx.connect_kwargs) as conn:
    //etc.... 
于 2020-03-17T05:27:20.763 回答