在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

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