git pull vía PHP exec IIS

Fácilmente es el problema más difícil de diagnosticar que he experimentado. Parece que no puedo llamar:

exec('call git pull', $output); 

El process se bloquea y tiende a llevar IIS con él.

 exec('call git status', $output); //works fine 

Esto es lo que hice:

  • Se ha agregado una key RSA generada a github (el código de acceso está en blanco)
  • Todos tienen permiso en mysite/.git/ , y Program Files/git/bin y cmd.exe
  • Intentó el arreglo de cert de ssl mencionado en otras publicaciones con un problema de 'barra inclinada'
  • Intentó usar https: // en lugar de SSH
  • Tubería probada a stderr 2>NUL y 2>&1

Claramente, hay un problema de permissions donde exec llama a cmd.exe que a su vez llama a git.exe , que a su vez llama a sh.exe para conectarse a github, que a su vez hace uso de git-pull y posiblemente git-send-pack y GOD SABE qué más.

Supongo que 'sh.exe' determina que el usuario actual es IUSR y no puede encontrar la key RSA para autenticarse.

Si pudiera averiguar cómo ssh-keygen la count IUSR, lo habría intentado.

Si pudiera averiguar cómo ejecutar git bash en lugar de git (a través de cmd.exe ), lo habría intentado.

Aquí está la pregunta en su forma más simple:

¿Cómo obtengo de mi repo github a través del método de exec de PHP?

El problema ciertamente parece ser con SSH, pero estoy totalmente al final de todo para intentarlo.

¡Ayuda!

Me enfrenté al mismo problema hoy y utilicé Process Monitor para ver qué estaba pasando y descubrí que, por alguna razón, sh.exe buscaba las keys en C:\Windows\SysWOW64\config\systemprofile\.ssh . Así que copié todo en C:\Users\Administrator\.ssh a esa carpeta y funcionó perfectamente.

hay una serie de bibliotecas / herramientas php git. https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#git-php

personalmente he estado pirateando con GLIP (biblioteca git en php) http://fimml.at/#glip

Tengo un fork de fuente en github donde he agregado una function de file. Básicamente, creo dinámicamente un command git y uso el método passthru de php para llamarlo. quizás mirar mi código podría darte una idea. aquí está la confirmación https://github.com/fontvirus/glip/commit/89127f7f9a4dc61697929f36684533406f348ffe

Estoy ejecutando Windows Server 2012 y no pude hacer funcionar la solución de Iamz.

Busqué ".ssh" en mi C:\ y noté que había otra carpeta .ssh en C:\Program Files (x86)\Git\.ssh . Copié todos los contenidos de C:\Users\Administrator\.ssh a esta carpeta, establecí los permissions para permitir el acceso de IUSR, y todo era kosher.

Deberá otorgar permissions directamente a cmd.exe. Dependiendo de la versión de Windows y la forma en que tenga la configuration de su grupo de aplicaciones, podría ser IIS_IUSR, IUSR y / o SERVICIO DE RED. Agregue el usuario con permissions completos a cmd.exe.

Yo, por supuesto, no recomiendo hacerlo, ya que tiene implicaciones de security directas. Dicho esto, no he encontrado ninguna otra forma de hacerlo posible en Windows.

Necesita usar proc_open y verá el problema que probablemente esté relacionado con permissions.

Aquí hay un script que uso :

 <?php //error_reporting(E_ALL); ignore_user_abort(true); function syscall ($cmd, $cwd) { $descriptorspec = array( 1 => array('pipe', 'w'), // stdout is a pipe that the child will write to ); $resource = proc_open($cmd, $descriptorspec, $pipes, $cwd); if (is_resource($resource)) { $output = stream_get_contents($pipes[1]); fclose($pipes[1]); proc_close($resource); return $output; } } // GitHub will hit us with POST (http://help.github.com/post-receive-hooks/) if (!empty($_POST['payload'])) { // pull from master $result = syscall('git pull', '/var/www/example.com'); // send us the output mail('team@example.com', 'GitHub hook `git pull` result', $result); // clear APC if (apc_clear_cache('opcode') == false) { mail('root', 'Unable to apc_clear_cache()', ''); } } ?> 

Pude hacer que esto funcionara en parte al seguir mucho de lo que había aquí. Ejecuté un script por lotes que se ejecutó

ssh-agent -s
ssh-add -l

para ver qué llaves tenía. Antes de ejecutar estos commands, configuro la variable de entorno HOME=/c/Users/Username para mi usuario con las keys ssh correctas. (Estoy usando la ruta de acceso de Unix porque estaba ejecutándola con Git Bash)

No estoy seguro del entorno de la window

pero el problema principal es ".php file" que el command call exec no tiene permiso como administrador (o root en * NIX os)

en mi entorno selecciono ese file para tener privilegios como root (como cosas sudo) Otra forma es crear un nuevo grupo de usuarios que tenga el permiso 777 y asignar ese file al propio grupo de ese usuario

espero que esto ayude

Tuve este problema hoy y lo resolví de otra manera.

Mi problema era que el IUSR no tenía una carpeta de inicio para poner las keys ssh o un file de cnetworkingenciales de git.

Creé un file .sh que cambió la variable HOME antes de llamar a git, puse mis llaves en el lugar correcto como si fuera la carpeta de inicio y luego usé sh.exe para ejecutar .sh

 #!/bin/bash export HOME="/c/some/location" git pull 

Otra variante de la solución de Iamz es usar el directory C:\Windows\System32\config\systemprofile\.ssh

Llegué a eso ejecutando la siguiente secuencia de commands en mi server IIS, que inmediatamente indicó que faltaba C:\Windows\System32\config\systemprofile\.ssh (establezca $ path_of_git y $ path_to_repo según corresponda para su máquina):

 <?php $descriptorspec = array( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w"), // stderr ); $path_of_git = 'c:\\path\\to\\git'; $path_to_repo = 'C:\\inetpub\\repo'; $process = proc_open($path_of_git.' fetch', $descriptorspec, $pipes, $path_to_repo, null); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); echo '<pre>'.htmlspecialchars($stdout).'</pre>'; $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); echo '<pre style="color:networking;">'.htmlspecialchars($stderr).'</pre>'; echo '<p>return value=' . proc_close($process) . '</p>'; ?> 

Dicho todo esto, todavía estoy acosado por cuestiones de permissions, por lo que me ha resultado útil simplemente declarar que HOME está en otro lugar que IUSR puede acceder fácilmente antes de cada command de git y ejecutarlo todo con git sh. Por ejemplo:

\pathToGit\bin\sh -c "export HOME='/c/somewhereIUSRCanGetTo/';git fetch"

Donde C:\somewhereIUSRCanGetTo\.ssh\ contiene la key privada y los files allowed_hosts

Mueva su carpeta .ssh a userprofile dir. Puede ver su directory de perfil de aplicación en esta variable global $ _SERVER ['USERPROFILE']. En mi caso, es C: \ Windows \ system32 \ config \ systemprofile. A continuación, otorgue permissions para leer / escribir en esta carpeta (.ssh) para los usuarios: IIS_IUSRS, IUSR