2013-10-16 116 views
7

我已經成立了一個PHP腳本來執行的GitHub拉:PHP Github上拉腳本錯誤 '權限被拒絕(公鑰)'

這是包含在我的文件夾Github上/home/mysite/public_html/github

github_pull.php

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

我的服務器也已經有SSH公共密鑰,因爲如果我從終端1進行git pull

ssh [email protected] 
cd public_html/github 
git pull 

這個成功的作品(然而,我必須爲RSA密鑰先輸入密碼)更新:密碼不再需要(見註釋)

然而,當我運行github_pull.php我得到出現以下錯誤: 權限被拒絕(publickey)。致命:遠程端掛機意外

SSH密鑰被包含在/home/mysite/.ssh/id_rsa

當我運行

<?php echo `whoami`; 

它輸出mysite

+0

用戶執行腳本(通常是Apache的'www_data')是否可以訪問ssh密鑰?另請注意,用戶可能正在尋找密鑰的其他位置。 – poke

+0

(1)您的網絡服務器是以您的用戶身份運行還是以「www-data」方式運行? (2)是Web服務器可讀的SSH密鑰? (3)網絡服務器是否真的在尋找那個密鑰? (你總是可以試着'export GIT_SSH =「你的ssh命令」') – Wrikken

+0

'但是我必須首先輸入rsa密鑰的密碼,這意味着沒有任何交互式的密鑰不能被使用。即即使密鑰可用,它也不起作用。 – AD7six

回答

3

至於評論,先試的HTTPS URL:

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

This i比修改ssh密鑰要容易得多,特別是在密碼保護時。


如果必須使用SSH密鑰,那麼你必須知道密鑰的默認位置是:

~/.ssh/id_rsa(.pub) 

如果執行該腳本的用戶是「mysite」,那麼它會尋找~mysite/.ssh/id_rsa
而且您需要確保ssh-agent正在作爲mysite用戶運行。這就是爲什麼它首先嚐試使用私鑰而不是密碼保護。

如果你的SSH密鑰是在別處,那麼你就需要一個:

~mysite/.ssh/config 

在該配置文件,爲illustrated here,你可以指定你想要使用的鍵的位置和名稱。

+0

您的第一個解決方案在終端中運行時(在輸入用戶名和密碼之後密碼)。然而,PHP腳本我得到這個錯誤:'致命的:無法讀取'https://github.com'的用戶名:沒有這樣的設備或地址。我該如何告訴腳本用戶名和密碼? – Tom

+0

@Tom拉,你不需要憑證。你不需要用戶名和密碼(除非它是私人回購,是私人回購?)。否則,你會將所述憑證存儲在'〜/ .netrc'文件中:http://stackoverflow.com/a/11022181/6309 – VonC

+0

這是一個私人回購。我創建了.netrc(/home/mysite/.netrc)並在其中放入以下內容:'machine mysite.com login password '。仍然使用與上面相同的PHP,我仍然遇到致命錯誤:無法讀取用戶名錯誤。而且嘗試了「github.com」。有什麼建議麼?謝謝 – Tom

2

您應該首先嚐試使用實際的'mysite'帳戶進行調試。

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

從錯誤日誌中,它似乎是一個遠程問題,而不是本地。意思SSH實際上可以訪問你的私鑰。

我懷疑github收到你自己的個人私鑰(通過ssh-agent)而不是'mysite'公鑰。您可以通過在您的php代碼中運行ssh-add -l或與sudo -u mysite; ssh-add -l進行驗證,並與在github界面中註冊的內容進行比較。

Github上已經覆蓋了這個問題廣泛:https://help.github.com/articles/error-permission-denied-publickey

2

url = [email protected]:git_repo_name.git 
以下內容添加到您的.ssh/config中

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

編輯您的.git/config並更新遠程回購網址

url = [email protected]_server:git_repo_name.git 

這應該有助於您使用給定的密鑰登錄到服務器。將上述密鑰的路徑替換爲機器上完整的實際路徑。用實際的回購商品名稱替換回購商品名稱。請注意用戶'mysite'有權訪問密鑰文件。你可以使用PHP中的fopen來測試並確認。