13

我从文档中有以下简单的 fabfile.py:

from fabric.api import run

def host_type():
    run('uname -s')

我尝试使用以下方法运行它:

fab -H 192.168.0.201 host_type

但得到错误:

me@ubuntu:~/me$ fab -H 192.168.0.201 host_type
[192.168.0.201] run: uname -s
Password for me@192.168.0.201: 

Fatal error: No existing session

Aborting.

我可以通过 ssh 进入 192.168.0.201。

有任何想法吗?

4

8 回答 8

25

简短的回答:如果您有多个 SSH 公钥并且想要使用密码身份验证,请尝试使用“-k”和“-a”命令行标志。

当我遇到这个错误时,这是​​一个非常独特的情况的结果。我在 ~/.ssh 中有许多不同的公钥。我也将许多公钥添加到我的 SSH 代理中。我试图只使用密码来使用 Fabric。

这是我在服务器身份验证日志中看到的内容:

Nov  7 07:56:02 ubuntu sshd[1862]: Disconnecting: Too many authentication failures for user [preauth]
Nov  7 07:56:08 ubuntu sshd[1864]: Disconnecting: Too many authentication failures for user [preauth]

我已指示 Fabric 使用“-k”命令行标志不使用公钥进行身份验证。我错过了 Fabric(通过 Paramiko)默认使用通过 SSH 代理可用的任何内容。在我的例子中,所有这些公钥都是在 SSH 代理中注册的,所以告诉 Fabric 不要使用公钥是一个不完整的解决方案。我添加了“-a”命令行标志,告诉 Fabric 不要查询 SSH 代理。最后,我可以使用密码身份验证通过 Fabric 连接到服务器。

于 2012-11-07T16:29:53.213 回答
3

更一般地说,如果您收到此错误,您应该尝试使用 paramiko 尝试使用的确切参数进行 SSH:

  • 主机名
  • 用户
  • 身份验证方法

我发现有太多 SSH 密钥会导致我的一些(但不是全部)结构 SSH 连接失败,因为所有密钥都提供给远程主机。过去,格式错误的密钥也为我引发了此错误消息(您可以通过从 中删除密钥来检测它们~/.ssh/,一次一个。)

不幸的是,Fabric 不尊重您的 .ssh/config 设置。如果要调试它,可以运行以下命令:

#!/usr/bin/env python
import paramiko

paramiko.util.log_to_file("/tmp/paramiko.log")
ssh = paramiko.SSHClient()
# Run this if you get host key errors: see later
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("example.com", username="myuser", password="mypassword")

并检查输出/tmp/paramiko.log- 您可能会看到如下内容:

INF [20120904-16:58:52.155] thr=1   paramiko.transport: Disconnect (code 2): Too many authentication failures for myuser

您可以在 Fabric env 环境中设置 no_keys

env.no_keys = True

但是你需要告诉 Fabric 为特定的主机使用特定的密钥。如上所述,您可以在 fabfile 中执行以下操作:

from fabric.api import env

env.key_filename = "/path/to/.ssh/ssk_non_public_key"

更一般地说,这是一个解析 .ssh 配置并提取选择性密钥的函数- 在此密钥中,是要使用的 SSH 密钥。为此,您需要将 IdentityFile 添加到~/.ssh/config

Host example.com
    IdentityFile /home/jp/.ssh/id_rsa_example

另一个失败的原因可能是paramiko 不能识别所有主机密钥类型。这有点问题:paramiko 悄悄地忽略了主机密钥~/.ssh/known_hosts,因为它不是它理解的主机密钥格式​​。尝试使用 -v 进行 ssh-ing 并查看 SSH 说它找到了主机密钥匹配的哪一行:

debug1: Host '1.2.3.4' is known and matches the RSA host key.
debug1: Found key in /home/jp/.ssh/known_hosts:105

您可以尝试删除此行,然后再次执行 ssh 并接受(新?)主机密钥,然后看看 paramiko 是否满意。但是,如果这就是问题所在,并且不能解决问题,那么我就看不到明确的解决方案。

于 2012-09-04T15:28:38.953 回答
1

我有私钥~/.ssh/config,结果我需要再次添加它,ssh-add ~/.ssh/PRIVATE_KEY_NAME然后一切都重新开始工作。我已将命令与转发代理选项一起使用-A

于 2014-11-07T14:02:38.177 回答
1

要解决这个问题

  1. 将此行添加到您的织物接收器:

    from fabric.api import env
    
    env.key_filename = "/path/to/.ssh/ssk_non_public_key"
    

    如果您将公共 ssh 密钥放在需要由 fab 脚本访问的服务器上。

  2. 如果没有 - 删除你的 .ssh 目录,这也有帮助

或者您可以通过 ssh-keygen 创建 ssh 密钥,然后使用 1) 和 2) 的组合

于 2012-02-22T17:37:56.080 回答
0

没有足够的声誉来评论Troy J. Farrell 的帖子,以回应jberryman 的问题。这不是一个错误,而是处理 SSH 公钥的方式的产物。

我的问题是我加载到 ssh-agent (ed25519) 中的密钥之一与我加载到结构中的 env.hosts 中的系统之一不兼容。因为我确实想使用我的其他密钥,所以我只是添加了 -a 选项,而不是 -k 选项到fabric。这行得通。唯一需要注意的是,如果您的其中一个私钥受密码保护,那么每次 Fabric 使用该密钥时,您都必须输入此密码。

于 2016-08-25T13:12:46.120 回答
0

fab中最简单的解决方案之一--help使用参数 -a

文件名:fabfile.py 从命令行 运行:fab -a check_service

from fabric.api import run, env

env.hosts = ['127.0.0.1']
env.user = 'viraj'

def check_service():
    """
    Function will show status of nginx service. 
    """
    run ("systemctl status nginx.service")
于 2019-02-19T07:46:27.863 回答
-1

嗯,只是猜测......你试过这个吗?

def host_type():
    run('uname -s', pty=True)

我记得我将这个常见问题条目应用于类似的问题:http ://docs.fabfile.org/en/1.0.0/faq.html#why-do-i-sometimes-see-err-stdin-is-not- a-tty

于 2011-03-09T22:49:57.130 回答
-1

这对我来说是 ssh 代理失败,是由智能卡移除引起的。在“ssh user@host”输出中可以很容易地看到问题(在我的例子中是“代理承认使用密钥签名失败。”消息)。

我的猜测是 OP 对 ssh 也有一些暂时的问题,因此同样的(不是特别清楚)paramiko 错误。

于 2011-05-23T06:30:14.773 回答