首先我得說和 ssh 相關的一切機制的確比較複雜,很容易讓人暈頭轉向,若是你想完全掌握這個知識體系就必須系統的學習一下相關的知識。因此 first thing first,我推薦一本書給你,不妨抽時間把它一勞永逸了: git
SSH, The Secure Shell,這本書的初版有中文的。 github
接着說你的這個特定的問題。 shell
你首先得了解一件事:ssh-add 這個命令不是用來永久性的記住你所使用的私鑰的。實際上,它的做用只是把你指定的私鑰添加到 ssh-agent 所管理的一個 session 當中。而 ssh-agent 是一個用於存儲私鑰的臨時性的 session 服務,也就是說當你重啓以後,ssh-agent 服務也就重置了。 安全
若是是爲了永久記住對應的私鑰是哪一個,咱們不能依賴 ssh-agent 服務。能依賴什麼則取決於如下哪些方案適合你的使用場景。 ruby
你沒有在問題裏描述你所使用的操做系統,因此我以我平常使用的 Mac OS X 爲例。Mac 系統內置了一個Keychain 的服務及其管理程序,能夠方便的幫你管理各類祕鑰,其中包括 ssh 祕鑰。ssh-add 默認將制定的祕鑰添加在當前運行的 ssh-agent 服務中,可是你能夠改變這個默認行爲讓它添加到 keychain 服務中,讓 Mac 來幫你記住、管理並保障這些祕鑰的安全性。 bash
你所要作的就是執行下面的命令: session
$ ssh-add -K [path/to/your/ssh-key]
以後,其餘的程序請求 ssh 祕鑰的時候,會經過 Keychain 服務來請求。下面的截圖裏你能夠看到我當前的機器上 Keychain 爲我管理的有關 ssh 的祕鑰,這其中包括我本身生成的四個,以及 Github Client App 本身使用的一個——前者幾個都是供 ssh 相關的命令所使用,然後者則指明瞭僅供 Github.app 這個應用程序使用。 另外,它們都是 login keychains 也就是隻有當前用戶登陸以後纔會生效的,換了用戶或是未登陸狀態是不能使用的,這就是 Keychain 服務所幫你作的事情。 app
這個問題也是我沒有徹底吃透的,按照某些資料描述,作了以上的工做以後,應用程序應該可以自動匹配適用的 ssh 祕鑰了。可是在我學習的過程當中也遇到過非得手動指定的狀況(那個時候我還不瞭解 Keychain 的做用,都是手動去 ssh-add 的),因而另一種機制能夠幫你解決這個問題,即 ssh config。 ssh
一言蔽之,ssh config 就是一個配置文件,描述不一樣的祕鑰對應的設置——包括主機名、用戶名、訪問策略等等。 工具
如下我截取了本地配置的兩個片斷:
這兩段配置分別對應 Github 和 Coding 這兩個服務所使用的祕鑰。第一行的 Host 只是一個名字,第三行的Hostname 纔是對應的真實地址,可是二者最好保持一致,這樣不用在腦殼裏轉換。
用這樣的配置,當我 git clone https://github.com/user/repo 的時候,id_rsa 祕鑰會被使用,當我git clone https://coding.net/user/repo 的時候,很顯然 nightire 祕鑰會被使用。
固然,此配置不侷限於 Git,全部底層使用 SSH 的應用和命令都會遵守配置文件的指示來找到對應的私鑰。
回到本節開始的話題,我相信有了 Keychain 作管理應該是不須要這個配置文件的,可是我尚未機會去作測試。目前的環境一切正常,等到我換新機器從新配置環境的時候我會試一試看。
關於 Host 和 Hostname 的對應關係,若是 Hostname 是域名則最好保持一致。可是這裏有兩個訣竅:
1. 若是同一域名下有兩個不一樣的配置怎麼辦?
以 Github 爲例,若是我有兩個帳戶,一個我的的,一個組織的,而且要使用不一樣的祕鑰,那麼我能夠這麼寫:
這裏 Host 後面對應的是 Github 的兩個用戶名,也就是 github.com/nightire 和 github.com/very-geek
2. 若是域名是數字 IP,是否能夠簡化呢?
Host 能夠幫助你把對應的 IP 變成好記的名字。好比說我在公司內部配置了 Git Server(基於 gitolite 或 Gitlab 或任何工具),正常的訪問地址是:git://xxx.xxx.xxx.xxx:repo.git,以下的配置則能夠幫你把它簡化成:git.visionet:repo.git
很是有用。
有。若是 ssh-add 已經能夠知足你的要求(除了啓動之後還要再來一遍之外),那麼你徹底能夠用腳本自動化這件事。簡單地把你輸入的 ssh-add 命令的內容寫進 .bashrc 或 .bash_profile(或其餘任何你使用的 shell 環境配置文件)中去,這樣只要你打開終端,就等於自動作了這件事情。
不過如我以前所說,這個機制是依賴 ssh-agent 服務的,而且只能在終端下有效。而用 Keychain 機制的話,是整個系統內都有效的(包括不依賴終端的應用程序)而且無需開啓 ssh-agent 服務。
最後 Keychain 服務不是隻有 Mac 纔有的,我剛纔搜索了一下,Windows 和 各類 Linux 都有對應的機制,不過我沒用過,只能以 Mac 爲例了。瞭解了這些概念,相信你能夠本身查獲得具體的方法。