从 Bash 脚本使用 Apache 执行 'git pull'

Doing a 'git pull' with Apache from a Bash script

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

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

当进程由 Web 界面触发时,我可以通过哪些方式成功地使那些 Git 命令起作用?我不反对任何可行的建议,即使它们包括对我的系统进行全面检修......但是,我希望用我已经拥有的东西获得最简单有效的解决方案。

以下是我想到并尝试过的一些想法。 None 个似乎有效,但请记住,我只有 "half tried" 个,因为我没有信心使用首选方法:

此 Web 服务器位于封闭网络上,我对安全性不是很关心。

我不知道它是否有用,但以下是我在尝试这些方法时收到的一些与 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

我在 this page (thanks odyniec 上找到了答案。

我不得不将这一行添加到 /etc/sudoers 文件中:

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

这让 Apache 获得了 运行 我想要的特定脚本的权限。然后从我的 PHP 文件中,而不是 运行ning

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

我不得不运行

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

这个答案看起来既安全又简单。