Python Twisted: twisted conch 文件传输 验证主机密钥
我在这里玩弄一个sftp的例子:Stackoverflow: twisted conch filetransfer
我用这个方法来连接。这样我就可以用字符串中的密钥,而不是用密码或者~/.ssh里的密钥。现在我想提供一个主机密钥或者主机密钥的指纹,以避免提示用户去验证主机密钥。
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
我尝试给verifyHostkey函数传一些参数,正如你在它的源代码中看到的,fingerprint这个参数并没有被使用,而且我也没找到transport的有效值。
def verifyHostKey(transport, host, pubKey, fingerprint):
"""
Verify a host's key.
....
有没有什么办法可以让用户不被提示去验证主机密钥,而不需要把主机密钥写入~/.ssh/known_hosts文件里?
好的,我根据Jean-Paul Calderone的回答写了一个函数。这个函数比较简单,但效果不错。我的目标是省去known-host文件的需求。我希望所有的密钥都只存在于内存中。
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
1 个回答
3
我尝试给
verifyHostKey
提供一些参数。
你是说你自己尝试调用 verifyHostKey
吗?听起来这样做并不能帮你避免让用户输入未知的主机密钥。相反,你需要为 connect
这个参数传递一个不同的函数。不要使用 twisted.conch.client.default
提供的 verifyHostKey
函数,而是用一个类似这样的函数:
from twisted.internet.defer import succeed
def verifyHostKey(transport, host, pubKey, fingerprint):
return succeed(True)
或者,如果你想自己实现检查,而不是随便接受任何主机密钥,可以定义一个包含检查逻辑的函数。返回一个 Deferred 对象,如果检查成功,就用 True 来触发这个 Deferred;如果检查失败,就用 False 来触发它。