2010-03-10 107 views
624

我想使用多個私鑰來連接到不同的服務器或同一服務器的不同部分(我的用途是服務器的系統管理,Git的管理和普通的Git使用在同一臺服務器內)。我試圖簡單地堆疊id_rsa文件中的密鑰無濟於事。在一個客戶端上使用多個SSH私鑰的最佳方法

顯然,一個簡單的方法做,這是使用命令

ssh -i <key location> [email protected] 

也就是說相當繁瑣。

有關如何去做這個更容易一點的任何建議?

回答

897

從我.ssh/config

Host myshortname realname.example.com 
    HostName realname.example.com 
    IdentityFile ~/.ssh/realname_rsa # private key for realname 
    User remoteusername 

Host myother realname2.example.org 
    HostName realname2.example.org 
    IdentityFile ~/.ssh/realname2_rsa 
    User remoteusername 

等。

ssh -i ~/.ssh/xxx_id_rsa [email protected] 

如果你有誤差有時更改文件的安全性有任何問題,可以幫助:

chmod 0600 ~/.ssh/xxx_id_rsa 
+21

謝謝Randal!我做了一些挖掘.ssh/config,並發現這一點:http://github.com/guides/multiple-github-accounts指出我在正確的方向。 – Justin 2010-03-10 19:30:43

+5

這是一個很好的幫助(除了http://stackoverflow.com/a/3828682/169153)。如果你想使用膩子鍵請按照這裏文檔:http://blog.padraigkitterick.com/2007/09/16/using-putty-ssh-keys-with-openssh-on-ubuntu – Urda 2012-03-14 23:14:32

+1

我覺得這個帖子非常有幫助。我在創建配置文件時犯的一個錯誤是我在.txt文件中。ssh文件夾而不是運行「touch」命令來創建配置文件。 – 2012-12-22 18:17:49

10

使用ssh-agent作爲密鑰。

82
foo:~$ssh-add ~/.ssh/xxx_id_rsa 

與添加之前,請務必測試我一路。 我在服務器上有一個不同的用戶名,所以我不得不把用戶關鍵字添加到我的文件:

Host   friendly-name 
HostName  long.and.cumbersome.server.name 
IdentityFile ~/.ssh/private_ssh_file 
User   username-on-remote-machine 

現在你可以使用友好名稱連接:

ssh friendly-name 

更多的關鍵字可以在OpenSSH man page找到。 注意:某些列出的關鍵字可能已經存在於您的/etc/ssh/ssh_config文件中。

+3

在我看來,這是最簡潔優雅的解決方案。像魅力一樣工作! – artur 2010-10-01 01:17:36

+3

這個工程很好,直到你在Mac OS X上重新啓動你的機器。 – Bobo 2011-11-21 19:04:41

+0

@Bobo你可以把它放在你的bashrc或者bash_profile(或者其他的mac等價物)中嗎? – T0xicCode 2013-03-13 16:48:37

214
+0

如果我沒有誤用用戶,你通常直接在URL中指定與用戶@主機 – a1an 2013-06-18 11:07:08

+3

連接時,我更喜歡使用'端口'關鍵字。另一個有趣的關鍵字是'StrictHostKeyChecking'。 – Ethan 2013-09-24 23:00:39

20

我同意Tuomas關於使用ssh-agent。我也想添加第二個私人鑰匙工作,this tutorial對我來說就像一個魅力。

步驟如下:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/keyssh-add ~/.ssh/id_rsa
  3. 通過$ ssh-add -l
  4. 測試它驗證與$ssh -v <host url>例如ssh -v [email protected]
+2

多年來一直使用'ssh-agent',我最近轉而在我的'i3' wm中使用了Gnome的'gnome-keyring'。原因很簡單:Gnome的Keyring管理器自動處理添加和刪除ssh密鑰,而不必記住'ssh-add'。此外,還提供一個密碼來解鎖它們(並在特定時間超時,以確保安全)。給他自己的。由於我在Arch上使用了gnome設置,因此我的設置一直在播放。如果您是反侏儒,請忽略此評論。 – eduncan911 2015-05-26 17:01:00

+0

@CagatayUlubay非常感謝您的評論。它帶來了我的臉上的微笑:) – 2016-07-13 16:21:54

128

您可以指示ssh來嘗試多鍵入su連接時連接。方法如下:

$ cat ~/.ssh/config 
IdentityFile ~/.ssh/id_rsa 
IdentityFile ~/.ssh/id_rsa_old 
IdentityFile ~/.ssh/id_ed25519 
# ... and so on 

$ ssh server.example.com -v 
.... 
debug1: Next authentication method: publickey 
debug1: Trying private key: /home/example/.ssh/id_rsa 
debug1: read PEM private key done: type RSA 
debug1: Authentications that can continue: publickey 
debug1: Trying private key: /home/example/.ssh/id_rsa_old 
debug1: read PEM private key done: type RSA 
.... 
[server ~]$ 

這樣你就不必指定哪個鍵與哪個服務器一起工作。它只會使用第一個工作密鑰。

另外,如果給定的服務器願意接受密鑰,則只會輸入密碼。如上所示,ssh並沒有試圖要求密碼.ssh/id_rsa,即使它有一個。

當然,它並不像其他答案中那樣每個服務器都配置一個配置,但至少您不必爲所有連接的服務器添加配置!

+0

非常簡單,工作。 +1 – ddtpoison777 2016-07-12 11:50:14

+4

這是一個針對所提問題的絕佳解決方案,但並未完全滿足提問者的需求。對我而言,這是完全正確的解決方案,它完美地滿足了「在一個客戶端上使用多個SSH私鑰的最佳方式」的需求。 – Wade 2016-08-08 17:28:15

+2

這應該是一個被接受的答案。 – sanmai 2016-12-13 01:43:00

1

您可以在~/.ssh文件夾中創建一個名爲config的配置文件。它可以包含:

Host aws 
    HostName *yourip* 
    User *youruser* 
    IdentityFile *idFile* 

這將允許您連接到機器這樣

ssh aws 
23

以前的答案已經正確解釋創建一個配置文件來管理多個SSH密鑰的方式。我認爲,還需要解釋的重要事情是在克隆存儲庫時用別名替換主機名。

假設您的公司的GitHub帳戶的用戶名是abc1234。 而假設你GitHub的個人帳戶的用戶名是jack1234

而且,假設你已經創建了兩個RSA密鑰,即id_rsa_companyid_rsa_personal。所以,你的配置文件看起來象下面這樣:

# Company account 
Host company 
HostName github.com 
PreferredAuthentications publickey 
IdentityFile ~/.ssh/id_rsa_company 

# Personal account 
Host personal 
HostName github.com 
PreferredAuthentications publickey 
IdentityFile ~/.ssh/id_rsa_personal 

現在,當你克隆從公司GitHub的帳戶(名爲演示),庫網址將是這樣的:

Repo URL: [email protected]:abc1234/demo.git 

現在,一邊做git clone,您應該修改上面的存儲庫URL爲:

[email protected]:abc1234/demo.git 

請注意,現在如何將github.com替換爲我們在配置文件中定義的別名「company」。

同理,您必須根據配置文件中提供的別名修改個人帳戶中存儲庫的克隆URL。

6

我曾經遇到過這個問題,當時我有兩個Bitbucket帳戶,並且想要爲兩者存儲單獨的SSH密鑰。這對我來說很有用。

我創建了兩個單獨的ssh配置,如下所示。

Host personal.bitbucket.org 
    HostName bitbucket.org 
    User git 
    IdentityFile /Users/username/.ssh/personal 
Host work.bitbucket.org 
    HostName bitbucket.org 
    User git 
    IdentityFile /Users/username/.ssh/work 

現在,當我不得不從我的工作帳戶克隆存儲庫 - 命令如下。

git clone [email protected]:teamname/project.git 

我不得不修改此命令:

git clone [email protected]**work**.bitbucket.org:teamname/project.git 

同樣從我的個人賬戶克隆命令不得不進行修改,以

混帳混帳克隆@個人 .bitbucket .org:name/personalproject.git

有關更多信息,請參閱this link

12
  1. 生成SSH密鑰:

    $ ssh-keygen -t rsa -C <[email protected]> 
    
  2. 生成another SSH key

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <[email protected]> 
    

    現在,兩個公共密鑰(id_rsa.pubaccountB.pub)應該是存在的在~/.ssh/目錄中。

    $ ls -l ~/.ssh  # see the files of '~/.ssh/' directory 
    
  3. 使用以下內容創建配置文件~/.ssh/config

    $ nano ~/.ssh/config 
    
    Host bitbucket.org 
        User git 
        Hostname bitbucket.org 
        PreferredAuthentications publickey 
        IdentityFile ~/.ssh/id_rsa 
    
    Host bitbucket-accountB 
        User git 
        Hostname bitbucket.org 
        PreferredAuthentications publickey 
        IdentitiesOnly yes 
        IdentityFile ~/.ssh/accountB 
    
  4. 克隆從default賬戶。

    $ git clone [email protected]:username/project.git 
    
  5. accountB帳戶克隆。

    $ git clone [email protected]:username/project.git 
    

See More Here

+1

這個答案對於這個用例非常有用和簡單。也爲Gitlab驗證! – smonff 2017-10-09 10:57:30

0

在CentOS 6.5運行OpenSSH_5.3p1,OpenSSL的1.0.1e-FIPS,我重新命名我的密鑰文件,使他們都沒有默認名稱解決了這個問題。我的.ssh目錄包含id_rsa_foo和id_rsa_bar但沒有id_rsa等

+0

鑰匙如何使用?有沒有自動檢測功能? – robsch 2017-05-22 06:44:28

+0

查看Randal Schwartz的答案,爲給定主機選擇正確的密鑰的方法https://stackoverflow.com/questions/2419566/best-way-to-use-multiple-ssh-private-keys-on-one-client/2419609#2419609 – 2017-05-23 16:35:52

0

重要信息:必須啓動的ssh-agent

使用SSH-之前啓動的ssh-agent(如果它尚未運行)添加如下:

eval `ssh-agent -s` # start the agent 

ssh-add id_rsa_2 # where id_rsa_2 is your new private key file 

請注意,eval命令在Windows上啓動GIT bash上的代理。其他環境可能使用變體來啓動SSH代理。

相關問題