примеры - python ssh connect




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

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

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


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

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

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

    keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
    key = paramiko.RSAKey(data=decodebytes(keydata))
    client.get_host_keys().add('example.com', 'ssh-rsa', key) 
    
  • Или загрузите уже кэшированную главную строку (например, с помощью командной строки ssh ) с помощью client.load_system_host_keys() .

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

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


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

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


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

# HostKey / etc / ssh / ssh_host_ecdsa_key

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





paramiko