【问题标题】:Doing a 'git pull' with Apache from a Bash script从 Bash 脚本中使用 Apache 执行“git pull”
【发布时间】:2018-09-05 03:38:42
【问题描述】:

我在 Bitbucket 上有一个名为“foo-apps”的 Git 存储库。我有一个带有此存储库本地克隆的 Linux Web 服务器,并且我希望此服务器的关联 Apache 网页通过 Bash 脚本对此存储库执行一些 Git 命令,例如 git pullgit checkout。问题是,只有用户“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

【问题讨论】:

  • 创建一个 shell 脚本,可以在您想要执行的目录中执行您想要的操作,然后授予 Apache 无密码 sudo 访问权限以以 foo 运行该脚本(仅此而已)。
  • 这似乎是最简单的事情。我没有意识到您可以授予特定用户权限以运行 /etc/sudoers 中的特定文件。

标签: linux bash git apache git-pull


【解决方案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");

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

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2012-10-16
    • 2012-03-11
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    相关资源
    最近更新 更多