Скрученный Python: передача файла витой раковины verifyHostKey - PullRequest
0 голосов
/ 28 марта 2011

Я поэкспериментировал с примером 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

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

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

Любые идеи, как я могу опустить приглашение пользователя подтвердить хост-ключ без записи хост-ключаto ~ / .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

1 Ответ

3 голосов
/ 28 марта 2011

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

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

from twisted.internet.defer import succeed

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

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

...