Python Fabric给出:致命错误:没有现有会话

问题描述 投票:12回答:8

我从文档中得到以下简单的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 [email protected]: 

Fatal error: No existing session

Aborting.

我可以ssh好到192.168.0.201。

有任何想法吗?

python fabric
8个回答
22
投票

简短回答:如果您有多个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连接到服务器。


2
投票

更一般地说,如果出现此错误,您应该尝试使用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

你可以set no_keys on the Fabric env environment

env.no_keys = True

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

from fabric.api import env

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

更常见的是here's a function to parse your .ssh config and pull out selective keys - 在这个键中,使用SSH密钥。为了使其自动运行,您需要将IdentityFile添加到~/.ssh/config

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

失败的另一个原因可能是paramiko does not recognize all host key types。这有点问题:paramiko正在悄悄忽略~/.ssh/known_hosts中的主机密钥,因为它不是它理解的主机密钥格式​​。尝试用-v进行ssh,看看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是否满意。如果这是问题,但是并没有解决问题,那么我就看不到明确的解决方案了。


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)的组合


0
投票

我在~/.ssh/config有私钥,结果我需要再次使用ssh-add ~/.ssh/PRIVATE_KEY_NAME添加它然后一切都开始工作了。我使用前进代理选项-A的命令


0
投票

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

我的问题是我加载到ssh-agent(ed25519)的密钥之一与我加载到Fabric中的env.hosts的系统之一不兼容。由于我确实想使用其他密钥,我只是添加了-a选项,而不是-we选项。这很有效。唯一需要注意的是,如果您的一个私钥受密码保护,则每次使用该密钥时您都必须输入此密码。


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")

-1
投票

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

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

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


-1
投票

由于智能卡删除导致我的ssh代理失败。在“ssh user @ host”输出中可以很容易地看到问题(在我的情况下,它是“代理承认无法使用密钥签名。”消息)。

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

© www.soinside.com 2019 - 2024. All rights reserved.