Подтвердить что ты не робот

Git вытащить через PHP exec IIS

Легко самая сложная проблема для диагностики того, что я ВСЕГДА испытал. Кажется, я не могу позвонить:

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

Процесс зависает и принимает на себя IIS.

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

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

  • Сгенерированный ключ RSA добавлен в github (код доступа пуст)
  • У каждого есть разрешение на mysite/.git/, а Program Files/git/bin и cmd.exe
  • Попробовал исправление ssl cert, упомянутое в других сообщениях с проблемой "косой черты"
  • Пробовал использовать 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 repo через PHP exec метод?

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

Help!

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Здесь script Я использую:

<?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('[email protected]', 'GitHub hook `git pull` result', $result);

    // clear APC
    if (apc_clear_cache('opcode') == false) {
        mail('root', 'Unable to apc_clear_cache()', '');
    }

}

?>

Ответ 6

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

ssh-agent -s
ssh-add -l

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

Ответ 7

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

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

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

надеюсь, что эта помощь

Ответ 8

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

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

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

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

Ответ 9

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

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

<?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:red;">'.htmlspecialchars($stderr).'</pre>';
echo '<p>return value=' . proc_close($process) . '</p>';
?>

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

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

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

Ответ 10

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