Python Twisted: передача файлов с витой раковиной verifyHostKey

Я играю с примером sftp отсюда: Stackoverflow: передача файлов с скрученной раковиной

Я использую это здесь для подключения. Так что я могу использовать ключ из строки вместо пароля или ключей в ~/.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

Я попытался привести некоторые аргументы для проверкиHostkey, как вы можете прочитать в его source отпечаток параметра не используется, и я не нашел допустимого значения для транспорта.

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

Любые идеи, как я могу исключить запрос пользователя на проверку ключа хоста без записи ключа хоста в ~/.shh/known_hosts?

Хорошо, я написал функцию, основанную на ответе Жана-Поля Кальдерона. Я довольно наивен, но делает свою работу хорошо. Цель заключалась в том, чтобы исключить необходимость в файле известного хоста. Я хочу, чтобы все ключи только в памяти жили.

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

person daccle    schedule 28.03.2011    source источник


Ответы (1)


Я попытался привести некоторые аргументы для проверкиHostkey

Вы хотите сказать, что сами пытались позвонить verifyHostKey? Похоже, это не поможет вам не запрашивать у пользователя неизвестные ключи хоста. Вместо этого вы хотите передать другую функцию для этого параметра в connect. Вместо использования функции verifyHostKey, предоставляемой twisted.conch.client.default, используйте что-то вроде этого:

from twisted.internet.defer import succeed

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

Или, если вы хотите реализовать свою собственную проверку, а не просто принимать любой ключ хоста, определите функцию, в которой есть эта проверка. Возвратите Deferred, и если проверка пройдет успешно, запустите этот Deferred с True. Если проверка не пройдена, запустите ее с False.

person Jean-Paul Calderone    schedule 28.03.2011
comment
Спасибо, я только что реализовал свою функцию, как вы предложили. Работает нормально для меня сейчас. - person daccle; 29.03.2011