Objective c NSTask和Git--权限问题

Objective c NSTask和Git--权限问题,objective-c,cocoa,git,environment-variables,nstask,Objective C,Cocoa,Git,Environment Variables,Nstask,在Cocoa应用程序中,我尝试使用NSTask运行一些基本的Git命令。每当我运行需要权限(SSH密钥)才能访问远程设备的命令时(例如,git push,git pull),它都会失败,并出现以下错误: 权限被拒绝(公钥)。远端意外挂断 从终端运行相同的命令效果很好,因此我认为这可能是NSTask没有设置环境变量的问题,该变量将在访问ssh密钥的过程中使用。我尝试手动设置HOME和USER环境变量,如下所示: [task setEnvironment:[NSDictionary dictiona

在Cocoa应用程序中,我尝试使用
NSTask
运行一些基本的Git命令。每当我运行需要权限(SSH密钥)才能访问远程设备的命令时(例如,
git push
git pull
),它都会失败,并出现以下错误:

权限被拒绝(公钥)。远端意外挂断

从终端运行相同的命令效果很好,因此我认为这可能是
NSTask
没有设置环境变量的问题,该变量将在访问ssh密钥的过程中使用。我尝试手动设置
HOME
USER
环境变量,如下所示:

[task setEnvironment:[NSDictionary dictionaryWithObjectsAndKeys:NSHomeDirectory(), @"HOME", NSUserName(), @"USER", nil]];
但这没有效果。是否需要在
NSTask
中设置任何特定的环境变量才能正常工作

编辑:多亏了达斯汀的提示,我对这个问题有了进一步的了解。我使用
env
命令列出了当前会话的环境变量,我发现:

SSH_AUTH_SOCK=/tmp/launch-DMQopt/Listeners

为了进行测试,我复制了该路径并将其设置为环境变量
NSTask
,然后再次运行代码,这次它成功了!也就是说,我确信每个会话的
SSH\u AUTH\u SOCK
都会发生变化,所以我不能只是硬编码。如何动态生成/检索此变量?

您可以尝试并遵循教程“”(从),其中确实提到了
SSH\u AUTH\u SOCK
变量:

写了这篇文章后,我意识到在为NSTask设置环境变量时,我省略了一个重要的附加步骤。
为了使无密码基于密钥的身份验证工作,有必要从用户环境中获取
SSH\u AUTH\u SOCK
变量,并将其包含在NSTask环境中
例如,在设置环境变量时

然而,OP评论:


我之前尝试过这个,但是因为它是用XCode调用的,所以没有向它传递
SSH\u AUTH\u SOCK
env变量。
从Finder打开应用程序可更正此问题



askPassPath
是Askpass可执行文件的路径,它是应用程序主捆绑包的一部分。(为此,请在xcode中的“产品”下找到可执行文件,然后将其拖到主应用程序目标上的“复制捆绑资源”中。)


换一种方式试试,在命令行上使用
env-i
,看看在它工作之前需要添加多少。多亏了你的提示,请阅读我编辑的帖子:)我之前已经尝试过了,但是因为它是用Xcode调用的,所以SSH_AUTH_SOCK env变量没有被传递给它。从Finder打开应用程序可更正此问题。谢谢大家!@印陀罗吉:太好了。我已将您的评论包含在答案中以获得更高的可视性。@VonC您能告诉我askPassPath是什么变量吗?@user76859403当然,我已还原链接,并将
askPassPath
包含在已编辑的答案中。@VonC ok。。这似乎是我的问题。将MaC OSx Xcode与NSTask一起使用..-->ssh_askpass:exec(/usr/libexec/ssh askpass):没有这样的文件或目录。主机密钥验证失败。我想我必须找到另一个解决办法。(该文件在我的系统上不存在,但它一直在寻找它。我正在尝试GIT克隆)。你的代码编辑也给了我零。
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];
// 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]];