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

Python结构给出:致命错误:没有现有会话,python,fabric,Python,Fabric,我从文档中获得了以下简单的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.20

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


有什么想法吗?

嗯,猜猜看。。。你试过这个吗

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

我记得我为一个类似的问题应用了这个faq条目:

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

我猜OP在ssh上也有一些暂时性的问题,因此出现了相同的(不是特别清楚的)paramiko错误。

来修复它

  • 将以下行添加到您的fabric recept:

    from fabric.api import env
    
    env.key_filename = "/path/to/.ssh/ssk_non_public_key"
    
    如果您在需要由fab脚本访问的服务器上放置了公共ssh密钥

  • 如果否--删除您的.ssh目录,这也会有所帮助


  • 或者,您可以通过ssh keygen创建ssh密钥,然后使用1)和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
    
    你可以:

    但是,您需要告诉Fabric为特定主机使用特定密钥。如上所述,您可以通过以下方式在文件中执行此操作:

    from fabric.api import env
    
    env.key_filename = "/path/to/.ssh/ssk_non_public_key"
    
    更一般地说,在这个密钥中,使用SSH密钥。要使其自动工作,您需要将IdentityFile添加到
    ~/.ssh/config

    Host example.com
        IdentityFile /home/jp/.ssh/id_rsa_example
    
    失败的另一个原因可能是。这有点问题: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是否满意。但是,如果这就是问题所在,并且没有解决问题,那么我看不到明确的解决方案。

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

    我在
    ~/.ssh/config
    中有私钥,结果我需要使用
    ssh add~/.ssh/private\u key\u NAME
    再次添加私钥,然后一切又开始工作。我对转发代理optioni
    -A

    使用了命令,但声誉不足,无法在帖子上评论,无法回答问题。这不是一个bug,而是SSH公钥处理方式中的一个工件


    我的问题是我加载到ssh代理(ed25519)中的一个密钥与我在fabric中加载到env.hosts中的一个系统不兼容。因为我确实想使用我的其他键,所以我只是在fabric中添加了-a选项,而不是-k选项。这起作用了。唯一需要注意的是,如果您的一个私钥受密码保护,则每次使用密钥时都必须输入此密码短语

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

    文件名:fabfile.py从命令行运行:fab-检查服务


    您的ssh会话发生了一些奇怪的事情。服务器运行的是什么操作系统?请尝试
    ssh-o“PreferredAuthentications=password”
    并查看它是否拒绝您的访问。这刚刚开始工作。除了停止虚拟机并重新启动它们之外,我没有改变任何我能记得的事情,但我认为我以前已经做过了……无论如何,感谢所有的想法。你提交了错误报告吗?这在Fabric2中不起作用,添加
    -a
    返回
    不知道-a是什么您是否提交了错误报告?
    
    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]
    
    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")