gpt4 book ai didi

objective-c - NSTask 和 Git -- 权限问题

转载 作者:太空狗 更新时间:2023-10-30 03:29:32 24 4
gpt4 key购买 nike

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

Permission denied (publickey). The remote end hung up unexpectedly

从终端运行相同的命令工作得很好,所以我认为这可能是 NSTask 没有设置在访问 ssh 过程中某处使用的环境变量的问题键。我尝试像这样手动设置 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 变量:

Since writing this post I've realised that I omitted an important additional step in setting up the environment variables for the NSTask.
In order to make passwordless key-based authentication work it's necessary to grab the SSH_AUTH_SOCK variable from the user's environment and include this in the NSTask's environment.
So, when setting environment variables for example;

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评论:

I had tried this earlier but since it was being invoked with XCode, the SSH_AUTH_SOCK env var. wasn't being passed to it.
Opening the app from Finder corrects this issue.



With askPassPath being the path for the Askpass executable, which is included as part of the application’s main bundle. (In order to do this, find the executable under “Products” in xcode, and then drag it into “Copy Bundle Resources” on the main application’s target.)

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com