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

标签 linux bash git apache git-pull

我在 Bitbucket 上有一个名为“foo-apps”的 Git 存储库。我有一个 Linux 网络服务器,带有此存储库的本地克隆,我希望此服务器的关联 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 命令起作用?我不反对任何可行的建议,即使它们包括对我的系统进行全面检修......但是,我希望用我已经拥有的东西获得最简单有效的解决方案。

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

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

这个网络服务器在一个封闭的网络上,我对安全性不是很关心。

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

错误:无法打开 .git/FETCH_HEAD:权限被拒绝

fatal error :为不活动的对象调用 get_tempfile_fd()

/usr/bin/git:/usr/bin/git: 无法执行二进制文件

最佳答案

我在 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");

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

关于linux - 从 Bash 脚本中使用 Apache 执行 'git pull',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49500846/

相关文章:

c++ - unix 中 select 和 poll 系统调用的功能区别

bash - 使用 bash 读取文本文件中行的子集

Git Bash 在启动和命令时很慢

Git:主要版本更改的分段 merge 方法?

git - 我在 git-svn 中打了标签,现在我的主人总是提交到 svn 标签!

linux - Windows脚本

linux - Jenkins Slave 问题 - 无效的流 header : 099EACED

regex - sed 正则表达式地址范围

linux - 非交互式、非登录 shell 的 ash 中有哪些初始化文件?

linux - 查找前缀和后缀匹配的文件