ssh keys管理工具
原文地址:https://rtyan.github.io/%E5%B7%A5%E5%85%B7/2017/09/12/ssh-keys-manager.html
引言
我有兩個github賬戶,一個是平時正常使用的,另外一個是用來專門做部落格用的,
因為之前常用的那個做部落格名字不好看o(╯□╰)o。
這就引發了一個問題,我想在部落格賬戶中新增ssh keys
的時候,github會提示
我下面的資訊
原來,同一個公鑰只能在github系統中新增一次,重複新增的話會報這個錯誤,就算
是不同的賬戶也不能將同一個公鑰新增多次。
這個問題要怎麼解決呢?
暴力法——重新生成
最簡單的方法,也就是直接生成一套新的公鑰金鑰對,然後新增到我的部落格賬戶中,
等下次再用常用的賬號時候再重新生成一套,再替換常用賬號中的ssh keys
就可以
了,事實上我第一次就是這麼幹的,沒完全弄清楚怎麼回事,只能按照流程重新生成
一遍了,而且確實生效了。
但用了幾次之後我發現不用重新生成、只要在本地生成兩份ssh keys
,然後每次講要
使用的ssh keys
命名為id_rsa
、id_rsa.pub
就可以了,不用每次替換賬號中的配置了。
但用了一段時間,發現還是很麻煩,是在太難受了,於是就想著寫一個半
自動化的建立、切換ssh keys
的工具。
半自動化法
沿著上面的思路,我可以生成多套ssh keys
,然後將他們管理起來,每次使用的時候
只需要將他們替換到id_rsa
、id_rsa.pub
就可以了,省略了人工去切換。就像下面
這樣:
➜ rtyan.github.io git:(master) git push origin master
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
➜ rtyan.github.io git:(master) sshkeys change rtyan
切換ssh keys對,從[aizuyan]到[rtyan]...
複製/Users/ritoyan/.ssh-keys-pair/rtyan到/Users/ritoyan/.ssh/id_rsa成功
複製/Users/ritoyan/.ssh-keys-pair/rtyan.pub到/Users/ritoyan/.ssh/id_rsa.pub成功
切換到rtyan成功
➜ rtyan.github.io git:(master) git push origin master
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 77.54 KiB | 0 bytes/s, done.
Total 8 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
To github.com:rtyan/rtyan.github.io.git
a05e55f..50b54a7 master -> master
目前已經開發完成,用shell完成的,最後面會將程式碼貼出來。
工具生成的所有ssh keys pairs
都儲存在~/.ssh-keys-pair/
目錄下,就下下面
這樣:
-rw------- 1 ritoyan staff 3243 9 12 21:15 backup
-rw-r--r-- 1 ritoyan staff 741 9 12 21:15 backup.pub
-rw-r--r-- 1 ritoyan staff 6 9 12 21:16 nowRecord
-rw------- 1 ritoyan staff 3243 9 12 21:15 rtyan
-rw-r--r-- 1 ritoyan staff 741 9 12 21:15 rtyan.pub
其中backup
、backup.pub
記錄了軟體安裝之前的ssh keys
資訊(如果有的話)。
nowRecord
記錄了當前使用的是哪個ssh keys
,裡面的內容等同於~/.ssh-keys-pair/
目錄下的金鑰名稱。
其他檔案的話就是公鑰金鑰對了,金鑰是<生成時候的名稱>,公鑰是<生成時候的名稱>.pub
列出所有ssh keys
列表的時候就是通過匹配~/.ssh-keys-pair/
資料夾下面的.pub
字尾來的,匹配上了就算是一個公鑰金鑰對。
安裝
安裝的話直接把最下面的shell程式碼複製到/usr/local/bin/sshkeys
中(或其他$PATH
目錄中),然後執行chmod +x /usr/local/bin/sshkeys
給指令碼加上可執行許可權,然後
就可以看命令使用了。
命令
這個工具一共5個命令,功能分別如下(也可以直接看程式碼):
sshkeys init
初始化環境,備份原來的ssh keys
到backup
,設定當前使用的ssh keys
名稱為backup
sshkeys list
列出當前所有的ssh keys
名稱,當前使用的前面有星號:
➜ GIT sshkeys list
aizuyan
backup
* rtyan
sshkeys create <name> [<email>]
上面的命令是建立一個名稱為<name>
的ssh keys
,後面的<email>
是可選項:
➜ GIT sshkeys create aizuyan ritoyan@163.com
開始建立金鑰公鑰對...
執行命令[ssh-keygen -t rsa -b 4096 -f /Users/ritoyan/.ssh-keys-pair/aizuyan -q -N "" -C "ritoyan@163.com"]
建立成功
sshkeys showpub [<name>]
上面的命令是展示公鑰,後面的<name>
是可選的,預設展示當前正在使用的,加了引數顯示
對應<name>
的公鑰:
➜ GIT sshkeys showpub aizuyan
ssh-rsa AA.........Vw== ritoyan@163.com
sshkeys change <name>
切換到對應<name>
的ssh keys
➜ GIT sshkeys change aizuyan
切換ssh keys對,從[rtyan]到[aizuyan]...
複製/Users/ritoyan/.ssh-keys-pair/aizuyan到/Users/ritoyan/.ssh/id_rsa成功
複製/Users/ritoyan/.ssh-keys-pair/aizuyan.pub到/Users/ritoyan/.ssh/id_rsa.pub成功
切換到aizuyan成功
程式碼
程式碼又長又臭,可以忽略過了,想看的看下。
還有很多地方要優化,不過現在我用是夠了,哈哈。
#/bin/bash
# 存放資料的根目錄
softBase="${HOME}/.ssh-keys-pair/"
sshBase="${HOME}/.ssh/"
sshIdRsaPath="${sshBase}id_rsa"
sshIdRsaPubPath="${sshBase}id_rsa.pub"
nowSshPairRecordPath="${softBase}nowRecord"
action=$1
function init()
{
# 判斷根目錄是否存在,不存在建立
if [ -d $softBase ];then
return 1
fi
echo "初始化..."
#[1] 建立目錄
echo "[1]建立必要的目錄..."
mkdir -p -m 700 $softBase
if [ $? != 0 ];then
echo "[1-1]建立目錄${softBase}失敗"
else
echo "[1-1]建立目錄${softBase}成功"
fi
#[2] 備份現在的sshkey
echo "[2]備份當前的ssh key pair"
if [ -f "${sshIdRsaPath}" ];then
cp $sshIdRsaPath "${softBase}backup"
if [ $? != 0 ];then
echo "[2-1]備份${sshIdRsaPath}到${softBase}backup"
else
echo "[2-1]備份${sshIdRsaPath}到${softBase}backup"
fi
else
echo "${sshIdRsaPath}檔案不存在,不需要備份"
fi
if [ -f "${sshIdRsaPubPath}" ];then
cp $sshIdRsaPubPath "${softBase}backup.pub"
if [ $? != 0 ];then
echo "[2-2]備份${sshIdRsaPubPath}到${softBase}backup.pub失敗"
else
echo "[2-2]備份${sshIdRsaPubPath}到${softBase}backup.pub成功"
fi
else
echo "${sshIdRsaPubPath}檔案不存在,不需要備份"
fi
#[3] 設定當前sshkeys
echo "[3]設定當前sshkeys記錄"
if [ -f "${sshIdRsaPubPath}" ];then
echo "backup" > $nowSshPairRecordPath
if [ $? != 0 ];then
echo "[3-1]設定當前sshkeys記錄為[backup],寫入${nowSshPairRecordPath}失敗"
else
echo "[3-1]設定當前sshkeys記錄為[backup],寫入${nowSshPairRecordPath}成功"
fi
fi
echo "初始化成功\n"
return 0
}
function nowRecord()
{
local nowRecord=`cat ${nowSshPairRecordPath}`
echo $nowRecord
return 0
}
# 列出所有的公鑰名稱
function list()
{
local files=`ls $softBase | grep "\.pub\$"`
local file
local nowRecord=`nowRecord`
for file in ${files}
do
sshKeysName=${file%%.pub}
if [[ $nowRecord == $sshKeysName ]]; then
echo "* "$sshKeysName
else
echo " "$sshKeysName
fi
done
}
# 建立一對新的金鑰
# $1 金鑰名稱 必選
# $2 郵件 可選
function create()
{
keyPairName=$1
maybeEmail=$2
createPath="${softBase}${keyPairName}"
cmd="ssh-keygen -t rsa -b 4096 -f ${createPath} -q -N \"\""
if [[ $maybeEmail ]]; then
cmd="${cmd} -C \"${maybeEmail}\""
fi
echo "開始建立金鑰公鑰對..."
echo "執行命令[${cmd}]"
eval $cmd
if [ $? != 0 ];then
echo "建立失敗"
else
echo "建立成功"
fi
}
# 切換ssh keys
function change()
{
local keyPairName=$1
local rsaPath="${softBase}${keyPairName}"
local rsaPubPath="${rsaPath}.pub"
local preSshPairRecord=`nowRecord`
echo "切換ssh keys對,從[${preSshPairRecord}]到[${keyPairName}]..."
cp $rsaPath $sshIdRsaPath
if [ $? != 0 ];then
echo "複製${rsaPath}到${sshIdRsaPath}失敗"
else
echo "複製${rsaPath}到${sshIdRsaPath}成功"
fi
cp $rsaPubPath $sshIdRsaPubPath
if [ $? != 0 ];then
echo "複製${rsaPubPath}到${sshIdRsaPubPath}失敗"
else
echo "複製${rsaPubPath}到${sshIdRsaPubPath}成功"
fi
echo "${keyPairName}" > $nowSshPairRecordPath
if [ $? != 0 ];then
echo "切換到${keyPairName}失敗"
else
echo "切換到${keyPairName}成功"
fi
}
function showpub()
{
local keyPairName=$1
if [ -z "${keyPairName}" ]; then
keyPairName=`nowRecord`
fi
local keyPubPath="${softBase}${keyPairName}.pub"
cat $keyPubPath
}
case "${action}" in
"init" )
init
;;
"list" )
list
;;
"create" )
keyPairName=$2
maybeEmail=$3
create "${keyPairName}" "${maybeEmail}"
;;
"change" )
keyPairName=$2
change "${keyPairName}"
;;
"showpub" )
keyPairName=$2
showpub "${keyPairName}"
;;
* )
echo "this is action none"
;;
esac
相關文章
- 限制 ssh 從某些 IP 登入( authorized_keys )Zed
- GitHub倉庫配置SSH keys步驟流程圖解Github流程圖圖解
- SSH 金鑰管理工具
- 在同一臺電腦上使用多個 SSH KEYS (GITHUB OR GITLAB)GithubGitlab
- Xterminal-SSH管理工具推薦
- C - Keys
- iOS逆向之三 authorized_keys ssh登入越獄手機免驗證設定iOSZed
- Object.keys()Object
- react 列表&keysReact
- JavaScript 陣列 keys()JavaScript陣列
- Indexes and Keys (197)Index
- 自動化批量管理工具salt-ssh - 運維小結運維
- 批量刪除 redis keysRedis
- EF Core Keys(連結)
- Object.keys() 與 for in 區別Object
- Laravel redis 正則匹配keysLaravelRedis
- Keys for graphs閱讀筆記筆記
- for in,Object.keys,for of 的區別Object
- Eclipse 10 hotest-keysEclipse
- Redis 中使用 scan 替換 keysRedis
- Redis 中 Keys 與 Scan 的使用Redis
- Object.keys()的簡單理解Object
- React學習筆記-列表 & KeysReact筆記
- Porting .Net RSA xml keys to JavaXMLJava
- Redis的KEYS命令引起當機事件Redis事件
- 【dp】codeforces 830-A Office Keys
- 【SSH】--SSH框架簡介框架
- ssh埠轉發(ssh隧道)
- 工作筆記之一 array_fill_keys ()筆記
- 5分鐘徹底理解Object.keysObject
- ssh
- [SSH服務]——SSH埠轉發
- 檢測不再使用的索引–check-unused-keys索引
- SSH Tunnel
- SSH 使用
- php內建函式分析之array_fill_keys()PHP函式
- Python Selenium keys快捷鍵和鍵盤操作Python
- 詳解 Redis 中 big keys 發現和解決Redis