2011-06-03 8 views
8

En mi aplicación Cocoa estoy tratando de usar NSTask para ejecutar algunos comandos básicos de Git. Cada vez que ejecuta un comando que requiere permisos (claves SSH) para acceder a un mando a distancia (por ejemplo git push, git pull), se produce un error con el siguiente error:NSTask y Git - Problemas de permisos

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

Ejecución de los mismos comandos de la terminal funciona bien, así que' Estoy pensando que esto podría ser un problema con NSTask no estableciendo una variable de entorno que se usaría en algún lugar del proceso de acceso a las claves ssh. He intentado establecer manualmente las variables de entorno y HOMEUSER así:

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

Pero esto no tiene ningún efecto. ¿Existe alguna variable de entorno particular que deba establecerse en NSTask para que esto funcione correctamente?

EDIT: Gracias a la sugerencia de Dustin, me di cuenta de algo más. He utilizado el comando env para listar las variables de entorno para mi sesión actual y encontré esto:

SSH_AUTH_SOCK=/tmp/launch-DMQopt/Listeners 

Para probar, he copiado ese camino y establecerlo como una variable de entorno de NSTask y corrió el código nuevo, y esta ¡tiempo funcionó! Dicho esto, estoy seguro de que SSH_AUTH_SOCK cambia para cada sesión, así que no puedo simplemente codificarlo. ¿Cómo genero/recupero dinámicamente esta variable?

+1

pruébelo a la inversa, use 'env -i' en la línea de comandos y vea cuánto necesita volver a agregar antes de que funcione. – Dustin

+0

Tengo un poco más de agradecimiento gracias a su consejo, lea mi publicación editada :) – indragie

Respuesta

4

Se podría tratar de seguir el tutorial "Wrapping rsync or SSH in an NSTask" (de Ira), que menciona SSH_AUTH_SOCK variables:

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

Sin embargo, el PO indragie comentarios:

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]]; 
+1

Lo había intentado antes, pero desde que se invocaba con Xcode, el env de SSH_AUTH_SOCK var. no estaba siendo pasado a él. Abrir la aplicación desde Finder corrige este problema. ¡Gracias! – indragie

+0

@indragie: excelente. He incluido su comentario en la respuesta para una mayor visibilidad. – VonC

+0

@VonC ¿Puede decirme qué variable es askPassPath? –

Cuestiones relacionadas