Подтвердить что ты не робот

Парамико "Неизвестный сервер"

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

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

4b9b3361

Ответ 1

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

Ответ 2

У меня возникла такая же проблема, и вот решение, которое получилось для меня:

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 doc. Надеюсь, это поможет.

Ответ 3

У меня была эта ошибка: я могу подключиться из оболочки, но paramiko говорит "Неизвестный сервер workdevel114".

В known_hosts было две аналогичные записи:

[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 |....), похоже, путает парамико. Я думаю, это связано с этим билетом: https://github.com/paramiko/paramiko/issues/67

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

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

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

pariko-version: 1.7.7.1-1ubuntu1

Ответ 4

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

# HostKey/etc/ssh/ssh_host_ecdsa_key

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

Ответ 5

Правильный путь:

  • Вызовите 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) 
    

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

    Если вы знаете только отпечатки пальцев, смотрите:
    Python - pysftp/paramiko - проверка ключа хоста по отпечатку пальца

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

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

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