【问题标题】:Git pull “permission denied” when using shell_exec in PHP在 PHP 中使用 shell_exec 时 Git 拉“权限被拒绝”
【发布时间】:2014-09-23 21:34:30
【问题描述】:

我正在尝试在bitbucket上做一个钩子,它执行一个php文件,这个文件执行pull命令:

shell_exec('/usr/local/cpanel/3rdparty/bin/git pull');

pull 命令在 SSH 控制台上运行正常,但 PHP 返回错误:

权限被拒绝(公钥)。致命:无法从远程读取 存储库。

请确保您拥有正确的访问权限和存储库 存在。

命令 --version 显示 git 的路径是正确的,whoiami 返回同一用户两者都有,所以我不知道这是否是权限问题。

可能出了什么问题?

编辑: 另一个问题:我为 git 添加的别名在 PHP 上不起作用,只有上面的完整路径。通过终端它工作得很好。可能这也是 php 中 key 不起作用的原因。

编辑 2: $PATH 在两者上都不同。

【问题讨论】:

  • 听起来您的 SSH 密钥未添加到该 git 存储库(权限问题)。
  • 如何调用这个包含 shell_exec() 的脚本?通过浏览器/http?在这种情况下,它不应该返回网络服务器的 UID,而不是你得到的“同一用户”吗?
  • 公钥在存储库中。我可以从服务器中提取,问题仅在于从 php 文件运行命令时。是的,我正在通过 http 运行 php 文件,并且 whoami 返回相同的用户名。是否可以同时拥有同名但不同权限的两个用户?
  • @BrunoMuller 再次阅读 Marc B 所说的话并阅读我的回答。运行命令的 Apache 用户与运行命令的终端用户之间存在很大差异。

标签: php git


【解决方案1】:

当您在 PHP 脚本中运行此命令时,您并没有像您自己一样运行该命令:

shell_exec('/usr/local/cpanel/3rdparty/bin/git pull');

它从终端控制台运行的原因是您从控制台以自己的身份运行命令。但是在 Web 服务器上,您不是运行该命令的用户。请记住:当您在 Web 服务器上运行 PHP 时,它是一个 Apache 模块。这意味着 Web 服务器用户(在某些系统上可能是 www-dataroot 甚至是 apache)正在运行 PHP 脚本,然后运行 ​​shell_exec 命令。

所以它永远不会像你设置的那样工作。也许您可以将一些东西组合在一起,以允许 Web 服务器将密钥对用于这些目的,但这似乎是一个等待发生的安全风险。

【讨论】:

  • 谢谢。我是一个完全的菜鸟。我知道用户可能不同,但是当我运行 shell_exec('whoami') 时,它说用户与我从 termianl 运行时相同。当我列出正在运行的用户时,它只列出了这个用户并说它正在运行 apache。这很令人困惑。正如我上面所说,$PATH 两者都不同,这可能意味着什么吗?
  • @BrunoMuller “shell_exec('whoami'),它表示用户与我从终端运行时的用户相同” 当您从终端运行 PHP 时,您正在运行自己登录到终端。 Apache 作为模块运行的 PHP 作为另一个用户运行。两种完全不同的东西。除非我搞混了:您是否尝试从终端运行 PHP 脚本来执行此操作?
猜你喜欢
  • 1970-01-01
  • 2015-12-19
  • 2013-07-08
  • 2020-06-05
  • 1970-01-01
  • 2014-11-28
  • 2016-10-30
  • 2020-07-30
  • 2011-12-15
相关资源
最近更新 更多