是否必須每次添加ssh-add

首先我得說和 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

Mac Keychain Access

如何使用多個 ssh 祕鑰並對應不一樣的應用程序?

這個問題也是我沒有徹底吃透的,按照某些資料描述,作了以上的工做以後,應用程序應該可以自動匹配適用的 ssh 祕鑰了。可是在我學習的過程當中也遇到過非得手動指定的狀況(那個時候我還不瞭解 Keychain 的做用,都是手動去 ssh-add 的),因而另一種機制能夠幫你解決這個問題,即 ssh configssh

一言蔽之,ssh config 就是一個配置文件,描述不一樣的祕鑰對應的設置——包括主機名、用戶名、訪問策略等等。 工具

如下我截取了本地配置的兩個片斷:

ssh config 1

ssh config 2

這兩段配置分別對應 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 爲例了。瞭解了這些概念,相信你能夠本身查獲得具體的方法。

相關文章
相關標籤/搜索