我从文档中得到以下简单的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。
有任何想法吗?
简短回答:如果您有多个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连接到服务器。
更一般地说,如果出现此错误,您应该尝试使用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是否满意。如果这是问题,但是并没有解决问题,那么我就看不到明确的解决方案了。
要解决这个问题
from fabric.api import env
env.key_filename = "/path/to/.ssh/ssk_non_public_key"
如果您将公共ssh密钥放在需要由fab脚本访问的服务器上。或者您可以通过ssh-keygen创建ssh密钥,而不是使用1)和2)的组合
我在~/.ssh/config
有私钥,结果我需要再次使用ssh-add ~/.ssh/PRIVATE_KEY_NAME
添加它然后一切都开始工作了。我使用前进代理选项-A
的命令
没有足够的声誉评论Troy J. Farrell's帖子,以回应jberryman's问题。这不是一个错误,而是处理SSH公钥的方式中的工件。
我的问题是我加载到ssh-agent(ed25519)的密钥之一与我加载到Fabric中的env.hosts的系统之一不兼容。由于我确实想使用其他密钥,我只是添加了-a选项,而不是-we选项。这很有效。唯一需要注意的是,如果您的一个私钥受密码保护,则每次使用该密钥时您都必须输入此密码。
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")
嗯,只是猜测......你试过这个吗?
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
由于智能卡删除导致我的ssh代理失败。在“ssh user @ host”输出中可以很容易地看到问题(在我的情况下,它是“代理承认无法使用密钥签名。”消息)。
我的猜测是OP也有一些ssh的短暂问题,因此同样(不是特别清楚)paramiko错误。