2011-03-28 125 views
0

我與SFTP例如玩弄從這裏:Stackoverflow: twisted conch filetransferPython的扭曲:扭曲海螺文件傳輸verifyHostKey

我用這這裏進行連接。所以我可以使用字符串中的密鑰而不是密碼或〜/ .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,你可以讀取它的source帕拉姆指紋沒有使用,我還沒有找到有效的運輸價值。

def verifyHostKey(transport, host, pubKey, fingerprint): 
    """   
    Verify a host's key. 
    .... 

任何想法如何,我可以省略用戶被提示驗證hostkey不寫入hostkey到〜/ .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 

回答

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,如果檢查成功,則觸發Deferred with True。如果檢查失敗,用False開火。

+0

謝謝,我只是按照你的建議實現了我自己的功能。現在爲我工作得很好。 – daccle 2011-03-29 09:33:56