从 Bash 脚本使用 Apache 执行 'git pull'
Doing a 'git pull' with Apache from a Bash script
我在 Bitbucket 上有一个名为 "foo-apps" 的 Git 存储库。我有一个 Linux Web 服务器和这个存储库的本地克隆,我希望这个服务器的关联 Apache 网页使用这个存储库执行一些 Git 命令,例如 git pull
和 git checkout
,通过 Bash 脚本。问题是,只有用户 "foo" 有权与 "foo-apps" 存储库关联,并且该网页以 Apache 用户 "www-data" 运行。
似乎 www-data 可以在本地存储库上执行 git log
和其他一些命令,但不能执行 git pull
或 git checkout
命令。 (让你了解我的系统:我有一个包含 JavaScript 的 HTML 文件,其中包含一个 AJAX 请求,它调用一个 PHP 文件,它调用我的 Bash 脚本,其中包含 Git 命令。)
当进程由 Web 界面触发时,我可以通过哪些方式成功地使那些 Git 命令起作用?我不反对任何可行的建议,即使它们包括对我的系统进行全面检修......但是,我希望用我已经拥有的东西获得最简单有效的解决方案。
以下是我想到并尝试过的一些想法。 None 个似乎有效,但请记住,我只有 "half tried" 个,因为我没有信心使用首选方法:
- 在我的 Bitbucket 存储库上授予 www-data 权限
- 让 Apache 访问 foo 的 ssh 密钥
- 以某种方式在脚本中切换到用户 foo,例如
sudo
、su
等。(我认为这种想法更符合我的想法......我对 Bitbucket 存储库的设置没有太多控制权。我也可以在脚本中输入密码。)
此 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");
这个答案看起来既安全又简单。
我在 Bitbucket 上有一个名为 "foo-apps" 的 Git 存储库。我有一个 Linux Web 服务器和这个存储库的本地克隆,我希望这个服务器的关联 Apache 网页使用这个存储库执行一些 Git 命令,例如 git pull
和 git checkout
,通过 Bash 脚本。问题是,只有用户 "foo" 有权与 "foo-apps" 存储库关联,并且该网页以 Apache 用户 "www-data" 运行。
似乎 www-data 可以在本地存储库上执行 git log
和其他一些命令,但不能执行 git pull
或 git checkout
命令。 (让你了解我的系统:我有一个包含 JavaScript 的 HTML 文件,其中包含一个 AJAX 请求,它调用一个 PHP 文件,它调用我的 Bash 脚本,其中包含 Git 命令。)
当进程由 Web 界面触发时,我可以通过哪些方式成功地使那些 Git 命令起作用?我不反对任何可行的建议,即使它们包括对我的系统进行全面检修......但是,我希望用我已经拥有的东西获得最简单有效的解决方案。
以下是我想到并尝试过的一些想法。 None 个似乎有效,但请记住,我只有 "half tried" 个,因为我没有信心使用首选方法:
- 在我的 Bitbucket 存储库上授予 www-data 权限
- 让 Apache 访问 foo 的 ssh 密钥
- 以某种方式在脚本中切换到用户 foo,例如
sudo
、su
等。(我认为这种想法更符合我的想法......我对 Bitbucket 存储库的设置没有太多控制权。我也可以在脚本中输入密码。)
此 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");
这个答案看起来既安全又简单。