背景:
開發中我們想推送代碼到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