php执行Linux命令的方法(具体案例)

最近本人在做一个系统用来管理团队的任务,其中涉及到我们的任务需要选择项目的git分支,我的方案是利用php去获取某个项目的远程仓库的分支:
exec(“cd /data/www/superb/Git/saint;git pull;git branch -r”, $output);
解释下:
cd /data/www/superb/Git/saint # 跳到从git项目拉下来的代码目录下
git pull  # 更新代码
git branch -r  # 获取当前代码目录下本地和远程所有的代码
一句话执行以上三句需要加上分号。
后来发现git pull无效的问题,即服务器的代码目录并没有自动更新,我获取的远程分支不是最新的。后来发现原来是没有权限,因为git pull这种的写操作无法执行,而git branch这样的读操作是可以执行的。
我的服务器是nginx+php-fpm,最终执行这个linux shell命令的用户是php-fpm的www,使用ps aux | grep php-fpm查看,而且我用php exec执行了whoami:
exec(“whoami”, $output);
也证明了用户是www,于是我将www用户添加到了服务器的sudo列表里:
vim /etc/sudoers
增加一行:
www             ALL=(ALL)       NOPASSWD:ALL
# www             ALL=(ALL)       ALL
下面一行注释掉的和第一行的区别是第一行的配置当www用户在执行sudo操作的时候不需要密码,第二行的配置是所有的sudo操作都要输入www用户的密码。
我把php的代码改成了:
exec(“cd /data/www/superb/Git/saint;sudo git pull;git branch -r”, $output); // git pull用sudo来执行
结果发现依然没有效果,最后我只好用下下策,将/data/www/superb/Git/saint目录和子目录文件的用户和组改为了www:
chown -R www:www  /data/www/superb/Git/saint/
最终php的命令改为:
exec(“cd /data/www/superb/Git/saint;git pull;git branch -r”, $output); // 把sudo去掉
这样就可以执行了,最终实现了我的目标。

 

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/2393.html

发表评论