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