使用 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 密钥,我如何切换到我的用户名?
链接到用户,您在 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 密钥。请按照以下步骤操作:
- sudo mkdir/var/www/.ssh (作为 root 用户,您创建目录) sudo chown -R www-data/var/www/.ssh
- (使 www-data 用户可读/写 .ssh 目录)
- sudo -u www-data ssh-keygen -t rsa (create rsa key)现在,只需按回车键。不要为密钥添加任何密码。接下来,您只需要复制公钥并将其添加到 gitlab 帐户。
自动化快乐!