![从 php 脚本运行 git pull](https://linux22.com/image/576193/%E4%BB%8E%20php%20%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%20git%20pull.png)
我正在尝试借助 Git、GitHub 和 SSH 实现完美的工作流程,但好像跑不起来git pull
。我试过了git status
,没问题。
当我git pull 2>&1
得到:
错误:无法打开.git/FETCH_HEAD:权限被拒绝
我尝试将 .git 目录的 chmod 改为 777,但没有成功。
当我whoami
从浏览器运行时,它显示:apache
- - 编辑 - -
我刚刚做了chown apache:apache -R .git
,现在我得到:
无法创建目录“/.ssh”。主机密钥验证失败。致命:远程端意外挂断
答案1
无法创建目录“/.ssh”。主机密钥验证失败。致命:远程端意外挂断
阅读并考虑您的错误消息。主机密钥存储在 ~/.ssh/known_hosts 文件中。您的 Apache 用户的主目录为“/”,它绝对没有也不应该具有对根目录的写访问权限。
我建议您为此创建一个用户帐户……也许gitpull-user
或其他什么。确保它有一个可用的主目录,即使它位于某个不典型的地方。以该用户身份登录并创建一个 shell 脚本来完成您以该用户身份尝试执行的操作。当然,您还必须将适当的 id_rsa 密钥复制到用户的帐户等。
通过将这一行添加到 /etc/sudoers 来配置 sudo 以启动该脚本
apache ALL = (gitpull-user) NOPASSWD: /path/to/script.sh`
如果您遇到“无 TTY”问题:
Defaults:apache !requiretty
更改 PHP 脚本以调用sudo -u gitpull-user ./script.sh
可以将 Apache 的主目录更改为“真实”位置,然后将密钥放入其中,但这会暴露一个风险,即您的数据必须归 Apache 所有,如果守护进程被攻破,密钥可能会被读取。建立第二个用户可提供一定程度的隔离。
答案2
跑步:
sudo -u apache ssh YOURGITHOST
基本上,apache 用户不知道远程服务器的 SSH 主机密钥是什么,并且它无法提示您接受它。还有其他方法可以做到这一点,但这是我印象最深刻的方法。
答案3
您似乎遇到了两个密切相关的问题:
运行 apache 的用户无法向其
~/.ssh
目录的正常位置写入数据(因为在 CentOS 上 Apache 的主目录是/
,显然我们不希望 Web 服务器随意将东西放在文件系统的任何地方)。Github 需要公钥来验证您的身份。
有一个修复程序可以处理这两种情况:git
使用GIT_SSH
环境变量(如果已设置)来确定以“ssh”运行哪个命令,因此您只需要调整该环境变量来告诉 SSH 两件事:在哪里查找它的known_hosts
文件,以及使用什么公钥进行身份验证。
添加
export GIT_SSH="ssh -oUserKnownHostsFile=/some/path/to/known_hosts -i /some/path/to/private_key"
到您的脚本和其他内容应该工作正常(显然,在我的示例中,用 Apache 可以写入的路径替换虚拟路径)。
请注意,您必须以 Apache 用户身份连接到远程主机一次才能创建和填充文件known_hosts
。您可以通过从命令行运行脚本并在出现交互式提示时处理它来做到这一点。如果您第二次运行脚本,则不应该有任何交互式提示需要处理。
答案4
我遇到了和你一样的问题。我尝试做以下事情
- 你应该知道 http 执行的“角色”。就像你的“apache”
- 创建您的 ssh 密钥
sudo -u apache ssh-keygen -t rsa
,密钥的路径将显示在 cmd 屏幕中。 - 转到路径并
cat id_rsa.pub
复制你的密钥并发布到 github 或 gitlab - 最后,因为你的服务器不知道 git 服务器的主机。所以你应该执行以下操作:
sudo -u http ssh <git host>
,git host 可能是 github.com 或 gitlab.com
使用 cmd 后输入 'yes'。你会发现服务器在 '.ssh/' 中创建了一个名为 'known_hosts' 的文件 - 尝试一下你的 php exec('git pull origin master'),是可以的。
--