Python Twisted:twisted conch filetransfer verifyHostKey

时间:2011-03-28 10:07:01

标签: python twisted sftp

我从这里开始使用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

1 个答案:

答案 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激活它。