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

2024-05-14 09:56:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我从文档中获得了以下简单的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。

有什么想法吗?


Tags: runfrom文档pyimportapihostdef
3条回答

更一般地说,如果出现此错误,应使用paramiko试图使用的确切参数尝试SSHing:

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

我发现,SSH密钥太多导致了我的fabric 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为特定主机使用特定密钥。如上所述,您可以在fab文件中使用:

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-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并接受(新的?)主机键,然后看看帕拉米科是否高兴。不过,如果这是问题所在,而这并不能解决问题,那么我就看不到明确的解决方案。

把它修好

  1. 将这些线条添加到您的织物收口:

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

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

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

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

简而言之:如果您有多个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连接到服务器。

相关问题 更多 >

    热门问题