PHP:通过HTTP和命令行运行脚本时结果不同

3
我有一个GIT存储库,并使用PHP脚本从主分支拉取并更新服务器上的文件。这是一个简单的解决方法,只是为了测试它。我想在github上添加一个webhook,在成功推送后发送回调,以便我可以从这个repo中拉取。
脚本两种方式运行:
- 从命令行 - 从HTTP请求
不同之处在于,当我从HTTP运行它时,它不会拉取新的更改,只显示它是最新的,即使我100%确定repo中有新的更改。输出来自GIT命令,所以我确定它可以工作,apache具有运行脚本文件和其中使用的命令的适当权限。
当我通过命令行运行它(通过相同的脚本或干净的git命令)时,一切正常,脚本拉取新更改并显示标准GIT输出。
PHP代码:
echo "Pulling changes from master branch...\n";
$result = shell_exec('cd /var/git-test && git reset --hard HEAD && git pull');
if($result !== null){
  echo $result;
}else{
  echo $result;
  echo "Error in Git pull comand";
}

我该如何修复这个问题?

1
你尝试过使用apache用户手动运行脚本吗? - Ôrel
1
你怎么知道它“显示为最新状态”? - markus
以防万一,还要警告一下应该禁用 shell_exec,开启它是不安全的。 - markus
问题已解决: Apache用户"www-data"应该生成自己的SSH密钥,并可以通过使用Webhooks在GitHub上验证拉取请求。 - lukasz
@Ôrel 是的,那很有帮助,我通过运行 sudo -u www-data php deploy.php 进行了测试,并且发现它显示了一些额外的信息,这些信息没有被 shell_exec() 返回,这有点困惑。无法执行 Git pull,因为 www-data 没有在 Github 上注册他的SSH密钥。 - lukasz
1个回答

1

sudo -u www-data php deploy.php 显示www-data用户在github上没有注册ssh密钥,因此无法进行pull操作。我无法切换到www-data用户,所以像运行脚本 sudo -u www-data ssh-keygen -t rsa 时一样,在不切换用户的情况下生成了他的密钥。在github上注册他的密钥后,它就可以正常工作了。

还有一个专业提示!shell_exec()不会显示所有输出,而在命令行中以另一个用户身份运行脚本时可见。这真的很令人困惑,花费了我很多时间才找出错误所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接