Gitlab webhooks 由于 shell 脚本权限而不起作用



使用 laravel 5.6.我正在尝试在 gitlab 上设置一个网络钩子,以git pull推送事件。我创建了一个发布路由,添加了控制器和方法,用于启动 shell 脚本:

use SymfonyComponentProcessProcess;
    class WebhookController extends Controller
    {
        public function handle(Request $request) {
            $root_path = base_path();
            $process = Process::fromShellCommandline('cd ' . $root_path . '; ./deploy.sh');
            $process->run(function($type, $buffer) {
                echo $buffer;
            });
        }
    }

Shell 脚本本身只包含一行:

#!/bin/sh
git pull

但是在 gitlab 的请求详细信息中,我在推送后看到一个错误:

error: cannot open .git/FETCH_HEAD: Permission denied

我已经chmod 777 deploy.sh了,但我想它试图从其他用户启动该脚本?如果我从我的用户启动脚本,它就可以工作(我使用没有密码的 ssh 密钥)。

更新

我做了sudo chown -R $USER:www-data . - 现在它没有显示权限错误,除了一个:

Could not create directory '/var/www/.ssh'.
Host key verification failed.
fatal: Could not read from remote repository.

它试图使用 www-data 用户(我用 whoami 检查过)进行git pull,所以它没有正确的 ssh 密钥,我如何切换到我的用户名?

SSH 密钥

链接到用户,您在 Laravel 应用程序中的进程很可能不会以您添加 ssh 密钥的用户身份运行。它可能以www-data用户身份运行。

尝试为您的www-data用户创建一个 ssh 密钥,并将该密钥用作 Gitlab 上的"部署密钥"。尝试sudo -u www-data ssh-keygen -t rsa创建 ssh 密钥。另请查看此问题。

回答您关于切换到用户名的最后一个问题:这不是一个好主意。这样,您的应用程序就可以运行您的用户能够运行的任何内容,这不是一个好主意。而是为该用户创建一个单独的 ssh 密钥,并授予其对您的存储库的有限访问权限(即仅读取/拉取访问权限)。

最近来这里的人,这里是指南:

  • 该脚本由用户 www-data 在由 Laravel 进程执行时运行。因此,您首先需要确保为用户创建 ssh 密钥 www-data 并将其添加到您的 gitlab 帐户中。

要为 www-data 创建 ssh 密钥。请按照以下步骤操作:

  1. sudo mkdir/var/www/.ssh (作为 root 用户,您创建目录)
  2. sudo chown -R www-data/var/www/.ssh
  3. (使 www-data 用户可读/写 .ssh 目录)
  4. sudo -u www-data ssh-keygen -t rsa (create rsa key)现在,只需按回车键。不要为密钥添加任何密码。接下来,您只需要复制公钥并将其添加到 gitlab 帐户。

自动化快乐!

最新更新