Executando git pull de um script php

5

Eu estava tentando o Fluxo de trabalho perfeito, com Git, GitHub e SSH , mas parece que não consigo executar git pull . Eu tentei git status e tudo bem.

Quando eu git pull 2>&1 i obtenho:

error: cannot open .git/FETCH_HEAD: Permission denied

Eu tentei chmod .git dir para 777 sem sorte.

Quando eu executo whoami do navegador, ele me mostra: apache

--- EDIT ---

Acabei de chown apache:apache -R .git e agora recebo:

Could not create directory '/.ssh'. Host key verification failed. fatal: The remote end hung up unexpectedly

    
por AFRC 21.02.2012 / 00:06

5 respostas

5

Could not create directory '/.ssh'. Host key verification failed. fatal: The remote end hung up unexpectedly

Leia e considere sua mensagem de erro. As chaves do host são armazenadas no arquivo ~ / .ssh / known_hosts. Seu usuário do Apache tem "/" como seu diretório inicial e definitivamente não tem e não deve ter acesso de gravação à raiz.

Sugiro que você crie uma conta de usuário para isso ... talvez gitpull-user ou algo assim. Certifique-se de que ele tenha um diretório inicial utilizável, mesmo que seja algo atípico. Entre como aquele usuário e crie um script de shell que realiza o que você está tentando fazer como aquele usuário. Claro, você também terá que copiar sua chave id_rsa apropriada para a conta do usuário, etc.

Configure o sudo para iniciar o script adicionando esta linha ao / etc / sudoers

apache ALL = (gitpull-user) NOPASSWD: /path/to/script.sh'

e também se você tiver problemas "Sem TTY":

Defaults:apache !requiretty

Altere seu script PHP para chamar sudo -u gitpull-user ./script.sh

Seria possível alterar o diretório pessoal do Apache para um local "real" e soltar a chave lá, mas isso exporia um risco em que seus dados teriam que ser de propriedade do apache e a chave poderia ser lida se o daemon foi comprometido. Estabelecer um segundo usuário fornece um nível de isolamento.

    
por 21.02.2012 / 04:44
0

Executar:

sudo -u apache ssh YOURGITHOST

Basicamente, o usuário do apache não sabe o que é a chave do host SSH dos servidores remotos e não pode solicitar que você a aceite. Há outras maneiras de fazer isso, mas essa é a que mais me lembro.

    
por 21.02.2012 / 03:25
0

Você parece ter dois problemas estreitamente relacionados:

  1. O usuário apache está executando como não é possível gravar no local normal para seu diretório ~/.ssh (porque no diretório inicial do CentOS Apache está / , e obviamente nós não queremos que o servidor web apenas coloque coisas onde quer que seja no sistema de arquivos).

  2. O Github deseja que uma chave pública autentique você.

Há uma correção que deve ser capaz de lidar com ambos os casos: git usa a variável de ambiente GIT_SSH (se estiver definida) para determinar qual comando deve ser executado como "ssh", então você só precisa ajustar variável de ambiente para dizer ao SSH duas coisas: Onde procurar seu arquivo known_hosts e qual chave pública usar para autenticar.

Adicionar
export GIT_SSH="ssh -oUserKnownHostsFile=/some/path/to/known_hosts -i /some/path/to/private_key"
ao seu script e coisas devem funcionar bem (obviamente substitua um caminho pelo qual o Apache pode escrever para os caminhos simulados no meu exemplo).

Observe que você terá que se conectar ao host remoto uma vez como o usuário do Apache para criar e preencher o arquivo known_hosts . Você pode fazer isso executando o script a partir da linha de comando e lidando com o prompt interativo quando ele aparecer. Se você executar o script uma segunda vez, não deverá lidar com prompts interativos.

    
por 21.02.2012 / 16:44
0

Eu estava tentando extrair de um repositório GIT usando exec () em um script PHP de servidor web também. O repositório remoto foi verificado somente para leitura em um usuário diferente.

Meu principal problema era que ao executar o script PHP do servidor web as variáveis de resultado EXEC do PULL estavam completamente vazias - eu apenas poderia dizer que o PULL não aconteceu, nenhuma mensagem de erro adicional, nada. Uma simples 'ajuda do git' funcionou, no entanto.

O que resolveu o problema foi o seguinte:

Primeiro, faço o proprietário do servidor da web do diretório do repositório:

chown -R <webserveruser>:<webusergroup> <repodir>

Geralmente não consigo fazer login no usuário do servidor da Web, então eu atribuí um shell primeiro:

usermod -s /bin/bash <webserveruser>

Faça login como usuário do servidor da web:

su <webserveruser>

Em seguida, mude para o repositório e faça uma solicitação manual:

cd <repodir>
git pull

Saia do usuário do servidor web e volte para a raiz e desative o shell no usuário do servidor web novamente:

exit
usermod -s /bin/false <webserveruser>

Tão estranho quanto parece: depois disso, o PULL somente leitura usando o script do servidor da Web funcionou muito bem.

    
por 02.03.2012 / 13:22
0

Eu encontro a mesma pergunta como a sua. e eu tento fazer abaixo

  1. você deve saber o 'papel' do http execute. Assim como seu 'apache'
  2. crie sua chave ssh sudo -u apache ssh-keygen -t rsa e o caminho da chave será mostrado na tela cmd.
  3. vá para o caminho e cat id_rsa.pub , copie sua chave e poste no github ou gitlab
  4. finalmente, porque o seu servidor não conhece o host do servidor git. Então você deve fazer abaixo:
    sudo -u http ssh <git host> , git host talvez github.com ou gitlab.com
    Digite 'yes' depois de usar o cmd. E você encontrará o servidor criar um arquivo chamado 'known_hosts' em '.ssh /'
  5. Para testar seu exec do php ('git pull origin master'), tudo bem.

-

    
por 07.04.2016 / 10:24