витая раковина, переопределение аутентификации - PullRequest
3 голосов
/ 06 марта 2011

Я пытался переопределить схему аутентификации по умолчанию в модуле витой раковины.То, что я думал, я понял, как это сделать.Сам скрипт является ответом на этот вопрос.Я подклассифицирую SSHUserAuthClient следующим образом:

class ClientUserAuth(SSHUserAuthClient):
    def getPassword(self, prompt = None):
        return defer.succeed("*****")

, и я, очевидно, заменяю вызов SSHUserAuthClient вызовом моего класса в сценарии.По причинам, которые я не могу понять, скрипт не выполняет метод getPassword в моем классе, а метод суперкласса getPassword.Кто-нибудь знает, что я делаю не так?Единственное другое изменение в скрипте, которое я сделал, я добавил следующий импорт модуля

from twisted.internet import defer

Спасибо!

РЕДАКТИРОВАТЬ: Странно, но метод подкласса getPublicKey вызывается правильно.Это просто getPassword метод, который ведет себя странно.

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Некоторые дополнительные подробности о том, как реализовать интерактивную аутентификацию с помощью клавиатуры.

Я думал, что у меня это работает в первый раз, но мой сервер отправляет два интерактивных запроса.Первый запрос содержит приглашение = [('Password: ', False)].
Второй содержит пустое приглашение = []

Код ниже работает с каждым сервером, который я тестировал (Redhat, Ubuntu, OpenSUSE)

from twisted.conch.ssh import keys, userauth</p> <pre><code>class ClientUserAuth(userauth.SSHUserAuthClient): def getPassword(self, prompt = None): #normal password authentication print "PASSWORD AUTH" return defer.succeed('*****') # <-- YOUR PASSWORD def getGenericAnswers(self, name, instruction, prompts): #interactive password authentication print "INTERACTIVE AUTH" response = ['']*len(prompts) for i, p in enumerate(prompts): try: if('password' in p[0].lower()): response[i] = '*****' # <-- YOUR PASSWORD except: pass #The response is always a sequence, and the length of it is always #identical to the length of prompts return defer.succeed(response)

Включение входа в Twisted также помогло отладить то, что Конч делал под капотом.

from twisted.python import log
log.msg('Started Logging for A Conch Program')
log.startLogging(sys.stdout)
3 голосов
/ 07 марта 2011

Возможно, вы на самом деле видите клавиатурно-интерактивную аутентификацию.Это похоже на аутентификацию по паролю, но отдельно.Причина, по которой вы видите разное поведение между Linux и OS X, заключается в том, что SSH-серверы Linux и OS X настроены по-разному.

Переопределите getGenericAnswers для обработки этого.

...