扭曲的海螺,覆盖身份验证

2024-10-06 12:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试覆盖twisted conch模块中的默认身份验证方案。我以为我知道该怎么做。脚本本身就是this的答案 问题。我以以下方式子类化SSHUserAuthClient

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

显然,我在脚本中将SSHUserAuthClient调用替换为对我的类的调用。由于种种原因,我无法理解脚本不是在类中执行getPassword方法,而是执行超类getPassword方法。有人知道我做错了什么吗? 我对脚本所做的唯一其他更改是添加了以下模块导入

^{pr2}$

谢谢!在

奇怪的是,子类方法getPublicKey被正确调用。只是getPassword方法有点奇怪。在


Tags: 模块方法答案脚本身份验证def方式方案
2条回答

您可能会看到键盘交互正在进行身份验证。这类似于密码验证,但是是分开的。您看到Linux和OSX之间不同行为的原因只是Linux和OSX的SSH服务器配置不同。在

重写getGenericAnswers来处理这个问题。在

有关如何实现键盘交互身份验证的其他详细信息。在

我以为我第一次使用了这个,但是我的服务器发送了两个交互请求。第一个请求包含一个prompt=[('Password: ', False)]
第二个包含空提示=[]

下面的代码适用于我测试过的每台服务器(Redhat、Ubuntu、OpenSUSE)

from twisted.conch.ssh import keys, userauth

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登录有助于调试Conch在引擎盖下所做的工作。在

^{pr2}$

相关问题 更多 >