我目前正在尝试在Objective-C中扩展libssh2包装器。

我正在尝试实现libssh2_userauth_keyboard_interactive方法。我的问题是响应回调。

我在网上发现了这种实现,它绕过了“真实的”交互性,并使用实际的密码使身份验证成为可能:

int error = libssh2_userauth_keyboard_interactive(session, [username UTF8String], &kbdCallback);

static void kbdCallback (const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract)
{
    responses[0].text = (char *)[password UTF8String];   // resp. (char *)[@"test" UTF8String]
    responses[0].length = strlen([password UTF8String]); // resp. (char *)[@"test" UTF8String]
}

我的问题之一是在password调用中访问实例变量static void,而我的另一个问题是,当我尝试调用该方法时,我得到了SIGABRT(我使用固定的字符串测试该字符串是否有效)。

有没有可能使它正常工作?

朱利安

最佳答案

kbdCallback实际上不是一个方法,它是一个函数-您可以说两种方法-前面没有-+,返回类型没有括号,方法也不能是static。因此,由于它是函数而不是方法,因此没有与之关联的对象,也没有self指针;因此您无法直接访问任何实例变量。我想有两种方法可以解决这个问题。您可能有一个对象的静态实例,该函数可以从中获取密码,或者如果有某种方法可以传递要在回调中使用的上下文指针,则可以以这种方式传递对象。

关于SIGABRT,您能否说出确切发生在哪一行,以及您使用的参数值是多少?您的问题不清楚。

关于objective-c - SSH键盘交互式身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12773258/

10-14 22:34