我正在尝试使用 Duplicity 设置备份系统。我有一台服务器,我想将其备份到另一台 SFTP 服务器。
如果我尝试通过 sftp 连接,它可以正常工作:
root@SERVER:~# sftp user@SFTP_IP
user@SFTP_IP's password:
Connected to SFTP_IP.
sftp>
但是当我尝试使用 Duplicity 时:
root@SERVER:~# duplicity /etc sftp://user@SFTP_IP//
BackendException: ssh connection to SFTP_IP:22 failed: Unknown server SFTP_IP
我尝试按照在网上找到的关于此问题的唯一说明进行操作: http://tom.meinlschmidt.org/2014/04/24/duplicity-backendexception-ssh-connection-to-server22-failed-unknown-server/
然而它并没有起到作用,而且由于作者几乎没有给出导致该问题的原因的详细信息,只是这可能是 paramiko,我不知道该怎么做。
我的配置如下:
root@SERVER:~# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 7.7 (wheezy)
Release: 7
Codename: wheezy
root@SERVER:~# ssh -V
OpenSSH_6.0p1 Debian-4+deb7u2, OpenSSL 1.0.1e 11 Feb 2013
root@SERVER:~# duplicity -V
duplicity 0.6.18
root@SERVER:~# python -c "import paramiko; print paramiko.__version__"
1.7.7.1 (George)
编辑1:好吧,问题似乎并不完全出自 paramiko,因为 2013 年有一个简单的 paramiko sftp 演示程序(github 链接) 能够顺利连接。
编辑2:我在一台几乎全新安装 Wheezy 的服务器上遇到了这个问题,我在其上安装了 Ubuntu 14.04(带有 OpenSSH_6.6.1p1 和 paramiko 1.10.1),而 Duplicity(0.6.23)运行正常。
答案1
好的,我对 Python 代码进行了更多的修改。@lxio 你是对的,这实际上不是 Paramiko 或 Duplicity 的错误,但似乎 known_hosts 系统似乎有点不一致(并且不清楚),但我终于让它工作了。
我曾经ssh myhost -p 2323
接受过签名,但是这种方法似乎没有将特定的端口值存储在列表中known_hosts
(因此 Paramiko 拒绝连接,因为它认为指纹是的myhost:21
。我仍然不知道如何通过 bash 添加密钥,但我知道如何通过 Paramiko 将指纹添加到文件中,known_hosts
以确保它将来能够连接到正确的主机。
我们将通过 Paramiko 将密钥添加到 known_hosts 文件中:
- 编辑
/usr/share/pyshared/duplicity/backends/sshbackend.py
:
在之前添加keyfilename=None
:
self.client.load_host_keys("/root/.ssh/known_hosts")
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
(这里的/root/是用户目录,对于您来说这可能有所不同)。
使用 Duplicity(您使用主机的地方)执行同步命令。现在 Paramiko 会将 ssh 指纹添加到您的 known_hosts。
删除您对文件所做的所有编辑
sshbackend.py
并保存。
你可以使用以下方法验证cat /root/.ssh/known_hosts
。你会看到[myhost]:2323 ssh-rsa ....
答案2
如果服务器不在您的 .ssh/known_hosts 文件中,就会发生这种情况。只需通过 ssh 登录一次并同意添加它,错误就会消失。
答案3
请记住,这是一种黑客行为,因为您将接受主机的任何指纹
可能有点晚了,但是我自己也遇到了这个问题:这是 paramiko 中的一个错误,仍然没有修复......
您需要手动修补 duplicity (文件/usr/share/pyshared/duplicity/backends/sshbackend.py
):
--- sshbackend.py.orig 2012-04-10 12:32:27.000000000 +1000
+++ sshbackend.py 2012-04-10 12:38:10.000000000 +1000
@@ -127,6 +127,10 @@
if (m!=None):
keyfilename=m.group(1)
+ # workaround for #668239 in paramiko: port!=22 causes key lookup to fail
+ # but the default policy is to reject unknown keys...
+ self.client.set_missing_host_key_policy(paramiko.WarningPolicy())
+
if parsed_url.port:
portnumber=parsed_url.port
else:
来源: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=668229