我正在使用pysftp编写程序,它想针对验证SSH主机密钥C:\Users\JohnCalvin\.ssh\known_hosts
。
终端程序使用PuTTY将其保存到Registry中[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys]
。
如何调和pysftp和PuTTY之间的区别?
我的代码是:
import pysftp as sftp
def push_file_to_server():
s = sftp.Connection(host='138.99.99.129', username='root', password='*********')
local_path = "testme.txt"
remote_path = "/home/testme.txt"
s.put(local_path, remote_path)
s.close()
push_file_to_server()
E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py:61: UserWarning:
Failed to load HostKeys from C:\Users\JohnCalvin.ssh\known_hosts.
You will need to explicitly load HostKeys (cnopts.hostkeys.load(filename)) or disableHostKey checking (cnopts.hostkeys = None). warnings.warn(wmsg, UserWarning) Traceback (most recent call last): File “E:\OneDrive\Python\GIT\DigitalCloud\pysftp_tutorial.py”, line 14, in push_file_to_server() File “E:\OneDrive\Python\GIT\DigitalCloud\pysftp_tutorial.py”, line 7, in push_file_to_server s = sftp.Connection(host=‘138.99.99.129’, username=’root’, password=’**’) File “E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py”, line 132, in init self._tconnect[‘hostkey’] = self._cnopts.get_hostkey(host) File “E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py”, line 71, in get_hostkey raise SSHException(“No hostkey for host %s found.” % host) paramiko.ssh_exception.SSHException: No hostkey for host 138.99.99.129 found. Exception ignored in: > Traceback (most recent call last): File “E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py”, line 1013, in del self.close() File “E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py”, line 784, in close if self._sftp_live: AttributeError: ‘Connection’ object has no attribute ‘_sftp_live’
cnopts.hostkeys = None
除非您不关心安全性,否则请不要设置(如第二个最重要的答案所示)。这样,您就无法防御中间人攻击。
使用CnOpts.hostkeys
(返回HostKeys
)来管理受信任的主机密钥。
cnopts = pysftp.CnOpts(knownhosts='known_hosts')
with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:
其中known_hosts
包含以下格式的服务器公钥:
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
如果您不想使用外部文件,也可以使用
from base64 import decodebytes
# ...
keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
cnopts = pysftp.CnOpts()
cnopts.hostkeys.add('example.com', 'ssh-rsa', key)
with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:
尽管从pysftp 0.2.9开始,此方法将发出警告,似乎是一个错误:
使用pysftp连接到SFTP服务器时出现“无法加载HostKeys”警告
以这种格式检索主机密钥的一种简单方法是使用OpenSSH ssh-keyscan:
$ ssh-keyscan example.com
# example.com SSH-2.0-OpenSSH_5.3
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
(由于pysftp中的错误,如果服务器使用非标准端口,则此方法将不起作用–该条目以[example.com]:port+开头,请注意重定向ssh-keyscan到PowerShell中的文件)
您还可以使应用程序自动执行相同的操作:
将Paramiko AutoAddPolicy与pysftp一起使用
(它将自动将新主机的主机密钥添加到known_hosts
,但是对于已知的主机密钥,它将不接受更改的密钥)
尽管出于绝对的安全性考虑,但是如果您尚未受到攻击,则不能确定是否应该远程检索主机密钥。
请参阅我的文章如何获得SSH主机密钥指纹来授权服务器?
它用于我的WinSCP SFTP客户端,但是那里的大多数信息通常都是有效的。
使用PuTTY,终端程序将其保存到注册表。 如何协调pysftp和Putty之间的差异? 我的代码是:
此代码引发异常。如何验证SSH指纹而不将其存储在文件中?我相信下面的代码是为公钥设计的。但带有SFTP服务器的客户端验证了指纹,但没有为我获取公钥。 代码基于使用PysFTP验证主机密钥。
问题内容: 我的 詹金斯(Jenkins) 有问题,设置为“ git”,显示以下错误: 我已经用 ssh 测试过: 这是错误的: 我还使用“ SSH密钥”完成了这些步骤。 在詹金斯下登录 将您的github密钥复制到Jenkins .ssh文件夹 重命名键 但仍然无法在 jenkins中使用* git 仓库。 * 感谢帮助!。 问题答案: 更改为用户并手动运行命令: 首次通过SSH连接到新主机时,
我对jenkins有一个问题,设置“Git”,显示以下错误: 我已经用ssh进行了测试: 这是错误: 谢谢你的帮助!。
我正在尝试提交到我的存储库,但当我单击“发布分支”时,出现了一个错误,请帮助我,伙计们,我需要办公室工作的帮助,我是新来的。 点击这里查看图片
问题内容: 我具有对生产服务器的超级用户访问权限,我想在git中将最新版本部署到服务器,但是当我在要更新的文件夹上“ git pull”时遇到以下错误。 我浏览了一下,但是找不到明确的答案。 登台服务器在同一台计算机上运行,但是只是在不同的文件夹中,当我在该文件夹中时,一切正常。 我对Linux不太有经验,所以请提供有关如何修复的明确答案:-) 否则我可以使用任何我需要的东西 ps这在过去一直