php run git obtuvo "ssh Permiso denegado"

Estoy tratando de ejecutar git pull en un script php desde un browser, pero obtuve "sh: connect to host git.assembla.com port 22: Permiso denegado"

mi script php :

<?php $output=array(); $returnVar=0; chdir("/var/www/html"); exec('git pull git@git.assembla.com:andrewadel.git master 2>&1', $output , $returnVar); // exec('pwd', $output , $returnVar); echo "<pre>\n"; echo "return status: $returnVar\n\n"; print_r($output); echo "</pre>\n"; 

cuando ejecuto manualmente el script como "apache", todo está bien

 bash-4.1$ whoami apache bash-4.1$ php gitsync.php <pre> return status: 0 Array ( [0] => From git.assembla.com:andrewadel [1] => * branch master -> FETCH_HEAD [2] => Already up-to-date. ) </pre> 

Cuando lo ejecuto desde un browser, falla

 http://103.7.164.33/gitsync.php?111 return status: 1 Array ( [0] => ssh: connect to host git.assembla.com port 22: Permission denied [1] => fatal: The remote end hung up unexpectedly ) 

Gracias

Aquí hay muchas variables … pero me enfrenté a un comportamiento bastante exacto con un script cgi remoto en el que estaba trabajando.

En mi caso, el problema estaba relacionado con SELinux en CentOS.

user@remoteserver:~$ getsebool -a | grep httpd

Mostró:

 ... httpd_can_network_connect --> off ... 

Pruebe una posible solución (sudo o run como root):

 user@remoteserver:~$ setsebool httpd_can_network_connect=1 //...then initiate your serverside script remotely 

Solución permanente (si arriba se ha demostrado que es efectiva):

user@remoteserver:~$ setsebool -P httpd_can_network_connect=1

-P: la opción asegura que el valor boolean de SELinux esté configurado en valor pnetworkingeterminado como reinicio en el futuro. Ver: man getsebool y man setsebool

¿Suhosin, modo seguro, Apparmor u otros mecanismos de security implementan su server web y su installation de PHP?

Y recomiendo probar enlaces PHP-Git como php-git si estás haciendo más operaciones. Ese module está diseñado para trabajar con Git en código PHP.

Apache ejecutaría el script como el usuario 'nobody'. Su secuencia de commands se basa en tener la key privada almacenada en ~ apache / .ssh / id_rsa

El error es que git no puede acceder a esa key y no puede autenticarse contra el server de git.

La solución es especificar la key correcta para usar y hacer que esa key sea accesible para el usuario que está ejecutando el script.

Lea esto para saber cómo especificar la key:

Especifique la key SSH privada que se utilizará al ejecutar el command del shell con o sin Ruby.

Eche un vistazo aquí para get un enfoque para ejecutar como un usuario diferente:

https://serverfault.com/questions/226374/how-to-run-php-files-as-another-user-with-apache-and-fastcgi

No recomendaría ejecutar como nadie (desde entonces el usuario nadie tiene acceso a su key privada), o como apache (desde entonces está aumentando el daño que se podría hacer si se encuentra un exploit para su sitio). Por lo tanto, debe crear un usuario diferente con los permissions mínimos para leer su key privada y ejecutar el command git. Puede que no sea necesario especificar la key si solo creas una count de usuario limitada para esto y colocas las keys (públicas / privadas) en ~ / .ssh

¿Esto es un problema de permissions? Se ejecutará un script PHP como el usuario nobody más probable, que puede no tener permissions para ejecutar el command git.