使用身份的 Fabrics 2.x ssh 连接无法工作

Ser*_*nky 5 python ssh fabric python-fabric-2

尝试使用 Fabrics 2 和身份文件连接到 ssh 配置中描述的主机。

con = Connection('my_host')
@task
def tt(c):
    con.run('uname -a')
Run Code Online (Sandbox Code Playgroud)

〜/ .ssh /配置:

Host my_host
    HostName 123.144.76.84
    User ubuntu
    IdentityFile ~/.keys/somekey
Run Code Online (Sandbox Code Playgroud)

它失败了

paramiko.ssh_exception.AuthenticationException:身份验证失败。

$ ssh my_host从终端工作。

我尝试过得到fab -i ~/.keys/somekey tt相同的结果。

ete*_*yro 1

Fabric接受可迭代的主机作为任务中的参数。根据文档:

适用于最终实例化连接的主机连接说明符的可迭代。当从 CLI 调用时,此参数的存在将触发任务的自动参数化,类似于 --hosts 的行为。

其中成员之一可能是:

适合作为 Connection 的第一个位置参数的字符串 - 有关详细信息,请参阅其文档,但这些通常是仅速记的方便字符串,例如 hostname.example.com 或 user@host:port。

至于您的示例,请尝试对 fabfile.py 执行此操作:

host_list = ["my_host"]

@task(hosts=host_list)
def tt(c):
    c.run('uname -a')
Run Code Online (Sandbox Code Playgroud)

或者,您可以从 fabfile 中完全省略主机声明。如果您未在 中指定主机fabfile.py,则只需在调用 cli 实用程序时将其指定为主机即可fab。如果你的 fabfile.py 是这样的:

@task
def tt(c):
    c.run('uname -a')
Run Code Online (Sandbox Code Playgroud)

您现在可以在SSH 客户端配置的fab -H my_host tt别名上运行它。tt

希望这可以帮助。