1. 預(yù)置條件和期望:
mac環(huán)境调鲸,公司電腦上配置了公司賬戶需要的ssh,這個時候如果有自己的一些總結(jié)想push到自己的github賬戶上挽荡,因為現(xiàn)在github已經(jīng)停止https方式push代碼藐石,這個時候就需要配置兩個ssh來分別到兩個github賬戶上。
準(zhǔn)備工作:
- 兩個ssh key
- 兩個github賬戶
cd到~/.ssh
目錄下使用以下命令生成兩個key定拟,自行調(diào)整參數(shù)和名字于微。
# 這里默認rsa生成最基本的秘鑰,需要其他加密類型的自行調(diào)整
ssh-keygen -t rsa -C "abc@163.com" -f ~/.ssh/id_rsa_a
ssh-keygen -t rsa -C "xyz@163.com" -f ~/.ssh/id_rsa_b
2. 具體配置:
好青自,那我們現(xiàn)在在~/.ssh
目錄下有了兩個ssh key
株依,四個文件
id_rsa_a
id_rsa_a.pub
id_rsa_b
id_rsa_b.pub
2.1 config文件
SSH config是Linux系統(tǒng)下針對SSH客戶端的一個參數(shù)配置方案,可以將一些關(guān)于SSH命令的參數(shù)放到配置文件中去延窜,執(zhí)行ssh命令的時候從文件中讀取恋腕,簡化命令行的操作。
ssh的config配置也有一定的優(yōu)先級逆瑞,由高到低按照以下的順序獲取(這里有個坑荠藤,后面會說到):
例子 | |
---|---|
命令行選項 | 如-p 10086 ,-i /path/to/identity_file 等選項來設(shè)置SSH的端口號或認證證書位置 |
用戶配置文件 |
~/.ssh/config 获高,默認不存在哈肖,需要手動創(chuàng)建 |
系統(tǒng)級配置文件 |
/etc/ssh/ssh_config ,針對所有user的配置文件念秧,一般用不到 |
按照我們的期望淤井,config配置如下:
#~/.ssh/config
Host github_a
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_a
Host github_b
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_b
我們先貼一條clone命令:git clone git@github.com:yocn/resp.git
我們來拆解一下這個命令
用戶名
@主機地址
:id
/倉庫名
- Host
也可稱為Alies,一個別名摊趾,通過它可以找到以下的配置 - HostName
需要ssh連接過去的主機地址
币狠,在我們現(xiàn)在的需求里面就是github.com
,也可以是IP地址砾层,在ssh連接linux server的時候一般是ip地址 - User
登錄主機的用戶名
总寻,在我們現(xiàn)在的需求里面是git
,如果是ssh連接server的時候就是你需要ssh登錄的用戶名 - IdentityFile
秘鑰的位置
所以配置完之后梢为,我們就可以把之前的clone命令用下面的代替:
git clone git@github.com:yocn/resp.git
↓
git clone github_a:yocn/resp.git
2.2 添加到ssh-agent
ssh agent
渐行,意為 ssh 代理,是一個密鑰管理器铸董,用來管理一個多個密鑰祟印,并為其他需要使用 ssh key 的程序提供代理。
當(dāng)其他程序需要身份驗證的時候 可以將驗證申請交給 ssh-agent 來完成整個認證過程 粟害。使用不同的密鑰連接到不同的主機時蕴忆,需要要手動指定對應(yīng)的密鑰,而 ssh 代理可以 自動幫助我們選擇對應(yīng)的密鑰進行認證悲幅。
需要把上面的兩個key添加到ssh-agent
套鹅,可以用下面的命令站蝠,添加到環(huán)境變量配置文件里,每次運行自動添加卓鹿,就不用手動添加了菱魔。
# .bash_profile
nohup ssh-add ~/.ssh/id_rsa_a >/dev/null 2>&1
nohup ssh-add ~/.ssh/id_rsa_b >/dev/null 2>&1
還有一種方式可以自動添加到ssh-agent
中,ssh-agent啟動的時候就自動加載進去了
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa_a
但是這種方法我沒法加載多個key吟孙,只能配置一個IdentityFile澜倦,每次可以使用ssh-add -l
查詢已經(jīng)添加到ssh-agent
中的key,可以看到上面兩個key都添加進去了杰妓。
abc@abc ~ % ssh-add -l
3072 SHA256:LAgtT7X/bFLtc8fyxxxxxxxxWkSKP+UqVi/5YUpExBs abc@163.com (RSA)
4056 SHA256:4vZ5H41eFKXn/KLxxxxxxxx+3zR7MD3e46ytVobsXsM4 xyz@163.com (RSA)
這個時候我們已經(jīng)可以測試我們的連通性了:
abc@abc resp % ssh -T github_a
Hi yocn! You've successfully authenticated, but GitHub does not provide shell access.
不出意外的話是這樣的打印結(jié)果藻治,如果有問題請移步5. 不生效的異常檢查:
查看并一步步排除。
3. 拉取巷挥,提交代碼
我們遇到的一般情況是公司的環(huán)境已經(jīng)配好了桩卵,我們要做的就是使自己的環(huán)境work但不影響公司環(huán)境的運行。
這個時候我個人的github倉庫為
git clone git@github.com:yocn/resp.git
我們需要用我們替換過的倉庫地址來拉取倉庫:
git clone github_a:yocn/resp.git
拉取下來之后我們可以使用git remote -v
命令查看倉庫的遠端地址倍宾。
abc@abc resp % git remote -v
origin git@github_a:yocn/resp.git (fetch)
origin git@github_a:yocn/resp.git (push)
這個時候嘗試用git push
測試吸占,一般沒問題了。
4. one more thing
我這個搞了半天沒有成功是因為之前的時候在ssh的global配置中配了core.sshCommand='ssh -i ~/.ssh/id_rsa'
凿宾,當(dāng)時用這個命令配置了一個秘鑰進去矾屯,后來忘記了。
如果設(shè)置了core.sshCommand
初厚,git fetch
和 git push
在需要連接到遠程系統(tǒng)時將使用指定的命令而不是 ssh件蚕。該命令與GIT_SSH_COMMAND環(huán)境變量的形式相同,并在設(shè)置環(huán)境變量時被覆蓋产禾。
也就是每次執(zhí)行ssh的時候會執(zhí)行ssh -i ~/.ssh/id_rsa
排作,所以導(dǎo)致失敗。
5. 不生效的異常檢查:
- 檢查git工程的config(工程目錄下使用git config --list)或者
git remote -v
查看工程的push和origin地址是否是我們配置的地址 -
ssh-add -l
查看我們期望的ssh 私鑰是否添加到ssh-agent
中 - 查看期望的公鑰是否在github中配置亚情,比對第
2
步中的私鑰列表妄痪,是否添加到ssh-agent
中 - 檢查自己的git全局配置(
git config --global --list
),在git config core.sshcommand
中是否有什么額外配置導(dǎo)致異常
總結(jié):
需要配置兩個ssh key在兩個github賬戶登錄的時候楞件,需要以下幾步:
- 在
~/.ssh/config
中配置不同的私鑰 - 兩個私鑰都需要用
ssh-add
命令添加到ssh-agent
中 - clone倉庫的時候需要用
config
中配置的Host名字替換