我从这里开始使用sftp示例:Stackoverflow: twisted conch filetransfer
我在这里用它连接。所以我可以使用字符串中的密钥而不是密码或〜/ .shh中的密钥。现在我想从主机密钥发送主机密钥或指纹,以避免提示用户验证主机密钥
def sftp(user, host, port, key, hostkey):
options = ClientOptions()
options['key'] = keys.Key.fromString(key.strip()).keyObject
options['host'] = host
options['port'] = port
conn = SFTPConnection()
conn._sftp = Deferred()
auth = SSHUserAuthClient(user, options, conn)
connect(host, port, options, verifyHostKey, auth)
return conn._sftp
我试着给一些验证主持人的参数,因为你可以在其中读到source没有使用参数指纹,而且我没有找到有效的传输值。
def verifyHostKey(transport, host, pubKey, fingerprint):
"""
Verify a host's key.
....
如何在不将主机密钥写入〜/ .shh / known_hosts的情况下省略提示用户验证主机密钥的任何想法?
好的,我根据Jean-Paul Calderone的回答编写了一个函数。我很天真,但工作很好。目标是省略对已知主机文件的需求。我希望所有的钥匙只能存在于记忆中。
def verifyHostKey(transport, host, pubKey, fingerprint):
keytype, key = transport.factory.options['hostkey'].split(" ")[1:]
hostkey = keytype + " " + key
key = Key.fromString(hostkey)
if key.fingerprint() == fingerprint:
return succeed(True)
else:
raise BadKeyError
答案 0 :(得分:3)
我试图给出一些验证主持人的参数
你是说你试过自己打电话给verifyHostKey
吗?听起来这不会帮助您避免提示用户输入未知的主机密钥。相反,您希望将该参数的不同函数传递给connect
。不使用verifyHostKey
提供的twisted.conch.client.default
函数,而是使用以下内容:
from twisted.internet.defer import succeed
def verifyHostKey(transport, host, pubKey, fingerprint):
return succeed(True)
或者,如果您想要实现自己的检查,而不仅仅是接受任何主机密钥,请定义一个具有该检查功能的函数。返回Deferred,如果检查成功,则触发Deferred with True。如果检查失败,请使用False激活它。