pysftp.CnOpts()“未找到主机密钥”错误,尽管使用ssh-keyscan

时间:2020-11-03 18:12:48

标签: python ssh paramiko pysftp known-hosts

我正在尝试遵循Verify host key with 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

即使在Windows PowerShell中执行了ssh-keyscan 192.168.254.254 > ~/.ssh/known_hosts之后,也将以下内容添加到了~/.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')

1 个答案:

答案 0 :(得分:1)

正如在调用堆栈中看到的那样,即使在调用CnOpts之前,也已经在cnopts.hostkeys.load构造函数中收到错误。这是因为构造函数试图从标准位置加载主机密钥文件。

这应该可以指定您的自定义位置:

cnopts = pysftp.CnOpts(knownhosts=fn)

尽管实际上是从标准位置加载密钥,但问题必须出在文件格式中。根据您提供的其他信息,文件看起来好像是UTF-16编码。将其另存为ASCII / UTF-8。

这实际上是从PowerShell调用ssh-keyscan的结果。处理文件重定向时,版本6之前的PowerShell默认为UTF-16。请参见Why does PowerShell redirection >> change the formatting of the text content?,只需在ssh-keyscan中运行cmd.exe而不是PowerShell。