Git pull через PHP shell_exec( ) работает из оболочки SSH, но не из веб-браузера

#php #linux #git #web-hosting

Вопрос:

У меня есть PHP-скрипт, который просто:

 $output = shell_exec('git pull https://****@bitbucket.org/****/****.git 2>amp;1');
print_r($output)
 

Я могу подключиться по SSH к своему хосту и запустить это с помощью «PHP scriptname.php» и это прекрасно работает и говорит мне, что все обновлено в течение доли секунды.

Однако, когда я пытаюсь запустить этот же PHP-скрипт через веб-браузер, он зависает на неопределенный срок.

Комментарии:

1. Проверьте вывод файла .sh с помощью `/usr/bin/php -c «path/to/file.sh» чтобы посмотреть, не приведет ли это к ошибке.

Ответ №1:

Проблема в том, что ваш веб-сервер и оболочка ssh имеют разный набор переменных среды. В этом случае проблема git в том, что в $PATH переменной веб-сервера отсутствует.

Чтобы исправить это, вы можете добавить каталог с git двоичным кодом в $PATH переменную

 set PATH=$PATH:/usr/local/cpanel/3rdparty/lib/path-bin
 

или просто назовите его полным путем
/usr/local/cpanel/3rdparty/lib/path-bin/git

Что касается учетных данных git — попробуйте найти ответственную переменную env.

Комментарии:

1. Если я удалю часть «Изменить каталог» и оставлю запрос git, веб-браузер по-прежнему зависает и ничего не делает. Если он находится не в правильном каталоге, он должен вернуть ошибку «фатально: не репозиторий git», но она просто зависает. Обратите внимание, это работает, когда я нахожусь в терминале и запускаю php-файл с помощью: php «script.php» но когда я запускаю скрипт из браузера, он просто зависает… Я отредактировал свой вопрос, чтобы удалить каталог изменений, поскольку, похоже, в этом нет необходимости

2. извините, что я не проверил вашу правку. Если у вас достаточно прав, попробуйте оформить sudo -u www-data git pull <...> их, чтобы проверить вывод. Возможно, у пользователя вашего веб-сервера нет доступа на запись в целевой каталог.

3. Так и должно быть, но ваша оболочка и веб-сервер имеют разные наборы переменных среды. Попробуйте запустить это php -r "system('git pull <...>');" в своей оболочке ssh. Правильно ли это работает?

4. Я немного обескуражен 🙂 Может быть, сравнение переменных среды даст вам подсказку? Попробуйте сравнить env результаты выполнения команд из командной оболочки и веб-сервера.

5. Как вы видите, переменная PATH сильно отличается. Пожалуйста, проверьте двоичное расположение «git» по which git . В качестве грязного исправления попробуйте добавить эту строку в начало вашего сценария bash: set PATH=/usr/local/jdk/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/cpanel/composer/bin:/opt/puppetlabs/bin:/usr/local/bin:/usr/X11R6/bin:/home/REPLACEDUSERNAME/.local/bin:/home/REPLACEDUSERNAME/bin