2015-08-20 40 views
5

OS - Ubuntu 14.04Esecuzione di comandi git via php su http

Sto lavorando alla distribuzione utilizzando GIT webhook per esso.

Ho aggiunto le chiavi di implementazione a git repo e ora voglio attivare il comando git pull origin master quando un push avviene dal mio repository locale.

Questo è il file test.php io chiamo via browser:

<?php  
    //echo "THis is a test file on a test repo for testing the deploy functionality using github webhooks!!!!"; 
    echo exec('whoami'); 
    echo exec('sh -x /var/www/proj/test/git.sh'); 
?> 

Questo è il file git.sh shell:

#!/bin/bash 
cd /var/www/proj-dir/test 
git pull origin master 

Quando ho eseguito questo sul terminale utilizzando php test.php ottengo il risultato corretto come previsto :

ubuntu From github.com:repo/test 
* branch   master  -> FETCH_HEAD 
Already up-to-date. 

ubuntu per whoami seguito dall'uscita git pull.

Ora qui è il problema quando chiamo la stessa http://example.com/test.php tramite il browser mostra all'utente o whoami uscita come www-data, che è utente apache, ma ho provato ad aggiornare i permessi del file php per eseguire e cambiando l'utente a www-data ma non ha funzionato.
controllato i log di Apache e quando eseguo attraverso il browser ottengo un errore di autorizzazione

Please make sure you have the correct access rights and the repository exists. + cd /var/www/proj/deploy-test + git pull origin master 

Host verifica della chiave non è riuscita. fatale: impossibile leggere dal repository remoto. Assicurati di disporre dei diritti di accesso corretti e del repository esistente.

Quali aggiornamenti devo fare per far funzionare il file tramite richiesta del browser?

Se devo aggiornare il file sudoers quali dovrebbero essere gli aggiornamenti?

Aggiornamento
ho aggiunto le chiavi .ssh al var/www/ dir come quella è la sede per l'utente apache. Ma ottengo ancora il

git pull origin master 
error: cannot open .git/FETCH_HEAD: Permission denied 

Inoltre ho aggiunto una riga per l'utente www-data per poter eseguire il file sh.

www-data ALL=(anthony) NOPASSWD: /var/www/mysite/vendor/tmd/auto-git-pull/scripts/git-pull.sh 

riferimento here Ancora nessuna fortuna
Aggiornato le autorizzazioni per la cartella .git per l'utente www-data

sudo chown www-data:www-data /var/www/proj/test/.git

+0

È necessario assicurarsi che sia l'utente corretto che richiede il pull. Quale utente ha i diritti di pull dal repo? Sembra che tu debba essere ubuntu. – nicoX

+0

sì 'ubuntu', ma credo che quando si accede a' http' l'utente apache che è 'www-data' deve avere il permesso di eseguire lo script.Dopo aver esaminato molti post ho appreso che probabilmente devo aggiornare il file sudoers per www-data per avere le autorizzazioni corrette. PLease corect se la mia direzione è sbagliata – KillABug

+0

Non potresti semplicemente chmod lo script in modo che group/other abbia i diritti di esecuzione. E sembra che il tuo script sia stato eseguito. – nicoX

risposta

0

Questo non sembra essere un problema di PHP, ma un problema di git config. Git è configurato correttamente per l'utente ubuntu e non per l'utente www-data.

Si può provare a far funzionare PHP come ubuntu, ma ciò non sembra il più semplice né il più corretto. Suggerirei di configurare git correttamente per l'utente www-data.

ho il sospetto è possibile riprodurre il problema eseguendo sul terminale:

# become www-data user 
sudo su www-data 
# actions from your git.sh file 
cd /var/www/proj-dir/test 
git pull origin master 

Dopo aver verificato che non effettivamente avere uno scenario di riproduzione si può provare a risolvere il problema per l'utente www-data.

È possibile che vi sia una differenza tra l'output di git config --list quando viene eseguito come utente. Per ulteriori informazioni su questo punteggio vedere https://git-scm.com/book/en/Getting-Started-First-Time-Git-Setup

Potrebbe anche essere che le differenze di permesso/proprietà dei file stanno causando problemi. Per escludere, ti suggerisco di utilizzare git clone ... come utente www-data per creare un nuovo clone e una copia funzionante in qualche altro percorso nel tuo filesystem. Quindi vedere di nuovo se il git pull ora funziona come previsto.

Si può considerare di dare lo stesso www-data alla propria copia di lavoro (indipendentemente dai problemi di autorizzazione). Ciò impedirebbe anche di dover gestire possibili modifiche non eseguite nella copia di lavoro che determinano problemi di unione. Gestire questi automaticamente/automatica da PHP/git.sh potrebbe essere ingombrante.

Il flusso di lavoro proposto sarebbe allora: si sviluppano come ubuntu nella directory di lavoro corrente e add/commit/push le modifiche. Quindi fai fare a PHP il pull come se stesso (come www-data).