您可以尝试按照教程“ Wrapping rsync or SSH in an NSTask ”(来自Ira),其中确实提到了SSH_AUTH_SOCK
变量:
自从写了这篇文章后,我意识到我在为 NSTask 设置环境变量时省略了一个重要的额外步骤。
为了使无密码的基于密钥的身份验证工作,有必要SSH_AUTH_SOCK
从用户的环境中获取变量并将其包含在 NSTask 的环境中。
因此,例如在设置环境变量时;
NSTask *task;
NSDictionary *environmentDict = [[NSProcessInfo processInfo] environment];
// Environment variables needed for password based authentication
NSMutableDictionary *env = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"NONE", @"DISPLAY", askPassPath, @"SSH_ASKPASS",
userName,@"AUTH_USERNAME",
hostName,@"AUTH_HOSTNAME",
nil];
// Environment variable needed for key based authentication
[env setObject:[environmentDict objectForKey:@"SSH_AUTH_SOCK"] forKey:@"SSH_AUTH_SOCK"];
// Setting the task's environment
[task setEnvironment:env];
然而,OP indragie评论:
我之前尝试过这个,但是因为它是用 XCode 调用的,SSH_AUTH_SOCK
env var。没有被传递给它。
从 Finder 打开应用程序可以解决此问题。
作为askPassPath
Askpass 可执行文件的路径,它包含在应用程序的主包中。(为此,在 xcode 中的“Products”下找到可执行文件,然后将其拖到主应用程序目标上的“Copy Bundle Resources”中。)
// Get the path of the Askpass program, which is
// setup to be included as part of the main application bundle
NSString *askPassPath = [NSBundle pathForResource:@"Askpass"
ofType:@""
inDirectory:[[NSBundle mainBundle] bundlePath]];