我在 Bitbucket 上有一个名为“foo-apps”的 Git 存储库。我有一个 Linux 网络服务器,带有此存储库的本地克隆,我希望此服务器的关联 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 命令起作用?我不反对任何可行的建议,即使它们包括对我的系统进行全面检修......但是,我希望用我已经拥有的东西获得最简单有效的解决方案。
以下是我想到并尝试过的一些想法。它们似乎都不起作用,但请记住,我只对它们进行了“一半尝试”,因为我没有信心使用首选方法:
- 在我的 Bitbucket 存储库上授予 www-data 权限
- 让 Apache 访问 foo 的 ssh key
- 以某种方式在脚本中切换到用户 foo,例如使用
sudo
、su
等。(我认为这种想法更符合我的思路想要...我对 Bitbucket 存储库的设置没有太多控制权。我也可以在脚本中输入密码。)
这个网络服务器在一个封闭的网络上,我对安全性不是很关心。
我不知道它是否有用,但以下是我在尝试这些方法时收到的一些与 Git 相关的主要错误:
错误:无法打开 .git/FETCH_HEAD:权限被拒绝
fatal error :为不活动的对象调用 get_tempfile_fd()
/usr/bin/git:/usr/bin/git: 无法执行二进制文件
最佳答案
我必须将这一行添加到/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/