php run git получил "Отказано в ssh"

Я пытаюсь запустить git pull в php-скрипте из браузера, но у меня получилось "sh: подключиться к хосту git.assembla.com порт 22: разрешение запрещено"

мой скрипт 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";

когда я вручную запускаю скрипт как "apache", все нормально

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>

Когда я запускаю его из браузера, происходит сбой

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
)

Спасибо

4 ответа

Решение

Здесь много переменных... но я столкнулся с почти таким же поведением с удаленным CGI-скриптом, над которым я работал.

В моем случае проблема была связана с SELinux на CentOS.

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

Показали:

...
httpd_can_network_connect --> off
...

Проверить возможное исправление (sudo или запустить с правами root):

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

Постоянное исправление (если вышеуказанное доказало свою эффективность):

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

Опция -P гарантирует, что логическое значение темы SELinux будет установлено на указанное значение по умолчанию при будущих перезагрузках. Увидеть:man getsebool а такжеman setsebool

Apache запускает сценарий как "никто". Ваш сценарий основан на том, что закрытый ключ, скорее всего, хранится в ~apache/.ssh/id_rsa

Ошибка состоит в том, что git не может получить доступ к этому ключу и не может аутентифицировать себя на git-сервере.

Решение состоит в том, чтобы указать правильный ключ для использования и сделать этот ключ доступным для пользователя, выполняющего сценарий.

Прочтите это, как указать ключ:

Укажите закрытый SSH-ключ, который будет использоваться при выполнении команды оболочки с Ruby или без него?

Посмотрите здесь подход к запуску от имени другого пользователя:

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

Я бы не рекомендовал запускать учетную запись "никто" (с тех пор пользователь "никто" имеет доступ к вашему закрытому ключу) или как "Apache" (с тех пор вы увеличиваете ущерб, который может быть нанесен, если будет обнаружен эксплойт для вашего сайта). Поэтому вы должны создать другого пользователя с минимальными правами для чтения вашего закрытого ключа и выполнения команды git. Может не потребоваться указывать ключ, если вы просто создаете для этого ограниченную учетную запись пользователя и помещаете ключи (публичные / приватные) в ~/.ssh

Ваша установка веб-сервера и PHP поддерживается Suhosin, safe-mode, Apparmor или другими механизмами безопасности?

И я рекомендую попробовать привязки PHP-Git, такие как php-git, если вы делаете больше операций. Этот модуль предназначен для работы с Git в коде PHP.

Это проблема с разрешениями? Сценарий PHP, скорее всего, будет запущен как пользователь nobody, у которого могут отсутствовать разрешения на запуск команды git.

Другие вопросы по тегам