3

我目前尝试在 Objective-C 中扩展 libssh2 Wrapper。

我正在尝试实现该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(我使用固定字符串来测试它是否有效)。

有没有可能让它工作?

朱利安

4

2 回答 2

0

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

关于你的SIGABRT,你能说出具体发生在哪一行,以及你使用的参数的值是什么?从你的问题看不清楚。

于 2012-10-08T06:11:00.980 回答
0

http://comments.gmane.org/gmane.network.ssh.libssh2.devel/4163

原因: Win32下malloc-in-EXE-free-in-DLL。
修复:使用自定义的 free/malloc/realloc 函数。在下面添加

static void *my_alloc(size_t count, void **abstract)            {   return malloc(count);}
static void my_free(void *ptr, void **abstract)                 {   free(ptr);}
static void *my_realloc(void *ptr, size_t count, void **abstract){  return realloc(ptr, count);}

并更换

libssh2_session_init();

libssh2_session_init_ex(my_alloc, my_free, my_realloc, NULL);
于 2013-08-28T18:13:03.270 回答