您的位置:首页 > 编程语言 > PHP开发

关于PHP使用WebHook的问题 Host key verification failed.

2019-04-18 10:01 573 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_35993868/article/details/89372428
PHP项目在coding使用WebHook自动部署时,git pull出现了下面的问题
Host key verification failed.

fatal: Could not read from remote repository.

Please make sure you have the correct access rights

and the repository exists.

一开始在网上查了,基本都是说删除

~/.ssh/known_hosts
文件,
然而并没有用,因为我删除的并不是执行git pull用户的known_hosts文件

搞了我两天,原来是用户的问题,下面是我的解决方法:

由于对linux不太熟悉,我都快给搞炸了,会linux的应该都是小意思。

1.查看执行git pull命令的用户
//PHP代码
exec("cd ~ && cd - && cd -", $output);//跳到用户目录,再回刚刚的目录,然后跳到用户目录
print_r($output);//输出

//cd -命令是返回刚刚目录并输出
//不要使用who命令,因为并不一定是它执行git pull的
//反正我就是给它搞晕了,看用户目录就可以知道是哪个用户执行的了
//我的who命令是root用户,而cd -命令的用户目录是www用户

输出的信息是:

Array ( [0] => /home/wwwroot/apche/web,
[1]=> /home/www )
//[0]是我自己的项目路径
//[1]是我自己的用户目录,所以执行git pull的是www用户
2.切换到www用户
su www

切换成功请跳过这步
如果出现错误,那应该是禁止shell登陆了(如果你是远程连接服务器的话)

//linux命令
vi /etc/passwd
//进入编辑后,找到下面这行,把最后面的改为/bin/bash
例:www:x:1001:1001:,,,:/home/www:/xxx/xxx
www:x:1001:1001:,,,:/home/www:/bin/bash
//然后就可以切换用户su www了
/*
结束后,建议把最后面的改为/usr/bin/git-shell
禁止shell登陆,但是可以执行git命令
*/
3.重新添加ssh公钥

剩下的步骤就是创建公钥,然后coding绑定公钥的一些基本步骤了

//linux命令
cd ~
rm -rf .ssh
ssh-keygen -t rsa -C "xxx@xx.com"
//然后就是设置密码了,不设置就一直回车
//上面的命令分别是 1.进入用户目录。2.删除.ssh目录。3.创建公钥

//接着继续
cat .ssh/id_rsa.pub
//会输出你的公钥,复制到coding绑定公钥即可,然后就可以去测试你的了

绑定好之后,到要自动部署的目录

git init
git remote add 别名 项目地址
git pull 别名 分支
//第一次连接会要你输入yes

然后就可以了。

下面的自动部署是我复制别人代码,忘记哪里复制的了。。。
class Git
{
public function push()
{
// 项目仓库文件夹路径
$dir =  '/home/wwwroot/app';

// Coding新版本的webhook若是设置了token,Coding则对每个请求进行了哈希签名
// 这个签名会放在请求头 X-Coding-Signature,在服务器端我们需要进行签名解析才能拿到真正数据

// token验证令牌,与Coding webhook上设置的一致,用于与Coding进行身份验证,防止恶意提交代码
$token = '';

// 从请求头中获取签名
$signature = $_SERVER['HTTP_X_CODING_SIGNATURE'];

// 接收Coding post传递的参数
$json_post = file_get_contents('php://input');

// 进行签名解析
$sha1 = hash_hmac("sha1",$json_post,$token);

$calculate_signature = 'sha1='. $sha1;

// 进行身份验证
if ($calculate_signature !== $signature) {
exit(json_encode(['error'=>'error request']));
}

// shell_exec()即PHP用于执行系统命令的函数
// cd $dir:进入上面设置的项目仓库文件夹中
// git checkout -f 撤销本地的修改
// git pull origin master  从Coding的项目仓库dev分支拉取最新代码,注意origin为远程仓库的别名,要与 git remote add 远程仓库
// 别名 仓库地址 中的远程仓库别名保持一致
exec("cd $dir && git checkout -f && git pull news dev 2>&1", $output);
//         exec("cd ~ && cd - && cd -", $output);
exit(json_encode($output));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: