在我的Cocoa应用程序中,我试图使用NSTask运行一些基本的Git命令。每当我运行需要访问远程权限的命令(SSH key )(例如git pushgit pull)时,该命令都会失败,并显示以下错误:



从Terminal运行相同的命令就可以了,所以我想这可能是NSTask没有设置在访问ssh key 的过程中将在某处使用的环境变量的问题。我尝试手动设置HOMEUSER环境变量,如下所示:

[task setEnvironment:[NSDictionary dictionaryWithObjectsAndKeys:NSHomeDirectory(), @"HOME", NSUserName(), @"USER", nil]];

但这没有效果。为了使其正常工作,我必须在NSTask中设置任何特定的环境变量吗?

编辑:多亏了Dustin的技巧,我在弄清楚这一点上有了更多的进步。我使用env命令列出了当前 session 的环境变量,发现了这一点:
SSH_AUTH_SOCK=/tmp/launch-DMQopt/Listeners

为了进行测试,我复制了该路径并将其设置为NSTask的环境变量,然后再次运行该代码,这次可以正常工作了!也就是说,我确定SSH_AUTH_SOCK在每个 session 中都会发生变化,因此我不能仅仅对其进行硬编码。如何动态生成/检索此变量?

最佳答案

您可以尝试并遵循教程“Wrapping rsync or SSH in an NSTask”(来自Ira),该教程确实提到了SSH_AUTH_SOCK变量:


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注释:






// 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]];

关于objective-c - NSTask和Git-权限问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6222642/

10-11 01:19