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