【问题标题】:PHP Github Pull script error 'permission denied (publickey)'PHP Github Pull 脚本错误“权限被拒绝(公钥)”
【发布时间】:2013-10-16 23:18:31
【问题描述】:

我已经设置了一个 PHP 脚本来执行 GitHub 拉取:

这包含在我的 Github 文件夹中 /home/mysite/public_html/github

github_pull.php

<?php
echo `git pull 2>&1`;
?>

我的服务器已经有了 SSH 公钥,就像我从终端执行 git pull 一样:

ssh username@host.com
cd public_html/github
git pull

这很成功(但是我必须先输入 rsa 密钥的密码) 更新:不再需要密码(参见 cmets)

但是,当我运行 github_pull.php 时,我收到以下错误: 权限被拒绝(公钥)。致命:远端意外挂断

SSH 密钥包含在/home/mysite/.ssh/id_rsa

当我跑步时

<?php echo `whoami`;

它输出mysite

【问题讨论】:

  • 执行脚本的用户,通常是 Apache 的www_data 是否有权访问 ssh 密钥?另请注意,用户可能正在查看密钥的不同位置。
  • (1) 您的网络服务器是以您的用户身份运行,还是以www-data 身份运行? (2) 网络服务器可以读取 SSH 密钥吗? (3) 网络服务器是否真的在寻找那个密钥? (你可以随时尝试export GIT_SSH="your ssh command"
  • however I do have to enter the password for the rsa key first 这意味着不能以非交互方式使用密钥。 IE。即使密钥可用,它也不起作用。
  • 执行脚本的用户是mysite。 .ssh 权限为 0700,id_rsa.pub 权限为 0640,id_rsa 权限为 0600。如何指定脚本的密钥位置?
  • 创建一个没有密码的密钥,将其添加到您的 github 帐户并使用它。 test it in the same way you would test any ssh problem。请注意,您不需要需要 ssh 访问问题git pull(除非它是私人回购) - 您可以改用https

标签: php git apache github ssh


【解决方案1】:

正如评论,首先尝试一个 https url:

 ssh username@host.com
 cd public_html/github
 git remote set-url origin https://github.com/username/reponame
 git pull

这比修改 ssh 密钥要容易得多,尤其是当它们受到密码保护时。


如果您必须使用 ssh 密钥,那么您必须知道密钥的默认位置是:

~/.ssh/id_rsa(.pub)

如果执行脚本的用户是'mysite',那么它将寻找~mysite/.ssh/id_rsa
您需要确保ssh-agentmysite 用户身份运行。这就是为什么一开始使用私钥密码保护更容易尝试的原因。

如果您的 ssh 密钥在其他地方,那么您需要一个:

~mysite/.ssh/config

在该配置文件中,作为illustrated here,您可以指定要使用的密钥的位置和名称。

【讨论】:

  • 您的第一个解决方案在终端中运行时运行良好(输入用户名和密码后)。但是 PHP 脚本我得到这个错误:fatal: could not read Username for 'https://github.com': No such device or address。如何告诉脚本用户名和密码?
  • @Tom 拉,你不需要凭证。您不需要用户名和密码(除非它是私人仓库。它是私人仓库吗?)。否则,您会将所述凭据存储在 ~/.netrc 文件中:stackoverflow.com/a/11022181/6309
  • 这是一个私人仓库。我创建了 .netrc (/home/mysite/.netrc) 并将以下内容放入其中:machine mysite.com login &lt;username&gt; password &lt;mypassword&gt;。仍然使用与上面相同的 PHP,我仍然遇到致命错误:无法读取用户名错误。还尝试了“github.com”。有什么建议么?谢谢
  • @Tom machine: mysite.com?不:应该是machine: github.com :) 这些是 github 凭据,供 git pull 访问您的私人仓库。
  • @Tom 然后尝试使用 OAuth (blogdown.io/c4d42f87-80dd-45d5-8927-4299cbdf261c/posts/…):与私有存储库一起使用。
【解决方案2】:

您应该首先尝试使用实际的“mysite”帐户进行调试。

sudo -u mysite
cd ~/public_html/github
git pull

从错误日志看,好像是远程问题,不是本地的。这意味着 SSH 实际上可以访问您的私钥。

我怀疑 github 正在接收您自己的个人私钥(通过 ssh-agent),而不是“mysite”公钥。您可以通过在您的 php 代码中运行 ssh-add -l 或使用 sudo -u mysite; ssh-add -l 并与在 github 界面中注册的内容进行比较来验证这一点。

Github 已经广泛讨论了这个问题:https://help.github.com/articles/error-permission-denied-publickey

【讨论】:

    【解决方案3】:

    将以下内容添加到您的 .ssh/config 中

    Host github_server
      HostName github.com
      User git
      IdentityFile /path/to/your/private_key
    

    编辑您的 .git/config 并从

    更新远程 repo URL
    url = git@github.com:git_repo_name.git
    

    url = git@github_server:git_repo_name.git
    

    这应该可以帮助您使用给定的密钥登录服务器。将上述密钥的路径替换为您机器上的完整实际路径。将 repo 名称替换为实际的 repo 名称。请注意,用户“mysite”有权访问密钥文件。您可以使用 PHP 中的 fopen 进行测试并确认。

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 2012-04-25
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多