Вопрос по python, macos, ssh, paramiko – Парамико «Неизвестный сервер»

26

Я пытаюсь начать работу с библиотекой Paramiko, но библиотека выдает исключение, как только я пытаюсь подключиться с помощью следующей простой программы:

import paramiko
ssh = paramiko.SSHClient()
ssh.connect('127.0.0.1', username='boatzart', password='mypassword')

Я получаю ошибку:

Traceback (most recent call last):
File "test.py", line 6, in <module>
ssh.connect('127.0.0.1')
File "build/bdist.macosx-10.7-intel/egg/paramiko/client.py", line 316, in connect
File "build/bdist.macosx-10.7-intel/egg/paramiko/client.py", line 85, in missing_host_key
paramiko.SSHException: Unknown server 127.0.0.1

Это происходит независимо от того, какой сервер я пытаюсь.

Ваш Ответ

5   ответов
6

лема была в том, что ssh-сервер отправлял ключи ecdsa, которые не поддерживаются (пока) с paramiko. В моей системе Debian Wheezy я отключил ecdsa, закомментировав одну строку в / etc / ssh / sshd_config:

# HostKey / etc / ssh / ssh_host_ecdsa_key

Перезапустил sshd, и он вернулся к использованию RSA. В моем файле known_hosts было несколько ключей ecdsa, поэтому я просто удалил их для сброса и вошел в систему вручную, чтобы воссоздать ключи. Оттуда Paramiko работал отлично, как и ожидалось, с проверкой ключа хоста RSA.

2

Call the HostKeys.add on the instance returned by SSHClient.get_host_keys before calling the connect, passing it the trusted key.

from base64 import decodebytes
# ...

keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
client.get_host_keys().add('example.com', 'ssh-rsa', key) 

To see how to obtain the fingerprint for use in the code, see my answer to:
Verify host key with pysftp.

Or load the already cached hostkey (e.g. by the command-line ssh) using client.load_system_host_keys().

Or you can at least cache the hostkey from the first attempt to make sure it does not change in the future.

For that use SSHClient.load_host_keys before connect. It makes Paramiko automatically add the new host key to the file (when combined with AutoAddPolicy).

70

и вот решение, которое сработало для меня:

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('127.0.0.1', username=username, password=password)
stdin, stdout, stderr = client.exec_command('ls -l')

Это должно установить политику, которая будет использоваться при подключении к серверу, у которого нет ключа хоста ни в системном, ни в локальном объекте HostKeys. Политика по умолчанию - отклонять все неизвестные серверы (используя RejectPolicy). Вы можете заменить AutoAddPolicy или написать свой собственный класс политики.

Более подробная информация напарамико апи док, Надеюсь это поможет.

Есть лиAutoAddPolicy() добавьте ключ host_key в known_hosts. Так что в следующий раз при запуске я могу удалитьset_missing_host_key_policy() и просто использоватьload_system_host_keys()?
Оно работает. Я тестировал на windows10
@nidHi Только если вы скажете, откуда загружать ключи, позвонивSSHClient.load_host_keys, Увидетьmy answer
Это работает, и я тоже так делаю, но стоит упомянуть, что вы автоматически доверяете целевой машине и технически подвержены воздействию человека в середине атаки. Просто упомянуть предостережение!
24

что вам не хватает ключа хоста, довольно загадочного "Неизвестного сервера" это ключ - поскольку исключение было поднято изmissing_host_key

Попробуйте это вместо:

import paramiko

paramiko.util.log_to_file('ssh.log') # sets up logging

client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('127.0.0.1', username=username, password=password)
stdin, stdout, stderr = client.exec_command('ls -l')
6

я могу подключиться из оболочки, но paramiko сообщает «Неизвестный сервер workdevel114».

В знакомых_хостах было две похожих записи:

[email protected]> grep workdevel114 ~/.ssh/known_hosts
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF....
[email protected]> grep I1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF ~/.ssh/known_hosts
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sK...
|1|f/auQ9nY5dFbVtOdY3ocjtVO9dM=|esvazUDTT3VIcLk9DxmPI6FZt1s= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4...

Запись секунд (| 1 | ....), кажется, сбивает с толку paramiko. Я думаю, это связано с этим билетом:https://github.com/paramiko/paramiko/issues/67

Я решил это, добавив эту строку:

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

Но это отключает проверку хоста протокола ssh в этом случае: Paramiko считает, что ключ хоста неизвестен, но он известен. Известный ключ игнорируется. Мне все равно, потому что атаки "человек посередине" очень маловероятны в моем окружении.

paraiko-версия: 1.7.7.1-1ubuntu1

Я знаю, что это старый поток, но добавление & quot; set_missing_host_key_policy & quot; решил мою проблему, используя "load_system_host_keys" было недостаточно

Похожие вопросы