
Ich versuche, mit Duplicity ein Backup-System einzurichten. Ich habe einen Server, den ich auf einem anderen SFTP-Server sichern möchte.
Wenn ich versuche, eine Verbindung über SFTP herzustellen, funktioniert es einwandfrei:
root@SERVER:~# sftp user@SFTP_IP
user@SFTP_IP's password:
Connected to SFTP_IP.
sftp>
Aber wenn ich versuche, Duplicity zu verwenden:
root@SERVER:~# duplicity /etc sftp://user@SFTP_IP//
BackendException: ssh connection to SFTP_IP:22 failed: Unknown server SFTP_IP
Ich habe versucht, die einzigen Anweisungen zu diesem Problem zu befolgen, die ich im Internet gefunden habe: http://tom.meinlschmidt.org/2014/04/24/duplicity-backendexception-ssh-connection-to-server22-failed-unknown-server/
Es funktionierte jedoch nicht und da der Autor kaum Einzelheiten zu den Ursachen des Problems angibt, sondern nur sagt, dass es sich wahrscheinlich um Paramiko handelt, weiß ich nicht, was ich tun soll.
Meine Konfiguration ist wie folgt:
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)
BEARBEITEN1:Ok, das Problem scheint nicht ausschließlich von Paramiko herzurühren, da ein einfaches Paramiko-SFTP-Demoprogramm aus dem Jahr 2013 (GitHub-Link) kann problemlos eine Verbindung herstellen.
EDIT2:Ich hatte dieses Problem auf einem Server mit einer fast brandneuen Wheezy-Installation. Ich habe darauf Ubuntu 14.04 (mit OpenSSH_6.6.1p1 und Paramiko 1.10.1) installiert und Duplicity (0.6.23) funktioniert einwandfrei.
Antwort1
Ok, ich habe noch ein bisschen mit dem Python-Code herumgespielt. @lxio, du hast Recht, das ist nicht wirklich ein Fehler von Paramiko oder Duplicity, aber das known_hosts-System scheint ein bisschen inkonsistent (und unklar) zu sein, aber ich habe es endlich zum Laufen gebracht.
Früher habe ich ssh myhost -p 2323
die Signatur akzeptiert, aber diese Methode scheint den spezifischen Portwert nicht in der known_hosts
Liste zu speichern (deshalb verweigert Paramiko die Verbindung, weil es denkt, der Fingerabdruck sei von ) myhost:21
. Ich habe noch keine Möglichkeit, den Schlüssel über Bash hinzuzufügen, aber ich weiß, wie ich den Fingerabdruck über Paramiko zur known_hosts
Datei hinzufüge, um sicherzustellen, dass in Zukunft eine Verbindung zum richtigen Host hergestellt wird.
Wir werden den Schlüssel über Paramiko zur Datei known_hosts hinzufügen:
- Bearbeiten
/usr/share/pyshared/duplicity/backends/sshbackend.py
:
Füge vorher hinzu keyfilename=None
:
self.client.load_host_keys("/root/.ssh/known_hosts")
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
(/root/ ist hier das Benutzerverzeichnis, bei Ihnen kann es anders sein).
Führen Sie ein Synchronisierungskommando mit Duplicity aus (wo Sie den Host verwenden). Jetzt fügt Paramiko den SSH-Fingerabdruck zu Ihren bekannten Hosts hinzu.
Entfernen Sie alle vorgenommenen Änderungen
sshbackend.py
und speichern Sie die Datei.
Sie können dies mit überprüfen cat /root/.ssh/known_hosts
. Sie werden sehen[myhost]:2323 ssh-rsa ....
Antwort2
das kann passieren, wenn der Server nicht in Ihrer .ssh/known_hosts-Datei ist. Melden Sie sich einfach einmal per SSH an und stimmen Sie dem Hinzufügen zu. Dann verschwindet der Fehler.
Antwort3
Bitte denken Sie daran, dass es sich um einen Hack handelt, da Sie jeden Fingerabdruck des Hosts akzeptieren
Vielleicht ein bisschen spät, aber ich bin selbst auf das Problem gestoßen: Es ist ein Fehler in Paramiko und noch immer nicht behoben ...
Sie müssen die Duplizität (Datei /usr/share/pyshared/duplicity/backends/sshbackend.py
) manuell patchen:
--- 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:
Quelle: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=668229