pysftp.CnOpts () Ошибка `` Ключи хоста не найдены '', несмотря на то, что файл known_hosts сгенерирован с помощью ssh-keyscan

Я пытаюсь следовать решению из Проверить ключ хоста с помощью pysftp.

Я бегу:

import pysftp
fn = r'C:\Users\UWAdmin\.ssh\known_hosts'

cnopts = pysftp.CnOpts()
cnopts.hostkeys.load(fn)

но я получаю сообщение об ошибке:

HostKeysException                         Traceback (most recent call last)
<ipython-input-3-b5b4d53fef6c> in <module>
----> 9 cnopts = pysftp.CnOpts()
     10 cnopts.hostkeys.load(fn)

~\miniconda3\envs\pycontrol\lib\site-packages\pysftp\__init__.py in __init__(self, knownhosts)
     62         else:
     63             if len(self.hostkeys.items()) == 0:
---> 64                 raise HostKeysException('No Host Keys Found')
     65 
     66     def get_hostkey(self, host):

HostKeysException: No Host Keys Found

Даже после того, как я сделал ssh-keyscan 192.168.254.254 > ~/.ssh/known_hosts в Windows PowerShell, в ~/.ssh/known_hosts файл добавилось следующее:

192.168.254.254 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCVlnFrb1SzjijeWRld0w+MJpblrsF8vEutsRnJbxOMHKz8dhqP/qGjYOtG3KCLwNH8odLStd5or5C68XqbdBTxXG1CaTrSd0Z4gWo3cNy3rKjJ4pmTVPuFXEH7iCfd9GNDfPtUOZDeJhbAXID8mUXtnGaw4jH3veWSmLGQk/sbNRgFfVytAqhGxn8wVgBmVt5VGmaQN9f35mikfmyRZtwQXwZ/sbvNYYiGVbd0mnztawAdv9CZhtdJBofj1yqldw/yfN7m/8AkKHqAOlRfbKMIXU+VXkKTwg+try/aYA76HJPmS5jU/C3esc/2wyZBP7t9fMOF6iUbimCsHCC2MP3P
192.168.254.254 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGq3me3LXMVu6S5aHp7JqRMNRgAbdEsJY4PKC4ydS3R8uJklU4EjRDQNNPwSWcrCeqCEn5HgIMOs96q1Zoh9ANY=
192.168.254.254 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAgEX0CF1NzUL0G0+Wf64qzJmj5PBh6JI95Xn5xaS5y6

И обратите внимание, что ключи хоста не найдены даже в cnopts = pysftp.CnOpts()

Я попытался переустановить pysftp, но безрезультатно. пожалуйста, порекомендуйте

Когда я отправляю ssh на удаленный сервер, он также предлагает мне проверить ключ хоста, несмотря на то, что он уже находится в файле knbown_hosts. Когда я проверяю ключ, ключ, добавленный к C:\\Users\\UWAdmin/.ssh/known_hosts, написан китайскими символами:

㤱⸲㘱⸸㔲⸴㔲‴捥獤ⵡ桳㉡渭獩灴㔲‶䅁䅁㉅橖䡚桎塌潎呙瑉浢穬䡤祁呎䅙䅁䥁浢穬䡤祁呎䅙䅁䉂䝂㍱敭䰳䵘畖匶愵灈䨷剱乍杒扁䕤䩳㑙䭐㑃摹㍓㡒䩵汫㑕橅䑒乑偎卷捗䍲煥䕃㕮杈䵉獏㘹ㅱ潚㥨乁㵙਍

Следуя предложению Мартина попытаться проанализировать отдельные строки known_hosts с помощью paramiko.hostkeys.HostKeyEntry.from_line, я получаю это в журнале Paramiko:

INF [20201104-16:36:28.943] thr=1   paramiko.hostkeys: Unable to handle key of type  s s h - r s a 
INF [20201104-16:36:28.943] thr=1   paramiko.hostkeys: Not enough fields found in known_hosts in line 0 ('\x00\n')
INF [20201104-16:36:28.943] thr=1   paramiko.hostkeys: Unable to handle key of type  e c d s a - s h a 2 - n i s t p 2 5 6 
INF [20201104-16:36:28.943] thr=1   paramiko.hostkeys: Not enough fields found in known_hosts in line 0 ('\x00\n')
INF [20201104-16:36:28.943] thr=1   paramiko.hostkeys: Unable to handle key of type  s s h - e d 2 5 5 1 9 
INF [20201104-16:36:28.943] thr=1   paramiko.hostkeys: Not enough fields found in known_hosts in line 0 ('\x00\n')

person Hud    schedule 03.11.2020    source источник


Ответы (1)


Как вы можете видеть в стеке вызовов, вы уже получаете ошибку в CnOpts конструкторе, даже до того, как вы вызываете cnopts.hostkeys.load. Это потому, что конструктор пытается загрузить файл ключей хоста из стандартного местоположения.

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

cnopts = pysftp.CnOpts(knownhosts=fn)

Хотя, поскольку вы фактически загружаете ключ из стандартного места, проблема должна быть в формате файла. Судя по предоставленной вами дополнительной информации, похоже, что файл находится в кодировке UTF-16. Вместо этого сохраните его как ASCII / UTF-8.

На самом деле это следствие вызова ssh-keyscan из PowerShell. PowerShell до версии 6 по умолчанию использует UTF-16 при обработке перенаправления файлов. См. Почему перенаправление PowerShell ›› изменяет форматирование текстового содержимого? Просто запустите ssh-keyscan в cmd.exe вместо PowerShell.

person Martin Prikryl    schedule 03.11.2020
comment
да, ты спас меня на этой неделе! Я сделал ssh-keyscan но как-то сохраняет в неправильной кодировке ?! В любом случае я использовал Notepad ++ ›Кодировка› UTF-8 (без спецификации) для преобразования, и это работает. Спасибо! - person Hud; 05.11.2020