PHP执行git命令更新代码

背景:

开发中我们想推送代码到git仓库的时候,在测试环境立马就能看到是什么样的,我们可以通过git仓库的webhook钩子配置的,在推送代码到git仓库的时候,仓库收到代码,然后可以访问一个url,然后你在这个url写段代码执行更新代码的命令。

php 代码

<?php
exec("cd /usr/local/nginx/html/yafcms  && sudo git reset --hard && sudo git pull",$data);
var_dump($data);

成功输出:array(0) { } array(2) { [0]=> string(33) "HEAD is now at 3246c80 git 钩子" [1]=> string(19) "Already up-to-date." }

失败输出:array(0) { } 

上面这段应该没有看不懂的吧?我的git项目放在/usr/local/nginx/html/yafcms,切换到这个目录,然后git reset --hard 把git设置到最新版本(这里是为了防止在服务器上面改了代码,更新的时候会叫你先提交更改的代码,),git pull 再更新代码。

如果不配置sudo的话,上面这段更新git代码是100%无法正常使用的,因为sudo要root密码,那我们只想给git相关的命令在用sudo执行的时候不用密码,其他sudo命令一定要密码怎么办?

1.查看git的在哪里执行命令

[root@email ~]# whereis git 
git: /usr/bin/git /usr/share/man/man1/git.1.gz

 

2.查看php是什么用户在运行的

[root@email public]# ps  -ef|grep  php 
root      1111     1  0  2019 ?        00:00:14 php-fpm: master process 
nobody   25036  1111  0  2019 ?        00:00:02 php-fpm: pool www
nobody   25055  1111  0  2019 ?        00:00:02 php-fpm: pool www
nobody   28265  1111  0 Jan01 ?        00:00:01 php-fpm: pool www

3.配置git命令sudo不用密码 vim /etc/sudoers 

## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
nobody  ALL= NOPASSWD:/usr/bin/git

vim /etc/sudoers 配置完成保存退出即可生效,然后再访问php的脚本就可以成功了

如果需要给多个sudo命令免密可以多个就用逗号隔开:
nobody ALL= NOPASSWD:/usr/bin/git,/usr/local/nginx/sbin/nginx

参考:https://blog.csdn.net/php_sir/article/details/84582761

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