在上一篇(何謂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"
將會產生以下的兩個檔案:
- id_rsa.bitbucket
- 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就在設定這件事情。
Host alias
HostName
hostname
IdentityFile ~/.ssh/identity
紅字是每一個可以設定的地方:
- alias - 這個和用ssh clone 使用的url有關係,等一下在加深說明
- hostname - 這個指的是我們連線過去服務的hostname。以我們例子來說,就會有github.com或者是bitbucket.org
- identity - 這個指的就是在這個hostname的情況下要用那個private key
請注意config檔案本身的格式
由於ssh屬於linux類型的工具,因此在檔案格式和line ending上面和windows不同,因此要注意:
- 檔案的encoding要用
ANSI
或者要是utf-8不要有bom - 檔案的Line ending要用UNIX格式
如果自己建立的檔案設定完了還是不成功,那麼建議直接到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溝通的時候花的的時間更少,讓大家可以更專注在程式開發上面。
其他資料
- 何謂ssh,在Windows下如何使用ssh,如何在Windows透過ssh下載和上傳程式到github
- Configure multiple SSH identities for GitBash, Mac OSX, & Linux - 介紹config裏面的多個alias設定
- Set up SSH for Git - 介紹使用ssh