A razão pela qual a etapa git pull
falha é porque no Ubuntu, o Apache executa o script como o usuário www-data
. Assim, git
procura as chaves ssh associadas ao usuário www-data
e, ao não encontrá-las, não consegue concluir a solicitação git pull
.
No Ubuntu 16.04, o usuário www-data
recebe o diretório inicial /var/www
. Este é o diretório no qual git
procura as chaves ssh para negociar a transferência. Assim, a solução é fazer o GitHub acreditar que o usuário www-data
é real, atribuindo a ele um conjunto válido de chaves. Para detalhar as etapas:
Note: This assumes that you have
sudo
access.
-
Crie um diretório
/var/www/.ssh
de propriedade dewww-data:www-data
$ sudo mkdir -p /var/www/.ssh $ sudo chown -R www-data:www-data /var/www/.ssh
-
Crie chaves ssh no diretório
$ cd /var/www/.ssh $ sudo ssh-keygen -t rsa -b 2048
Quando
ssh-keygen
solicita que o diretório coloque as chaves, escolha/var/www/id_rsa
-
Assegure-se de que as permissões e a propriedade das chaves estejam corretas.
chown
towww-data:www-data
conforme necessário.$ ls -la /var/www/.ssh/ total 24K drwxr-xr-x 2 www-data www-data 4.0K Apr 29 23:58 ./ drwxr-xr-x 5 root root 4.0K Apr 30 00:06 ../ -rw------- 1 www-data www-data 1.7K Apr 29 23:33 id_rsa -rw-r--r-- 1 www-data www-data 394 Apr 29 23:33 id_rsa.pub
-
Copie a chave
id_rsa.pub
para as chaves ssh autorizadas nas configurações do repositório do GitHub. -
É importante garantir que
git pull
funcione quando executado como o usuáriowww-data
. O uso do ssh também precisa incluir a identidade do servidor do GitHub no arquivoknown_hosts
. No entanto, o usuáriowww-data
não possui um shell de login por padrão. Então temos que usar um truque simples:$ sudo vi /etc/passwd
Encontre a linha para
www-data
e altere a/usr/sbin/nologin
para/bin/bash
e salve o arquivo. A entrada parawww-data
deve ser semelhante a:www-data:x:33:33:www-data:/var/www:/bin/bash
-
Altere para o usuário
www-data
$ sudo su # su - www-data
-
Uma vez que você está logado como
www-data
, vá para o repositório git e execute umgit pull
manualmente. -
O processo ssh solicitará que você adicione a identidade do servidor GitHub ao arquivo
known_hosts
e use o par de chaves em/var/www/.ssh
para concluir ogit pull
. -
Se for bem sucedido, você deve estar definido. Tente
push
um commit para o GitHub de outro computador e verifique se o script PHP executa a solicitaçãopull
. -
Redefina o arquivo
/etc/passwd
para seu estado original com o shell de login do usuáriowww-data
como/usr/sbin/nologin