2011-07-14 25 views
31

我有2個需要2個不同SSH密鑰的Git服務器。GIT選擇要使用的私鑰

git clone [email protected]:blahblahblah使用~/.ssh/id_rsa,但我需要指定使用哪個密鑰,具體取決於我連接的服務器。

什麼Git命令行參數做這項工作? (我正在運行Linux)

+1

此問題在http://superuser.com/questions/232373/tell-git-which-private-key-to-use上回答。 –

+0

[指定不使用〜/ .ssh/config的git push的SSH密鑰](http:// stackoverflow。com/questions/7927750/specify-an-ssh-key-for-git-push-without-using-ssh-config) –

+0

[指定在使用或不使用Ruby時執行shell命令時使用的私有SSH密鑰? (http://stackoverflow.com/questions/4565700/specify-private-ssh-key-to-use-when-executing-shell-command-with-or-without-ruby) – Zaz

回答

16

如果通過SSH進行連接,則密鑰將由SSH參數控制,而不是由git參數控制。

SSH在~/.ssh/config文件中查找配置參數。修改該文件,並添加IdentityFile條目兩個混帳服務器這樣的:

Host server1.whatever.com 
    IdentityFile /path/to/key_1 
Host server2.whatever.com 
    IdentityFile /path/to/key_2 

This article有一些更多的細節。

+3

這並沒有回答這個問題。問題是,當ssh處理授權時,如何給git這個參數? – keks

+0

@Keks:你*不能*通過git命令行傳遞ssh參數。這個答案提供了一種解決方法。還有其他解決方法,例如https://git.wiki.kernel.org/index.php/GitTips#How_to_pass_ssh_options_in_git.3F。請注意,該方法也不使用命令行參數來修改ssh行爲。 –

+11

這是真的,但是你的原始答案沒有回答這個問題。你也可以使用'ssh-agent'並使用'ssh-add',然後使用git。當git通過ssh連接時,密鑰已經啓用。你看,有幾種方式,你的原始答案只是沒有什麼幫助。 – keks

14

使用ssh-add path-to-private-key它開箱即用。

19

一般來說,你想使用~/.ssh/config這個。只要配對服務器地址與您要使用他們如下鍵值:

Host github.com 
    IdentityFile ~/.ssh/id_rsa.github 
Host heroku.com 
    IdentityFile ~/.ssh/id_rsa.heroku 
Host * 
    IdentityFile ~/.ssh/id_rsa 

Host *表示任何服務器,所以我用它來設置~/.ssh/id_rsa爲使用默認密鑰。

+3

如果您在一臺服務器(如GitHub)上有多個帳戶,並且您希望爲每個服務器另設一個私鑰,則此想法不起作用。 – Flimm

+0

對於一個服務器上的多個帳戶看到這個答案http://stackoverflow.com/questions/3225862/multiple-github-accounts-ssh-config – lexicalscope

10

還有另一種可能性。這是爲了設定core.sshCommand,例如

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" 

有一個特殊的情況時,這個策略是非常有用的:那就是當你在Github上多個賬戶,所有賬戶ssh到Github上爲[email protected]和它使用的ssh鍵來確定你是哪個Github上的用戶。在這種情況下,.ssh/configssh-agent都不會做你想要的。

+0

這應該是選定的答案。所需的配置在存儲庫中很好地本地化,需要使用不同的ssh密鑰訪問不同的git服務器。無需修改〜/ .ssh/config(甚至在GitHub上有多個帳戶的情況下甚至可以/ etc/hosts)。 –

+0

但是,有一個問題:在配置它之前,您無法克隆回購,爲了配置它,您需要首先克隆它。或者,您可以'git init'回購,在本地配置它以使用正確的ssh命令,然後添加一個遠程(3步,相比之下,只有1個使用「git clone」)。 –

+1

爲了克隆回購,我通過設置GIT_SSH_COMMAND環境變量來使用@Guss的解決方案。但在正常使用中,我更喜歡我的解決方案,因爲它避免了每次啓動新外殼時都必須重新導出該變量。 –

10

在我的方案中,類似於@Richard Smith方案(其解決方案BTW不適用於我),我需要爲不同存儲庫下的同一服務器使用不同的密鑰。

對我來說,解決方法是正確設置會話使用環境變量GIT_SSH_COMMAND,就像這樣:

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy" 

更新

的另一件事,這裏要注意的是,設置環境變量正確地可以是一個喧囂,所以我使用了諸如Liquid Prompt of Fish Shell之類的命令提示符修改工具來掛鉤到shell並根據當前目錄和一些規則不斷更新環境變量。例如,我所有使用Gitlab個人SSH密鑰的個人項目都在~/Documents/Projects/personal之下,所以當shell鉤子運行pwd並發現當前目錄位於該路徑下時,它會根據需要自動設置GIT_SSH_COMMAND變量。