Назад | Перейти на главную страницу

Запуск git pull из php скрипта

Я пробовал Идеальный рабочий процесс с Git, GitHub и SSHно похоже я не могу бежать git pull. я пробовал git status и это нормально.

Когда я git pull 2>&1 я получил:

ошибка: не удается открыть .git / FETCH_HEAD: в разрешении отказано

Я безуспешно пытался изменить chmod .git dir на 777.

Когда я бегу whoami из браузера он показывает мне: apache

--- РЕДАКТИРОВАТЬ ---

я только что сделал chown apache:apache -R .git и теперь я получаю:

Не удалось создать каталог '/.ssh'. Ошибка проверки ключа хоста. фатальный: удаленный конец неожиданно повесил трубку

Не удалось создать каталог '/.ssh'. Ошибка проверки ключа хоста. фатальный: удаленный конец неожиданно повесил трубку

Прочтите и примите во внимание ваше сообщение об ошибке. Ключи хоста хранятся в файле ~ / .ssh / known_hosts. Ваш пользователь Apache имеет "/" в качестве домашнего каталога, и он определенно не имеет и не должен иметь права записи в корень.

Я предлагаю вам создать для этого учетную запись пользователя ... возможно gitpull-user или что-то. Убедитесь, что у него есть пригодный для использования домашний каталог, даже если он является нетипичным. Войдите в систему как этот пользователь и создайте сценарий оболочки, который выполняет то, что вы пытаетесь сделать как этот пользователь. Конечно, вам также придется скопировать соответствующий ключ id_rsa в учетную запись пользователя и т. Д.

Настройте sudo для запуска этого сценария, добавив эту строку в / etc / sudoers

apache ALL = (gitpull-user) NOPASSWD: /path/to/script.sh`

а также если у вас проблемы с телетайпом:

Defaults:apache !requiretty

Измените свой PHP-скрипт на вызов sudo -u gitpull-user ./script.sh


Можно было бы изменить домашний каталог Apache на «реальное» местоположение и просто поместить туда ключ, но это подвергнет риску, что ваши данные должны принадлежать apache, и ключ может быть прочитан, если демон будет скомпрометирован . Создание второго пользователя обеспечивает уровень изоляции.

Я встречаю тот же вопрос, что и ваш. и я пытаюсь сделать ниже

  1. вы должны знать «роль» http execute. Как и ваш апач
  2. создайте свой ssh-ключ sudo -u apache ssh-keygen -t rsa и путь ключа будет показан на экране cmd.
  3. иди на тропу и cat id_rsa.pub, скопируйте свой ключ и опубликуйте в github или gitlab
  4. наконец, потому что ваш сервер не знает хост сервера git. Итак, вы должны сделать ниже:
    sudo -u http ssh <git host> , Git host может быть github.com или gitlab.com
    Введите «да» после того, как вы использовали cmd. И вы обнаружите, что сервер создает файл с именем 'known_hosts' в '.ssh /'
  5. Чтобы попробовать свой php exec ('git pull origin master'), все в порядке.

-

Я также пытался получить данные из репозитория GIT с помощью exec () в PHP-скрипте веб-сервера. Удаленный репозиторий был извлечен только для чтения под другим пользователем.

Моя основная проблема заключалась в том, что при запуске PHP-скрипта веб-сервера результирующие переменные EXEC из PULL были полностью пусты - я просто мог сказать, что PULL не произошло, никаких сообщений об ошибках, ничего. Однако простая команда git help действительно работала.

Проблема была устранена следующим образом:

Сначала я делаю пользователя веб-сервера владельцем каталога репозитория:

chown -R <webserveruser>:<webusergroup> <repodir>

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

usermod -s /bin/bash <webserveruser>

Войдите как пользователь веб-сервера:

su <webserveruser>

Затем перейдите в репозиторий и сделайте ручную тягу:

cd <repodir>
git pull

Выйдите из пользователя веб-сервера, вернитесь к root и снова отключите оболочку пользователя веб-сервера:

exit
usermod -s /bin/false <webserveruser>

Как бы странно это ни звучало: после этого PULL только для чтения с использованием скрипта веб-сервера работал нормально.

Похоже, у вас есть две тесно связанные проблемы:

  1. Пользовательский apache запущен, так как не может писать в обычное место для своего ~/.ssh каталог (потому что в CentOS домашний каталог Apache /, и, очевидно, мы не хотим, чтобы веб-сервер просто размещал вещи в файловой системе в любом месте).

  2. Github хочет, чтобы открытый ключ аутентифицировал вас.

Есть исправление, которое должно обрабатывать оба этих случая: git использует GIT_SSH переменная среды (если она установлена), чтобы определить, какую команду запускать как "ssh", поэтому вам просто нужно настроить эту переменную среды, чтобы сообщить SSH две вещи: где искать ее known_hosts файл и какой открытый ключ использовать для аутентификации.

Добавить
export GIT_SSH="ssh -oUserKnownHostsFile=/some/path/to/known_hosts -i /some/path/to/private_key"
к вашему сценарию и тому подобное должен работать нормально (очевидно, замените путь, который Apache может записывать для фиктивных путей в моем примере).

Обратите внимание, что вам нужно будет один раз подключиться к удаленному узлу в качестве пользователя Apache, чтобы создать и заполнить known_hosts файл. Вы можете сделать это, запустив сценарий из командной строки и работая с интерактивной подсказкой, когда она появится. Если вы запустите сценарий во второй раз, у вас не должно быть никаких интерактивных подсказок.

Бегать:

sudo -u apache ssh YOURGITHOST

По сути, пользователь apache не знает, что такое ключ хоста SSH удаленного сервера, и не может предложить вам его принять. Есть и другие способы сделать это, но это тот, который я запомнил лучше всего.

Если вы используете https вместо ssh, вы можете указать пользователя / пароль прямо в запросе:

git clone:

$output = shell_exec ("git clone https://user:password@github.com:user/repo.git");

git pull:

$output = shell_exec("git pull https://user:password@github.com:user/repo.git");

образец кода php

<?php

$outputs =  shell_exec('git pull https://user:password@github.com:user/repo.git master');
echo "<pre>$outputs</pre>";
?>

$outputs он покажет последний результат фиксации.

Затем вы добавляете разрешение для своей папки проекта

chown -R <webserveruser>:<webusergroup> <repodir>

Перезагрузите сервер apache

sudo service apache2 restart 

он будет работать из браузера, вы можете запустить файл php. код обновится