NSTask y Git – Problemas de permissions

En mi aplicación Cocoa estoy tratando de usar NSTask para ejecutar algunos commands básicos de Git. Cada vez que ejecuto un command que requiere permissions (keys SSH) para acceder a un control remoto (por ejemplo, git push , git pull ), falla con el siguiente error:

Permiso denegado (publickey). El extremo remoto colgó inesperadamente

Ejecutar los mismos commands desde 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 utilizaría en algún lugar en el process de acceso a las keys ssh. Intenté establecer manualmente las variables de entorno HOME y USER como esta:

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

Pero esto no tiene efecto. ¿Hay alguna variable de entorno particular que NSTask establecer en NSTask para que funcione correctamente?

EDITAR: Gracias a la sugerencia de Dustin, pude profundizar un poco más en la explicación de esto. env command env para enumerar las variables de entorno para mi session actual y encontré esto:

 SSH_AUTH_SOCK=/tmp/launch-DMQopt/Listeners 

Para probar, copié esa ruta y la configuré como una variable de entorno de NSTask y NSTask ejecutar el código, ¡y esta vez funcionó! Dicho esto, estoy seguro de que SSH_AUTH_SOCK cambia para cada session, así que no puedo codificarlo solo. ¿Cómo genero / recupero dinámicamente esta variable?

Podrías probar y seguir el tutorial " Envolviendo rsync o SSH en un NSTask " (de Ira ), que menciona la variable SSH_AUTH_SOCK :

Desde que escribí esta publicación, me di count de que omití un paso adicional importante en la configuration de las variables de entorno para NSTask.
Para realizar un trabajo de authentication basado en keys sin contraseña, es necesario tomar la variable SSH_AUTH_SOCK del entorno del usuario e includela en el entorno de NSTask .
Por lo tanto, al establecer variables de entorno, por ejemplo;

 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, los comentarios indragie OP:

Lo había intentado antes, pero como se lo 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 .



Con askPassPath es la ruta para el ejecutable Askpass, que se incluye como parte del package principal de la aplicación. (Para ello, busque el ejecutable en "Productos" en xcode y luego arrástrelo a "Copiar resources de package" en el destino de la aplicación principal.)

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