使用Bash脚本对Apache进行'git pull'

时间:2018-03-26 21:23:03

标签: linux bash git apache git-pull

我在Bitbucket上有一个名为“foo-apps”的Git存储库。我有一个Linux Web服务器,其中包含此存储库的本地克隆,我希望此服务器的关联Apache网页通过Bash脚本与此存储库(例如git pullgit checkout)执行一些Git命令。问题是,只有用户“foo”有权与“foo-apps”存储库关联,并且网页以Apache用户“www-data”运行。

似乎www-data可以在本地存储库上执行git log和其他一些命令,但不能执行git pullgit checkout命令。 (只是你知道我的系统:我有一个包含JavaScript的HTML文件,其中包含一个AJAX请求,它调用一个PHP文件,该文件调用我的Bash脚本,其中包含Git命令。)

当Web界面触发进程时,我可以通过哪些方法成功获取Git命令?我并不反对任何有效的建议,即使它们包括对我的系统进行全面改革......但是,我希望用我已经得到的最简单有效的解决方案。

以下是我想过的一些想法,并尝试了一下。他们似乎都没有工作,但请记住,我只是“半试过”他们,因为我没有信心我使用首选方法:

  • 在我的Bitbucket存储库上授予www-data权限
  • 让Apache访问foo的ssh密钥
  • 以某种方式切换到脚本中的用户foo,例如sudosu等。(我认为这种想法更像是我想要的......我不喜欢我对Bitbucket存储库的设置有很多控制权。我也可以在脚本中输入密码。)

此网络服务器位于封闭的网络上,安全性对我来说并不是一个高度关注的问题。

我不知道它是否有用,但以下是我在尝试这些方法时遇到的一些与Git相关的主要错误:

error: cannot open .git/FETCH_HEAD: Permission denied

fatal: BUG: get_tempfile_fd() called for inactive object

/usr/bin/git: /usr/bin/git: cannot execute binary file

1 个答案:

答案 0 :(得分:1)

我在this页面上找到答案(感谢odyniec)。

我必须将此行添加到/ etc / sudoers文件中:

www-data ALL=(foo) NOPASSWD: /var/www/html/my_bash_script.sh

这让Apache有权运行我想要的特定脚本。然后从我的PHP文件,而不是运行

shell_exec("/var/www/html/my_bash_script.sh");

我必须跑

shell_exec("sudo -u foo /var/www/html/my_bash_script.sh");

这个答案似乎安全而简单。