Я пробовал Идеальный рабочий процесс с 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, и ключ может быть прочитан, если демон будет скомпрометирован . Создание второго пользователя обеспечивает уровень изоляции.
Я встречаю тот же вопрос, что и ваш. и я пытаюсь сделать ниже
sudo -u apache ssh-keygen -t rsa
и путь ключа будет показан на экране cmd.cat id_rsa.pub
, скопируйте свой ключ и опубликуйте в github или gitlabsudo -u http ssh <git host>
, Git host может быть github.com или gitlab.com-
Я также пытался получить данные из репозитория 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 только для чтения с использованием скрипта веб-сервера работал нормально.
Похоже, у вас есть две тесно связанные проблемы:
Пользовательский apache запущен, так как не может писать в обычное место для своего ~/.ssh
каталог (потому что в CentOS домашний каталог Apache /
, и, очевидно, мы не хотим, чтобы веб-сервер просто размещал вещи в файловой системе в любом месте).
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. код обновится