在我的Cocoa应用程序中,我试图使用NSTask
运行一些基本的Git命令。每当我运行需要访问远程权限的命令(SSH key )(例如git push
,git pull
)时,该命令都会失败,并显示以下错误:
从Terminal运行相同的命令就可以了,所以我想这可能是NSTask
没有设置在访问ssh key 的过程中将在某处使用的环境变量的问题。我尝试手动设置HOME
和USER
环境变量,如下所示:
[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/