我目前尝试在 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]
}
我的一个问题是在 static void
调用中访问实例变量 password
而我的另一个问题是当我尝试调用该方法时收到 SIGABRT (我使用固定字符串来测试它是否有效)。
有没有可能让它发挥作用?!
朱利安
最佳答案
kbdCallback
实际上不是一个方法,它是一个函数 - 你可以说出几种方法 - 前面没有 -
或 +
其中,返回类型周围没有括号,方法也不能是 static
。因此,由于它是一个函数而不是一个方法,因此没有与之关联的对象,也没有 self
指针;因此你不能直接访问任何实例变量。我想有几种方法可以解决这个问题;您可以拥有对象的静态实例,该函数可以从中获取密码,或者如果有某种方法可以传递要在回调中使用的上下文指针,您可能能够以这种方式传递对象。
关于您的SIGABRT
,您能否说出具体发生在哪一行,以及您使用的参数值是多少?从你的问题中不清楚。
关于objective-c - SSH 键盘交互认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773258/