Я пытаюсь настроить систему резервного копирования с помощью 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) работает нормально.
Хорошо, я еще немного поигрался с кодом Python. @lxio, вы правы, на самом деле это не ошибка Paramiko или Duplicity, но кажется, что система known_hosts немного непоследовательна (и неясна), но я наконец-то заставил ее работать.
я использовал ssh myhost -p 2323
принять подпись, но этот метод, похоже, не сохраняет конкретное значение порта в known_hosts
list (таким образом, 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 ....
Пожалуйста, помните, что это взлом, так как вы принимаете любые отпечатки пальцев хоста
Может быть, немного поздно, но поскольку я сам столкнулся с проблемой: это ошибка в 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
это может произойти, если сервера нет в вашем файле .ssh / known_hosts. просто войдите в систему один раз через ssh и согласитесь добавить его, и ошибка исчезнет.