Git管理多個SSH密鑰,Git多帳號配置

首先這篇文章適用於WindowsLinux的配置,本人沒有條件去驗證Mac,所以不確定是否可以,不過和linux一樣屬於Unix系統,應該理論上都是可以的,如果有人實驗了可以給我個反饋。

這段時間在Ubuntu上做開發,又一次發現命令是真好用,加上這段時間把服務器從Windows遷到CentOS,也漸漸習慣了Vim

之前一直在Winodws下開發,開發中使用的版本管理工具是SVNGit,不過都會使用Tortoise類似的客戶端工具,對於git多帳號的情況,它可以動態管理SSH-KEY。不顧我在在Ubuntu下開發時沒有發現這樣的工具,幾個IDE也需要配置SSH,於是乾脆用命令了,在配置多個SSH-KEY花了我一個多小時才搞定,中間也由於細節不熟悉浪費了點時間,現在僅僅做個記錄,如果能幫到其它遇到同樣問題的同學也就更棒了。


SSH之於Git的原理

Git提交時有HttpsSSH兩種驗證方式,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

  1. 第一步把id_rsa.pub中的公鑰內容添加到GitSSH中,如果你使用Github或者Gitlib,在個人設置中會找到。
  2. 第二步把SSH-KEY配置給SSH,讓系統的SSH知道這個KEY

Linuxid_rsa文件拷貝到~/.ssh文件夾下,命令如下:

cp id_rsa ~/.ssh/
  • 1
  • 1

Windowid_rsa文件拷貝到C:/Users/你的用戶名/.ssh文件夾下。

拷貝完成後,把.ssh文件夾下的id_rsa文件添加到SSH-Agent,命令如下:

ssh-add id_rsa文件的路徑
  • 1
  • 1

例如Linuxssh-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帳號,比如GithubOSChinaGitlib等,再接着上面講配置多個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

  1. 第一步把id_rsa_github.pub中的公鑰內容添加到GitSSH中,如果你使用Github或者Gitlib,在個人設置中會找到。
  2. 第二步爲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文件的內容,我以GithubGitlibOSChina,局域網爲例:

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,上面我們看到了三種情況,所以它的書寫原則是:

  1. 填私鑰文件的本地路徑。
  2. 不論是Linux還是Windows都可以寫相對路徑,比如把id_rsa_xxx私鑰文件放在.ssh文件夾下。
  3. 文件放在不同跟路徑下時,需要寫絕對路徑
    1. Linux中沒有放在.ssh文件夾內或者子文件夾。
    2. 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帳號的方式不同,這裏我們需要爲每個項目分別配置,所以要命令行進入倉庫文件夾再設置。第一種情況是先從Gitpull倉庫下來,第二種情況是本地初始化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…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章