
Estou tentando configurar um sistema de backup com Duplicity. Tenho um servidor do qual desejo fazer backup em outro servidor SFTP.
Se eu tentar conectar via sftp, tudo funcionará bem:
root@SERVER:~# sftp user@SFTP_IP
user@SFTP_IP's password:
Connected to SFTP_IP.
sftp>
Mas quando tento usar o Duplicity:
root@SERVER:~# duplicity /etc sftp://user@SFTP_IP//
BackendException: ssh connection to SFTP_IP:22 failed: Unknown server SFTP_IP
Tentei seguir as únicas instruções sobre esse problema que encontrei na rede: http://tom.meinlschmidt.org/2014/04/24/duplicity-backendexception-ssh-connection-to-server22-failed-unknown-server/
No entanto, não funcionou e como o autor quase não dá detalhes sobre a causa do problema, apenas que provavelmente é paramiko, não consigo descobrir o que fazer.
Minha configuração é a seguinte:
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)
EDITAR1:Ok, o problema não parece vir estritamente do paramiko, já que um simples programa de demonstração do paramiko sftp de 2013 (link do github) consegue se conectar perfeitamente.
EDITAR2:Eu tive esse problema em um servidor com uma instalação quase nova do Wheezy, instalei um Ubuntu 14.04 (com OpenSSH_6.6.1p1 e paramiko 1.10.1) nele e o Duplicity (0.6.23) funciona bem.
Responder1
Ok, brinquei mais um pouco com o código python. @lxio você está certo, isso não é realmente um bug do Paramiko ou Duplicity, mas parece que o sistemaknown_hosts parece um pouco inconsistente (e pouco claro), mas finalmente consegui fazê-lo funcionar.
Eu costumava ssh myhost -p 2323
aceitar a assinatura, mas esse método não parece armazenar o valor da porta específico na known_hosts
lista (portanto, o Paramiko está se recusando a conectar, porque acha que a impressão digital é de myhost:21
. Ainda não tenho o correto para adicionar a chave via bash, mas sei como adicionar a impressão digital ao known_hosts
arquivo via Paramiko para garantir que ele se conectará ao host correto no futuro.
Vamos adicionar a chave via Paramiko ao arquivoknown_hosts:
- Editar
/usr/share/pyshared/duplicity/backends/sshbackend.py
:
Acrescentar antes keyfilename=None
:
self.client.load_host_keys("/root/.ssh/known_hosts")
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
(/root/ é o userdir aqui, isso pode ser diferente para você).
Execute um comando de sincronização com Duplicity (onde você usa o host). Agora Paramiko adicionará a impressão digital ssh aos seus conhecidos_hosts.
Remova todas as edições feitas
sshbackend.py
e salve o arquivo.
Você pode verificar isso usando cat /root/.ssh/known_hosts
. Você verá[myhost]:2323 ssh-rsa ....
Responder2
isso pode acontecer se o servidor não estiver no seu arquivo .ssh/known_hosts. basta fazer login uma vez via ssh e concordar em adicioná-lo e o erro desaparecerá.
Responder3
Lembre-se de que isso é um hack, pois você aceitará qualquer impressão digital do host
Talvez um pouco tarde, mas como eu mesmo encontrei o problema: é um bug no paramiko e ainda não foi corrigido...
Você precisa corrigir manualmente a duplicidade (arquivo /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:
Fonte: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=668229