我目前尝试在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(我使用了一个固定的字符串来测试如果有效)。
有没有可能让它工作?!
儒略
答案 0 :(得分:0)
kbdCallback
实际上不是一个方法,它是一个函数 - 你可以告诉它几个方面 - 它前面没有-
或+
,返回类型周围没有括号,方法不能是static
。因此,由于它是一个函数而不是一个方法,因此没有与之关联的对象,也没有self
指针;因此,您无法直接获取任何实例变量。我想有几种方法可以解决这个问题;你可以拥有一个函数可以从中获取密码的对象的静态实例,或者如果有某种方法可以传递一个上下文指针以便在回调中使用,那么你就可以以这种方式传递一个对象。
关于你的SIGABRT
,你能说出发生了哪一行,以及你正在使用的参数的值是什么?你的问题并不清楚。
答案 1 :(得分: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);