Получите все ключи хоста SSH перед соединением с paramiko - PullRequest
0 голосов
/ 07 апреля 2019

Как я могу эффективно получить все ключи хоста сервера SSH, используя paramiko?

Моя попытка заключается в следующем. Сначала получите все типы ключей (возвращает набор строк):

ssh_transport = paramiko.transport.Transport('%s:%s' % (ip_address, 22))
ssh_transport.start_client()
options = ssh_transport.get_security_options()
ssh_transport.close()

для вышеизложенного, это более короткий метод:

client_key_types = paramiko.transport.Transport._preferred_keys

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

for key_type in options.key_types:
    ssh_transport = paramiko.transport.Transport('%s:%s' % (ip_address, 22))
    inner_options = ssh_transport.get_security_options()
    inner_options.key_types = (key_type,)

    ssh_transport.start_client()
    key = ssh_transport.get_remote_server_key()
    ssh_transport.close()   

В приведенном выше коде вы получите исключение, если попытаетесь использовать неподдерживаемый тип ключа.

Код работает, но кажется, что это неэффективно.

Есть ли лучший способ сделать это, используя что-то встроенное в Paramiko? В конце концов, я только пытаюсь проверить подлинность сервера при первом подключении с минимальной необходимой инфраструктурой.

1 Ответ

0 голосов
/ 07 апреля 2019
  1. Чтобы получить список типов ключей хоста, поддерживаемых Paramiko, без открытия соединения, вы можете прочитать Transport._preferred_keys:

    print(paramiko.transport.Transport._preferred_keys)
    
  2. Чтобы получить списокТипы ключей хоста, поддерживаемые сервером, вам придется проанализировать файл журнала Paramiko:

    DEB [20190407-07:20:15.255] thr=1   paramiko.transport: kex algos:[...] server key:['ssh-rsa', 'ssh-dss'] client encrypt:[...] server encrypt:[...] client mac:[...] server mac:[...] client compress:[...] server compress:[...] client lang:[''] server lang:[''] kex follows?False
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...