使用带有Fabric的SSH密钥文件

Yuv*_*dam 94 python fabric

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

Yuv*_*dam 145

由于某种原因,使用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')
Run Code Online (Sandbox Code Playgroud)

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

  • 在实践中,这是更好的答案. (4认同)
  • `env.key_filename` [可以包含字符串列表](http://docs.fabfile.org/en/latest/usage/env.html#key-filename)为连接尝试多个密钥文件. (3认同)
  • 我使用“settings”上下文管理器在一项任务中以编程方式设置密钥,直到我将“key_filename='/path/to/key”更改为“key_filename=['/”,才使其识别 key_filename path/to/key']` 因此,如果其他人遇到问题,将 key_filename 设为键列表可能会修复它。这是 fab 1.10.1 和 Paramiko 1.15.2 的情况 (2认同)
  • @AseemHegshetye,它在最新的Fabric 2中删除了.这个答案适用于Fabric 1. (2认同)

Tho*_*mas 66

另外值得一提的是,您可以使用命令行参数:

fab command -i /path/to/key.pem [-H [user@]host[:port]]
Run Code Online (Sandbox Code Playgroud)


Yuv*_*dam 64

从Fabric 1.4开始,另一个很酷的功能 - Fabric现在支持SSH配置.

如果您已经在~/.ssh/config文件中拥有所有SSH连接参数,Fabric将本机支持它,您只需添加:

env.use_ssh_config = True
Run Code Online (Sandbox Code Playgroud)

在fabfile的开头.

  • 很有用!如果你遇到像'IOError:[Errno 2]这样的错误没有这样的文件或目录:'/ path/to/.ssh/key'`或'root'的登录密码:`'确保你的空格没有空格`的.ssh/config`.例如`User = root`而不是`User = root` ... (2认同)

Gau*_*wal 15

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

env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]
Run Code Online (Sandbox Code Playgroud)

要么

fab command -i /path/to/key.pem [-H [user@]host[:port]]
Run Code Online (Sandbox Code Playgroud)

但是,以下做了:

env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]
Run Code Online (Sandbox Code Playgroud)

要么

env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用`env.user ="ubuntu"`而不是`env.user = ["ubuntu"]`,你的第一个例子对我有用. (3认同)

Mik*_*keL 14

对于使用fabfile的fabric 2.2.2,您可以使用以下命令:

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')
Run Code Online (Sandbox Code Playgroud)

并运行它:

fab staging do_something_remote
Run Code Online (Sandbox Code Playgroud)


fla*_*g19 7

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

看着paramiko(ssh用于ssh的库)日志,我发现了这一行:

不兼容的ssh peer(没有可接受的kex算法)

我更新paramiko了:

sudo pip install paramiko --upgrade
Run Code Online (Sandbox Code Playgroud)

现在它正在发挥作用.