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-сервере.
Решение состоит в том, чтобы указать правильный ключ для использования и сделать этот ключ доступным для пользователя, выполняющего сценарий.
Прочтите это, как указать ключ:
Посмотрите здесь подход к запуску от имени другого пользователя:
Я бы не рекомендовал запускать учетную запись "никто" (с тех пор пользователь "никто" имеет доступ к вашему закрытому ключу) или как "Apache" (с тех пор вы увеличиваете ущерб, который может быть нанесен, если будет обнаружен эксплойт для вашего сайта). Поэтому вы должны создать другого пользователя с минимальными правами для чтения вашего закрытого ключа и выполнения команды git. Может не потребоваться указывать ключ, если вы просто создаете для этого ограниченную учетную запись пользователя и помещаете ключи (публичные / приватные) в ~/.ssh
Ваша установка веб-сервера и PHP поддерживается Suhosin, safe-mode, Apparmor или другими механизмами безопасности?
И я рекомендую попробовать привязки PHP-Git, такие как php-git, если вы делаете больше операций. Этот модуль предназначен для работы с Git в коде PHP.
Это проблема с разрешениями? Сценарий PHP, скорее всего, будет запущен как пользователь nobody, у которого могут отсутствовать разрешения на запуск команды git.