git pull через PHP exec IIS - PullRequest
       7

git pull через PHP exec IIS

12 голосов
/ 14 ноября 2011

Легко самая сложная проблема для диагностики, которую я когда-либо испытывал.Кажется, я не могу позвонить:

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

Процесс зависает и имеет тенденцию брать с собой IIS.

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

Вот что я сделал:

  • Сгенерированный ключ RSA добавлен в github (пароль не указан)
  • У каждого есть разрешение на mysite/.git/, Program Files/git/bin и cmd.exe
  • Попробовал исправление SSL-сертификата, упомянутое в другихсообщения с проблемой 'slash'
  • Попробовал использовать https: // вместо SSH
  • Пробовал пайпинг к stderr 2>NUL и 2>&1

Очевидно, что естьпроблема с разрешениями, когда exec вызывает cmd.exe, что, в свою очередь, вызывает git.exe, что, в свою очередь, вызывает sh.exe для подключения к github, который, в свою очередь, использует git-pull и, возможно, git-send-pack, а БОГ ЗНАЕТ, что еще.

Я предполагаю, что sh.exe определяет, что текущий пользователь является IUSR и не может найти ключ RSA для аутентификации.

Если бы я мог выяснить, как ssh-keygen учетная запись IUSR, я бы попробовал это.

Если бы я мог выяснить, как exec git bash вместо git (через cmd.exe) Я бы попробовал это.

Вот вопрос в простейшей форме:

Как мне вытащить из моего репозитория github с помощью PHP exec метод?

Проблема, безусловно, связана с SSH, но я в конце всего, чтобы попробовать.

Помогите!

Ответы [ 10 ]

14 голосов
/ 08 января 2013

Я столкнулся с той же проблемой сегодня и использовал Process Monitor, чтобы посмотреть, что происходит, и обнаружил, что по некоторым причинам sh.exe искал ключи в C:\Windows\SysWOW64\config\systemprofile\.ssh. Поэтому я скопировал все в C:\Users\Administrator\.ssh в эту папку, и она отлично работала.

1 голос
/ 15 апреля 2015

Я использую Windows Server 2012 и не смог заставить работать решение Iamz.

Я искал ".ssh" в моем C:\ и заметил, что в C:\Program Files (x86)\Git\.ssh была еще одна папка .ssh.Я скопировал все содержимое из C:\Users\Administrator\.ssh в эту папку, установил разрешения, чтобы разрешить доступ IUSR, и все было кошерно.

1 голос
/ 07 декабря 2012

Есть несколько библиотек / инструментов php git.https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#git-php

лично я взломал с помощью GLIP (библиотека git в php) http://fimml.at/#glip

У меня есть исходная ветка на github, где я добавил функцию архивирования.в основном я динамически создаю команду git и использую метод php passthru для ее вызова.возможно, просмотр моего кода может дать вам некоторое представление.вот коммит https://github.com/fontvirus/glip/commit/89127f7f9a4dc61697929f36684533406f348ffe

0 голосов
/ 14 ноября 2016

Переместите папку .ssh в каталог userprofile.Вы можете видеть каталог профиля вашего приложения в этой глобальной переменной $ _SERVER ['USERPROFILE'].В моем случае это C: \ Windows \ system32 \ config \ systemprofile.Затем дайте разрешения на чтение / запись в эту папку (.ssh) для пользователей: IIS_IUSRS, IUSR

0 голосов
/ 15 сентября 2016

Другой вариант решения Iamz - использовать каталог C:\Windows\System32\config\systemprofile\.ssh

Я пришел к этому, запустив следующий скрипт на моем сервере IIS, который сразу показал, что C:\Windows\System32\config\systemprofile\.ssh отсутствует (пожалуйста, установите $ path_of_git и $ path_to_repo в соответствии с вашей машиной):

<code><?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).'
'; $ stderr = stream_get_contents ($ pipe [2]); fclose ($ трубы [2]); echo '
'. htmlspecialchars ($ stderr). '
'; echo '

return value ='. proc_close ($ process). '

'; ?>

Несмотря на это, меня все еще преследуют проблемы с разрешениями, поэтому я считаю полезным просто объявить, что HOME - это другое место, к которому IUSR может легко добраться до каждой команды git, и выполнить все это с мерзавцем Например:

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

Где C:\somewhereIUSRCanGetTo\.ssh\ содержит закрытый ключ и файлы allow_hosts

0 голосов
/ 01 мая 2014

У меня была эта проблема ранее сегодня, и я решил ее по-другому.

Моя проблема заключалась в том, что у IUSR не было домашней папки для помещения ключей ssh ​​или файла учетных данных git.

Я создал .sh файл, который изменил переменную HOME перед вызовом git, поместил мои ключи в нужное место, как если бы это была его домашняя папка, затем использовал sh.exe для запуска .sh

#!/bin/bash
export HOME="/c/some/location"
git pull
0 голосов
/ 30 апреля 2013

Я не совсем уверен насчет среды окна

, но основные проблемы - это ".php файл", который вызывает команду exec без прав администратора (или root в * NIX os)

в моей среде я выбрал этот файл, чтобы иметь привилегии как root (например, вещи sudo), другой способ - создать новую группу пользователей, которая имеет разрешение 777, и назначить этот файл на владение группой этого пользователя.

0 голосов
/ 23 апреля 2013

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

ssh-agent -s<br> ssh-add -l

, чтобы посмотреть, какие ключи у меня были.Перед выполнением этих команд я установил переменную окружения HOME=/c/Users/Username для моего пользователя с правильными ключами ssh.(Я использую путь Unix, потому что я запускал его с Git Bash)

0 голосов
/ 19 октября 2012

Вам нужно использовать proc_open и, таким образом, вы увидите проблему, которая, скорее всего, связана с разрешениями.

Вот скрипт , который я использую :

<?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()', '');
    }

}

?>
0 голосов
/ 14 ноября 2011

Вы должны будете дать разрешения непосредственно cmd.exe.В зависимости от версии Windows и способа настройки пула приложений это могут быть IIS_IUSR, IUSR и / или NETWORK SERVICE.Добавьте пользователя с полными разрешениями для cmd.exe.

Я, конечно, не рекомендую делать это, поскольку это имеет прямые последствия для безопасности.Тем не менее, я не нашел другого способа сделать это в Windows.

...