在PHP使用coding的WebHook实现自动化部署时出现 Host key verification failed.的问题

我在第一次使用使用coding的WebHook自动部署时,因为我用的PHP编写脚本执行shell_exec,按照网上查询的资料部署好后发现脚本执行git pull出现如下问题:
我的脚本是这样编写的,也是网上别人那里看来的,有很多版本,目前觉得这个是最可靠的,也是思路最清晰的。

<?php
error_reporting(1);
$web_path = '/www/wwwroot/wcfadmin';
// Coding新版本的webhook若是设置了token,Coding则对每个请求进行了哈希签名
// 这个签名会放在请求头 X-Coding-Signature,在服务器端我们需要进行签名解析才能拿到真正数据

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

// 从请求头中获取签名
$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;

$fs and fclose($fs);

// 进行身份验证
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 远程仓库
// 别名 仓库地址 中的远程仓库别名保持一致
// 使用ls命令来执行shell_exec函数
$output= shell_exec('cd ' . $web_path ." && git checkout -f && git pull origin master 2>&1");
exit(json_encode($output));

?>

本来以为逻辑清晰就一切ok了,结果本地push后发现代码并没自动pull,也就是脚本执行并没有成功,一开始以为是WebHook设置有问题,push时没有触发,然后看coding的WebHook发送记录的确也是有的。然后就是想脚本的问题,我就用如下脚本做了实验,直接请求脚本地址发现脚本执行没问题

$output= shell_exec("cd /www/wwwroot/wcfadmin && ls -a");
// 显示所有文件和目录的列表
echo "<pre>$output1</pre>"; 

然后我又换成下面的脚本内容直接请求执行

$output= shell_exec("cd /www/wwwroot/wcfadmin && git checkout -f && git pull origin master 2>&1");
echo "<pre>$output</pre>"; 

结果打印出的结果是就是

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,公钥也加了,况且服务器直接pull也没问题,为啥脚本执行就有问题。网上各种百度发现有人跟我一样的问题,大概就是说是用户的问题,脚本执行git pull的用户并非root用户。
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 "[email protected]"
//然后就是设置密码了,不设置就一直回车
//上面的命令分别是 1.进入用户目录。2.删除.ssh目录。3.创建公钥

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

至此,终于可以自动化了,再也不用每次都去服务器pull了。
参考https://www.jianshu.com/p/c3bedae1e088

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章