2013-10-16 22 views
7

ho creato uno script PHP di eseguire un pull GitHub:PHP Github errore di script Pull 'permesso negato (publickey)'

Questo è contenuta nella mia cartella Github /home/mysite/public_html/github

github_pull.php

<?php 
echo `git pull 2>&1`; 
?> 

il mio server non già la chiave pubblica SSH, come se mi esibisco git pull dal Terminal:

ssh [email protected] 
cd public_html/github 
git pull 

Questa opera con successo (tuttavia devo inserire la password per la chiave rsa prima)Aggiornamento: la password non è più necessaria (vedi commenti)

Tuttavia, quando corro github_pull.php ottengo il seguente errore: Autorizzazione negata (chiave pubblica). fatale: L'estremità remota riattaccato inaspettatamente

La chiave SSH è contenuto in /home/mysite/.ssh/id_rsa

Quando corro

<?php echo `whoami`; 

emette mysite

+0

L'utente che esegue lo script, in genere 'www_data' di Apache ha accesso alla chiave ssh? Si noti inoltre che l'utente sta probabilmente esaminando una posizione diversa per la chiave. – poke

+0

(1) il tuo server web è in esecuzione come utente o come 'www-data'? (2) la chiave SSH è leggibile per il server web? (3) il webserver cerca effettivamente quella chiave? (puoi sempre provare ad esportare GIT_SSH = "il tuo comando ssh" ') – Wrikken

+0

' tuttavia devo prima inserire la password per la chiave rsa', che significa nessuno-in modo interattivo la chiave non può essere usata. Cioè anche se la chiave è utilizzabile, non funzionerà. – AD7six

risposta

3

Come commentati, prima cerca un URL HTTPS:

ssh [email protected] 
cd public_html/github 
git remote set-url origin https://github.com/username/reponame 
git pull 

Questo io È molto più facile che armeggiare con i tasti ssh, specialmente quando sono protetti da passphrase.


Se must chiavi usare ssh, quindi è necessario conoscere la posizione predefinito della chiave è:

~/.ssh/id_rsa(.pub) 

Se l'utente che esegue lo script è 'mysite', allora cercherò ~mysite/.ssh/id_rsa.
E devi assicurarti che l'ssh-agent sia in esecuzione come utente mysite. Questo è il motivo per cui è più facile, in un primo momento, provarlo con una chiave privata non protetta passphrase.

Se la vostra chiave SSH dovesse essere da qualche altra parte, allora si avrebbe bisogno di un:

~mysite/.ssh/config 

In questo file di configurazione, come illustrated here, è possibile specificare la posizione e il nome della chiave che si desidera utilizzare.

+0

La prima soluzione funziona correttamente quando si esegue in un terminale (dopo aver immesso nome utente e parola d'ordine). Comunque lo script PHP ottengo questo errore: 'fatale: impossibile leggere il nome utente per 'https://github.com': Nessun dispositivo o indirizzo simile. Come posso dire allo script il nome utente e la password? – Tom

+0

@Tom per tirare, non hai bisogno di credenziali. Non è necessario un nome utente e una password (a meno che non si tratti di un repo privato. È un repo privato?). Altrimenti, memorizzeresti le credenziali in un file '~/.netrc': http://stackoverflow.com/a/11022181/6309 – VonC

+0

È un repository privato. Ho creato .netrc (/home/mysite/.netrc) e ho inserito i seguenti contenuti: 'machine mysite.com login password '. Sempre usando lo stesso PHP di cui sopra, sto ancora diventando fatale: non posso leggere l'errore Username. Ho provato anche "github.com". Eventuali suggerimenti? Grazie – Tom

2

Si dovrebbe prima provare a eseguire il debug utilizzando l'account "mysite" effettivo.

sudo -u mysite 
cd ~/public_html/github 
git pull 

Dal log degli errori, che sembra essere un problema a distanza, non locale. Significato SSH può effettivamente accedere alla tua chiave privata.

Sospetto che Github riceva la chiave privata personale (tramite ssh-agent) e non la chiave pubblica "mysite". Puoi convalidarlo eseguendo ssh-add -l all'interno del tuo codice php, oppure con sudo -u mysite; ssh-add -l e confrontando ciò che è registrato nell'interfaccia di github.

Github ha coperto questo problema ampiamente: https://help.github.com/articles/error-permission-denied-publickey

2

Aggiungere la seguente al .ssh/config

Host github_server 
    HostName github.com 
    User git 
    IdentityFile /path/to/your/private_key 

Modifica il tuo .git/config e aggiornare l'URL repo remoto dal

url = [email protected]:git_repo_name.git 

a

url = [email protected]_server:git_repo_name.git 

Questo dovrebbe aiutare ad accedere al server usando la chiave data. Sostituire il percorso della chiave in sopra per il percorso completo effettivo sulla macchina. Sostituire il nome del repository con il nome del repository effettivo. Si noti che l'utente "mysite" ha accesso al file chiave. Puoi testarlo usando fopen da PHP e confermare.

Problemi correlati