2016年3月7日 星期一

如何用config管理多個網站的ssh key和如何不用每一組輸入ssh的Pass Phrase

在上一篇(何謂ssh,在Windows下如何使用ssh,如何在Windows透過ssh下載和上傳程式到github)介紹完了如何用ssh來和github做push和pull,接下來的問題會是:那如果我有多個站台ssh要連到怎麼辦?舉例來說,假設我的bitbucket也要用ssh聯繫,要怎麼做?

另外一個問題是,每一次用ssh連線都要輸入pass phrase,上篇有介紹了ssh-agent來設定。在這篇將會在延伸ssh-agent的介紹,包括如何新增和刪除key的pass phrase,方便管理多個ssh key的pass phrase。

這篇會假設已經有用上篇的方式建立了一個ssh key給github用,而這篇將會在建立一個ssh key給bitbucket用。

建立另外一個ssh key

在建立bitbucket用的ssh key之前,先來看一下ssh key的檔名的一些命名規則。

通常ssh key的檔名前面的部分會是:id_rsa,而在點的後面則會是這個ssh key的用途。因此,假設今天我要建立的ssh key是給bitbucket用的,我的檔名會變成: id_rsa.bitbucket

有了這個概念之後,可以用下列指令來建立bitbucket要用的ssh key:

ssh-keygen -f id_rsa.bitbucket -C "alan@alantsai.net"

將會產生以下的兩個檔案:

  1. id_rsa.bitbucket
  2. id_rsa.bitbucket.pub

這個時候在%userprofile%\.ssh的下面應該就會有兩組key,一組是id_rsa(github用的),一組是id_rsa.bitbucket(bitbucket用的)。

下一步就是把產生的id_rsa.bitbucket.pub的key加入到bitbucket裏面的允許的ssh key裏面。

config檔案的使用

當ssh key越來越多,如何控制那裡要用那個key就是config在做的設定,接下來將會介紹如何使用config來方便做ssh連線。

Config檔案的概念

有了兩組key之後,我們會需要有一個東西告訴ssh,當我去github我要用id_rsa,當我去bitbucket,我要用id_rsa.bitbucket。而這個檔案,就是所謂的config檔案。

config檔案裡面有個重要概念就是hostname - 使用連線到不同hostname的時候來切換使用的ssh key而config就在設定這件事情。

config檔案的每一個hostname其中幾個重要格式如下:
Host alias
HostNamehostname
IdentityFile ~/.ssh/identity

紅字是每一個可以設定的地方:

  1. alias - 這個和用ssh clone 使用的url有關係,等一下在加深說明
  2. hostname - 這個指的是我們連線過去服務的hostname。以我們例子來說,就會有github.com或者是bitbucket.org
  3. identity - 這個指的就是在這個hostname的情況下要用那個private key

請注意config檔案本身的格式

由於ssh屬於linux類型的工具,因此在檔案格式和line ending上面和windows不同,因此要注意:

  1. 檔案的encoding要用ANSI或者要是utf-8不要有bom
  2. 檔案的Line ending要用UNIX格式
其中目前檔案的encoding和line ending在notepad++可以在右下角看到:

如果自己建立的檔案設定完了還是不成功,那麼建議直接到ssh.exe的global config檔案,路徑(%programfiles%\Git\etc\ssh\ssh_config)去copy過來用,格式和line ending就都okay。

config檔案的建立

上面了解格式之後,config檔案的設定會如下:

# GitHub user
Host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa
 
# Bitbucket
Host bitbucket.org
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa.bitbucket

config的alias作用

在接下去測試之前,這邊先提一個很重要的config概念,就是alias的值。alias可以讓我們的git網址變得更加好記。

預設網址 使用alias的網址
git@bitbucket.org:<accountname>/<reponame>.git git@alias:<accountname>/<reponame>.git

所以,alias會對到config裏面的alias,然後用alias的hostname來作為實際連線的host。所以假設今天有個config是:

# Bitbucket
Host personal
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa.bitbucket

那麼,clone的網址可以變成是:git@personal:<accountname>/<reponame>.git

ssh passphrase管理

在之前那篇有介紹了如何透過ssh-add -l的 參數來看那些passphrase有記錄管理,然後可以透過 ssh-add {key path} 來加入某個key的passphrase,在這邊在介紹最後一個參數 ssh-add -D能夠把目前有管理的都刪除。

這邊的刪除指的只是把ssh-agent對key的passphrase的記錄刪除 - 而不是真的把key刪除,因此不用擔心,要重新加回來只要在呼叫ssh-add {key path}就可以。

ssh-add指令總結

指令 作用
ssh-add -l 列出目前ssh agent有在管控的key passphrase
ssh-add {key path} 加入某一個key的passphrase
ssh-add -D 把所有目前ssh agent管控的key passphrase都清掉 - 如果要重新加入在用 ssh-add {key path}

測試config檔案的設定

當bitbucket和github使用的ssh key在config設定好了之後,並且key的passphrase都透過ssh-add給ssh-agent管控了之後,會需要測試是否有問題。

這個時候就可以用:

  • ssh -T git@github.com - 測試github的連線
  • ssh -T git@bitbucket.org - 測試bitbucket的連線

結語

希望透過上篇和這篇的ssh介紹,能夠讓沒有用過ssh的Windows使用者在使用git和repository溝通的時候花的的時間更少,讓大家可以更專注在程式開發上面。

其他資料

  1. 何謂ssh,在Windows下如何使用ssh,如何在Windows透過ssh下載和上傳程式到github
  2. Configure multiple SSH identities for GitBash, Mac OSX, & Linux - 介紹config裏面的多個alias設定
  3. Set up SSH for Git - 介紹使用ssh

沒有留言 :

張貼留言