Python Twisted:Twisted conch filetransfer verifyHostKey

Python Twisted:Twisted conch filetransfer verifyHostKey,python,twisted,sftp,Python,Twisted,Sftp,我在这里使用sftp示例: 我用这个来连接。因此,我可以使用字符串中的密钥,而不是密码或~/.shh中的密钥。现在,我希望传递一个hostkey或来自hostkey的指纹,以避免提示用户验证hostkey def sftp(user, host, port, key, hostkey): options = ClientOptions() options['key'] = keys.Key.fromString(key.strip()).keyObject options

我在这里使用sftp示例:

我用这个来连接。因此,我可以使用字符串中的密钥,而不是密码或~/.shh中的密钥。现在,我希望传递一个hostkey或来自hostkey的指纹,以避免提示用户验证hostkey

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提供一些参数,正如您在中看到的,它没有使用参数指纹,并且我还没有找到有效的传输值

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
我试图为验证hostkey提供一些参数

你是说你自己试着打电话给
verifyHostKey
?听起来这并不能帮助您避免提示用户输入未知的主机密钥。相反,您希望将该参数的不同函数传递给
connect
。不要使用twisted.conch.client.default提供的
verifyHostKey
函数,而是使用类似以下的函数:

from twisted.internet.defer import succeed

def verifyHostKey(transport, host, pubKey, fingerprint):
    return succeed(True)
或者,如果您想实现自己的检查,而不仅仅是接受任何主机密钥,那么可以定义一个包含该检查的函数。返回一个延迟,如果检查成功,则使用True触发延迟。如果检查失败,则使用False进行激发

我试图为验证hostkey提供一些参数

你是说你自己试着打电话给
verifyHostKey
?听起来这并不能帮助您避免提示用户输入未知的主机密钥。相反,您希望将该参数的不同函数传递给
connect
。不要使用twisted.conch.client.default提供的
verifyHostKey
函数,而是使用类似以下的函数:

from twisted.internet.defer import succeed

def verifyHostKey(transport, host, pubKey, fingerprint):
    return succeed(True)

或者,如果您想实现自己的检查,而不仅仅是接受任何主机密钥,那么可以定义一个包含该检查的函数。返回一个延迟,如果检查成功,则使用True触发延迟。如果检查失败,则使用False启动。

谢谢,我刚刚按照您的建议实现了自己的功能。现在对我来说工作很好。谢谢,我只是按照你的建议实现了我自己的功能。我现在工作很好。