Вопрос-Ответ

Paramiko "Unknown Server"

Paramiko "Неизвестный сервер"

Я пытаюсь начать работу с библиотекой 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

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

Переведено автоматически
Ответ 1

Я столкнулся с такой же проблемой, и вот решение, которое сработало для меня:

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 или написать свой собственный класс политики.

Подробнее в документе paramiko api. Надеюсь, это поможет.

После этого вы можете сохранить в другой файл keyfile для следующего использования следующим образом.

ssh.get_host_keys().save('/some/file/path')

Вы всегда можете выполнить загрузку из файла следующим образом.

ssh.load_host_keys('/some/file/path')
Ответ 2

Правильный способ - это либо:


  • Вызовите HostKeys.add экземпляр, возвращенный SSHClient.get_host_keys перед вызовом connect, передав ему доверенный ключ.


    from base64 import decodebytes
    # ...

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

    В зависимости от фактического типа ключа, вам может потребоваться использовать ECDSAKey или Ed25519Key вместо RSAKey.


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

    Проверьте ключ хоста с помощью pysftp.


    Если вы знаете только отпечаток пальца, смотрите:

    Python - pysftp / paramiko - Проверяет ключ хоста по его отпечатку пальца



  • Или загрузите уже кэшированный hostkey (например, с помощью командной строки OpenSSH ssh) с помощью client.load_system_host_keys().



  • Или вы можете, по крайней мере, кэшировать hostkey с первой попытки, чтобы убедиться, что он не изменится в будущем.


    Для этого используйте SSHClient.load_host_keys ранее connect. Это заставляет Paramiko автоматически добавлять новый ключ хоста в файл (в сочетании с AutoAddPolicy).



Ответ 3

Исключение было вызвано из-за отсутствия ключа хоста, подсказкой является довольно загадочное "Неизвестный сервер" - поскольку исключение было вызвано из 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')
Ответ 4

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

# HostKey /etc/ssh/ssh_host_ecdsa_key

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

2024-01-02 23:23 python macos