从php脚本运行git pull

我正在尝试使用Git,GitHub和SSH的完美工作stream,但似乎我无法运行git pull 。 我试过git status ,这很好。

当我git pull 2>&1我得到:

错误:无法打开.git / FETCH_HEAD:权限被拒绝

我试图chmod .git目录到777没有运气。

当我从浏览器运行whoami ,它显示我: apache

—编辑—

我只是做了chown apache:apache -R .git ,现在我得到:

无法创build目录“/.ssh”。 主机密钥validation失败。 致命的:远端意外挂断

无法创build目录“/.ssh”。 主机密钥validation失败。 致命的:远端意外挂断

阅读并考虑您的错误信息。 主机密钥存储在〜/ .ssh / known_hosts文件中。 您的Apache用户拥有“/”作为其主目录,而且它绝对不会,也不应该具有对根目录的写入权限。

我build议你为此创build一个用户帐户…也许gitpull-user或东西。 确保它有一个可用的主目录,即使它在某个非典型的地方。 以该用户身份login并创build一个shell脚本来完成您要以该用户身份执行的操作。 当然,你也必须将适当的id_rsa密钥复制到用户的帐户等。

configurationsudo以通过将此行添加到/ etc / sudoers来启动该脚本

 apache ALL = (gitpull-user) NOPASSWD: /path/to/script.sh` 

还有,如果你有“没有TTY”的问题:

 Defaults:apache !requiretty 

改变你的PHP脚本来调用sudo -u gitpull-user ./script.sh


可以将Apache的主目录改为“真实”的位置,然后把密钥放在那里,但是这会暴露一个风险,你的数据必须被apache所有,如果守护进程被攻破了,密钥可以被读取。 build立第二个用户提供了一个隔离级别。

跑:

sudo -u apache ssh YOURGITHOST

基本上,apache用户不知道远程服务器的SSH主机密钥是什么,也不能提示你接受它。 还有其他方法可以做到这一点,但这是我记得最清楚的一个。

你似乎有两个密切相关的问题:

  1. 用户apache正在运行,因为它不能写入~/.ssh目录的正常位置(因为在CentOS上Apache的主目录是/ ,显然我们不希望Web服务器只是把文件放在任何需要的地方)。

  2. Github想要一个公钥来validation你的身份。

有一个解决scheme应该能够处理这两种情况: git使用GIT_SSH环境variables(如果已设置)确定以“ssh”运行的命令,所以您只需调整该环境variables以告诉SSH两件事:在哪里查找其known_hosts文件,以及用于validation的公钥。


export GIT_SSH="ssh -oUserKnownHostsFile=/some/path/to/known_hosts -i /some/path/to/private_key"
到你的脚本和东西应该工作正常(显然replace一个pathApache可以写在我的例子中的虚拟path)。

请注意,您必须以Apache用户的身份连接到远程主机,以创build并填充known_hosts文件。 您可以通过从命令行运行脚本并在出现交互式提示时处理。 如果您再次运行该脚本,则不应该有任何交互式提示处理。

我正在尝试从web服务器PHP脚本中使用exec()从GIT存储库中获取数据。 远程存储库是以不同的用户读取的。

我的主要问题是,当运行Web服务器PHP脚本时,来自PULL的EXEC结果variables是完全空的 – 我只能说PULL没有发生,没有进一步的错误信息,什么都没有。 不过,一个简单的“git help”确实有效。

解决这个问题的是以下几点:

首先,我使存储库目录的webserveruser所有者:

 chown -R <webserveruser>:<webusergroup> <repodir> 

通常无法login到Web服务器用户,所以我先指定了一个shell:

 usermod -s /bin/bash <webserveruser> 

以networking服务器用户login:

 su <webserveruser> 

然后更改为repodirectory并执行手动拉动:

 cd <repodir> git pull 

退出Web服务器用户并返回到root并再次禁用Web服务器用户的shell:

 exit usermod -s /bin/false <webserveruser> 

听起来很奇怪:之后,使用Web服务器脚本的只读PULL工作得很好。

我遇到了和你一样的问题。 我试着做下面

  1. 你应该知道http执行的'angular色'。 就像你的“阿帕奇”
  2. 创build你的ssh密钥sudo -u apache ssh-keygen -t rsa ,密钥的path将显示在cmd屏幕上。
  3. 去path和cat id_rsa.pub ,复制您的密钥和post到github或gitlab
  4. 最后,因为你的服务器不知道git服务器的主机。 所以你应该这样做:
    sudo -u http ssh <git host> ,git host可能是github.com或gitlab.com
    在使用cmd后input'yes'。 你会发现服务器在'.ssh /'中创build一个名为'known_hosts'的文件
  5. 试试你的php exec('git pull origin master'),这没关系。