
Я пытаюсь настроить систему резервного копирования с 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, поскольку простая демонстрационная программа Paramiko sftp от 2013 года (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, но я знаю, как добавить отпечаток в known_hosts
файл через Paramiko, чтобы гарантировать, что он будет подключаться к правильному хосту в будущем.
Мы добавим ключ через 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, и она до сих пор не исправлена...
Вам необходимо вручную исправить дублирование (файл /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