首先這篇文章適用於Windows
和Linux
的配置,本人沒有條件去驗證Mac,所以不確定是否可以,不過和linux
一樣屬於Unix
系統,應該理論上都是可以的,如果有人實驗了可以給我個反饋。
這段時間在Ubuntu
上做開發,又一次發現命令是真好用,加上這段時間把服務器從Windows
遷到CentOS
,也漸漸習慣了Vim
。
之前一直在Winodws
下開發,開發中使用的版本管理工具是SVN
和Git
,不過都會使用Tortoise
類似的客戶端工具,對於git
多帳號的情況,它可以動態管理SSH-KEY
。不顧我在在Ubuntu
下開發時沒有發現這樣的工具,幾個IDE也需要配置SSH
,於是乾脆用命令了,在配置多個SSH-KEY
花了我一個多小時才搞定,中間也由於細節不熟悉浪費了點時間,現在僅僅做個記錄,如果能幫到其它遇到同樣問題的同學也就更棒了。
SSH之於Git的原理
Git
提交時有Https
和SSH
兩種驗證方式,Https
的方式需要帳號和密碼比較好理解,不過它需要在每次提交時輸入帳號和密碼,有點麻煩;而SSH的功能可以粗暴的理解爲記住帳號密碼,不過對這個過程有人會有點疑惑。首先,我們用SSH
命令生成一個公鑰-私鑰對,我們會把公鑰添加到Git
的服務器,把私鑰放在本地。提交文件的時候Git
服務器會用公鑰和客戶端提交私鑰做驗證(具體細節不究),如果驗證通過則提交成功,那麼我們在把公鑰添加到服務器的時候肯定是需要登錄Git
服務器的,這個過程其實可以理解爲帳號和密碼託管給SSH
了,所以也是相當於輸入了帳號密碼,但是由SSH
幫你記住了。這麼理解是可以,但是SSH
的意義不僅僅是這樣,關於SSH的更詳細內容看客可以自行再瞭解。
生成SSH-KEY
打開命令行、終端,用命令進入到你要保存SSH-KEY
文件的文件夾,我們先用命令測試下終端是否支持SSH
:
ssh -V
- 1
- 1
如果你的終端支持SSH,那麼你可能看到類似如下的版本信息:
OpenSSH_7.3p1, OpenSSL 1.0.2j 26 Sep 2016
- 1
- 1
測試時如果提示不識別SSH
命令,需要安裝SSH
。
Ubuntu
安裝SSH
:
sudo apt-get install openssh-client openssh-server
- 1
- 1
CentOS
安裝SSH
:
yum install openssh-client openssh-server
- 1
- 1
Windows
可以在當前文件夾右鍵,選擇Git Bash Here
,會自動在當前文件夾打開一個MINGW
的命令行窗體,它是自帶SSH
的。
接下來在剛纔的文件夾,使用SSH命令在當前文件夾生成一對SSH-KEY:
ssh-keygen -t rsa -C "郵箱地址"
- 1
- 1
例如:
ssh-keygen -t rsa -C "[email protected]"
- 1
- 1
接下來會出來提示信息,完整的大概是這樣:
$ ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):
- 1
- 2
- 3
- 1
- 2
- 3
這裏需要輸入SSH-KEY
的文件名字,這裏名字理論上可以隨便取,但是我們今天要說配置多個SSH-KEY
,所以請分別查看以下兩節:
- 單個
Git
帳號的配置——全局Git
配置 - 多個
Git
帳號的配置——局部Git
配置
單個Git帳號的配置——全局Git配置
大部分人使用Git
一般是一個帳號,所以接着上面的講。
上面說到輸入ssh-keygen
命令生成SSH-KEY
密鑰對文件時需要輸入文件名稱,如果你僅僅要配置一個帳號,那麼我們輸入默認名稱即可:id_rsa
。
接着會要求輸入私鑰的密碼,並且需要確認密碼,爲了安全在密碼輸入的時候不會反顯,什麼都看不到,這個密碼你自己設置,但是你一定要記住:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
- 1
- 2
- 1
- 2
到這裏生成SSH-KEY
的事就完成了,你在當前文件夾會看到兩個文件:
id_rsa id_rsa.pub
- 1
- 1
SSH-KEY生成了,接着給服務器和客戶端配置SSH-KEY
。
- 第一步把
id_rsa.pub
中的公鑰內容添加到Git
的SSH
中,如果你使用Github
或者Gitlib
,在個人設置中會找到。 - 第二步把
SSH-KEY
配置給SSH
,讓系統的SSH
知道這個KEY
。
Linux
把id_rsa
文件拷貝到~/.ssh
文件夾下,命令如下:
cp id_rsa ~/.ssh/
- 1
- 1
Window
把id_rsa
文件拷貝到C:/Users/你的用戶名/.ssh
文件夾下。
拷貝完成後,把.ssh
文件夾下的id_rsa
文件添加到SSH-Agent
,命令如下:
ssh-add id_rsa文件的路徑
- 1
- 1
例如Linux
:ssh-add ~/.ssh/id_rsa
,如果命令行此時正在.ssh
文件夾下:ssh-add id_rsa
即可,Windows
同理。
此時添加時如果遇到錯誤,請參考本文最後一節:添加SSH到SSH-Agent時報錯。
最後,執行以下命名配置Git
全局用戶和郵箱:
git config --global user.name "你的名字"
git config --global user.email "你的郵箱"
- 1
- 2
- 1
- 2
例如:
git config --global user.name "YanZhenjie"
git config --global user.email "[email protected]"
- 1
- 2
- 1
- 2
配置全局用戶和郵箱完成後,我們可以查看: Linux
用戶打開~/.gitconfig
文件即可看到配置:
vim ~/.gitconfig
- 1
- 1
Windows
用戶打開C:/Users/你的用戶名/.gitconfig
即可看到配置,內容大概如下:
[user]
name = YanZhenjie
email = [email protected]
- 1
- 2
- 3
- 1
- 2
- 3
此時配置全部結束,請查看下方測試SSH-KEY配置是否成功進行測試。
多個Git帳號的配置——局部Git配置
又有很多人同時使用多個Git
帳號,比如Github
、OSChina
、Gitlib
等,再接着上面講配置多個Git
帳號。
上面說到輸入ssh-keygen
命令生成SSH-KEY
密鑰對文件時需要輸入文件名稱,如果你要配置多個帳號,就根據愛好輸入KEY
文件的名字吧,例如爲Github
配置就輸入:id_rsa_github
,爲OSChina
配置就輸入:id_rsa_oschina
。
接着會要求輸入私鑰的密碼,並且需要確認密碼,爲了安全在密碼輸入的時候不會反顯,什麼都看不到,這個密碼你自己設置,但是你一定要記住:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
- 1
- 2
- 1
- 2
到這裏生成SSH-KEY
的事就完成了,你在當前文件夾會看到兩個文件:
id_rsa_github id_rsa_github.pub
- 1
- 1
SSH-KEY
生成了,接着給服務器和客戶端配置SSH-KEY
。
- 第一步把
id_rsa_github.pub
中的公鑰內容添加到Git
的SSH
中,如果你使用Github
或者Gitlib
,在個人設置中會找到。 - 第二步爲
SSH
配置私鑰位置,這裏和上面配置單個Git
帳號不一樣,不過單個帳號也可以按照多個帳號的配置方法來配置。
下面我們需要在.ssh
文件夾新建一個名爲config
的文件,用它來配置多個SSH-KEY
的管理。
Linux
進入.ssh
文件夾:cd ~/.ssh
,新建config
文件:touch config
;或者:touch ~/.ssh/config
。這裏要注意,沒有.ssh
文件夾的要新建一個.ssh
名的文件夾。
Window
進入C:/Users/你的用戶名/.ssh
文件夾,右鍵新建一個文本文件,改名爲config
即可。這裏要注意,沒有.ssh
文件夾的要新建一個.ssh
名的文件夾。
下面來填寫config
文件的內容,我以Github
、Gitlib
、OSChina
,局域網爲例:
Host github.com
HostName github.com
User smallajax@foxmail.com
PreferredAuthentications publickey
IdentityFile /home/Workspace/ssh/id_rsa_github
Host gitlib.com
HostName gitlib.com
User smallajax@foxmail.com
PreferredAuthentications publickey
IdentityFile id_rsa_gitlib
Host oschina.com
HostName oschina.com
User smallajax@foxmail.com
PreferredAuthentications publickey
IdentityFile /D/Workspace/ssh/id_rsa_oschina
Host 192.168.1.222
HostName 192.168.1.222
User smallajax@foxmail.com
PreferredAuthentications publickey
IdentityFile /D/Workspace/ssh/id_rsa_oschina
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
解釋一下,HostName
是服務器的地址,User
是用戶名,PreferredAuthentications
照抄即可,這裏主要說的是IdentityFile
,上面我們看到了三種情況,所以它的書寫原則是:
- 填私鑰文件的本地路徑。
- 不論是
Linux
還是Windows
都可以寫相對路徑,比如把id_rsa_xxx
私鑰文件放在.ssh
文件夾下。 - 文件放在不同跟路徑下時,需要寫絕對路徑
Linux
中沒有放在.ssh
文件夾內或者子文件夾。Windows
中沒有放在C
盤下時。注意據對路徑變化,比如C盤下是/C/xo/abc
、比如D盤下/D/ssh/id_rsa
這樣,還看不懂請參考上方例子。
拷貝完成後,把所有的id_rsa
私鑰文件添加到SSH-Agent
,命令如下:
ssh-add id_rsa文件的路徑
- 1
- 1
例如添加.ssh
文件夾下的,Linux
這樣做:ssh-add ~/.ssh/id_rsa
,如果你在.ssh
文件夾下:ssh-add id_rsa
即可,Windows
同理。
此時添加時如果遇到錯誤,請參考本文最後一節:添加SSH到SSH-Agent時報錯。
最後,還剩下項目的用戶和郵箱沒有配置,和配個單個Git
帳號的方式不同,這裏我們需要爲每個項目分別配置,所以要命令行進入倉庫文件夾再設置。第一種情況是先從Git
上pull
倉庫下來,第二種情況是本地初始化Git
倉庫,總之進入改倉庫文件夾後:
git config --local user.name "你的名字"
git config --local user.email "你的郵箱"
- 1
- 2
- 1
- 2
例如:
git config --local user.name "YanZhenjie"
git config --local user.email "smallajax@foxmail.com"
- 1
- 2
- 1
- 2
不過麻煩的一點是如果是多個項目就需要挨個配置,不過我們一般是pull
一個項目就配置一下,也僅僅需要配置一次即可。
注意配置單個Git
帳號時,是不進入項目文件夾就可以,不過不是使用--local
,而是使用--global
就可以全局配置。
配置項目用戶和郵箱完成後,我們可以進入項目文件夾下的.git
文件夾查看config
文件內容,大概內容如下:
...
[user]
name = YanZhenjie
email = [email protected]
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
此時配置全部結束,請查看下方測試SSH-KEY配置是否成功進行測試。如果配置成功,你就可以clone和commit了。
測試SSH-KEY配置是否成功
配置全部結束,我們來測試一下配置是否成功:
- 如果你是Github:
ssh -T git@github.com
- 1
- 1
- 如果是你Gitlib:
ssh -T git@gitlib.com
- 1
- 1
- 如果你是局域網192.168.1.222:
ssh -T git@192.168.1.222
- 1
- 1
- 其它自行舉一反三吧。
此時需要輸入剛纔生成SSH-KEY時輸入的私鑰密碼,輸入後自行觀察信息判斷是否連接成功。
- 比如Github的信息是:
Hi yanzhenjie! You've successfully authenticated, but GitHub does not provide shell access.
- 1
- 1
- 比如Gitlib的信息是:
Welcome to GitLab, YanZhenjie!
- 1
- 1
添加SSH到SSH-Agent時報錯
如果執行ssh-add ...
命令提示如下錯誤:
Could not open a connection to your authentication agent.
- 1
- 1
那麼請執行eval $(ssh-agent)
命令後再重試,如果還不行,請再執行ssh-agent bash
命令後重試。
如果還不行,請參考:StackOverFlow·ssh-Could not open a…