ssh keys管理工具

来源:http://www.cnblogs.com/iforever/archive/2017/09/13/7513172.html
-Advertisement-
Play Games

原文地址: "https://rtyan.github.io/%E5%B7%A5%E5%85%B7/2017/09/12/ssh keys manager.html" 引言 我有兩個github賬戶,一個是平時正常使用的,另外一個是用來專門做博客用的, 因為之前常用的那個做博客名字不好看o(╯□╰) ...


原文地址: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_rsaid_rsa.pub就可以了,不用每次替換賬號中的配置了。

但用了一段時間,發現還是很麻煩,是在太難受了,於是就想著寫一個半
自動化的創建、切換ssh keys的工具。

半自動化法

沿著上面的思路,我可以生成多套ssh keys,然後將他們管理起來,每次使用的時候
只需要將他們替換到id_rsaid_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

其中backupbackup.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 keysbackup,設置當前使用的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 [email protected]
開始創建密鑰公鑰對...
執行命令[ssh-keygen -t rsa -b 4096 -f /Users/ritoyan/.ssh-keys-pair/aizuyan -q -N "" -C "[email protected]"]
創建成功

sshkeys showpub [<name>]

上面的命令是展示公鑰,後面的<name>是可選的,預設展示當前正在使用的,加了參數顯示
對應<name>的公鑰:

➜  GIT sshkeys showpub aizuyan
ssh-rsa AA.........Vw== [email protected]

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近新升級了Visual Studio 2017,創建的Web項目Bin目錄中多了一個叫roslyn的文件夾,該文件夾導致網站在某些伺服器上發佈出錯 從網上搜索了一下,Roslyn是新出的動態編譯工具 但是在伺服器上安裝.net4.6後仍然提示編譯出錯。 解決方法:打開解決方案NuGet包管理器,卸 ...
  • 這個我是在winform的頁面上做的 1. 首先是在頁面上添加3個lable 第一次點擊lable會有相應的數據被查詢出來 第二次點擊同一個lable會刷新所有的數據 2.點擊不同的label會有顏色提示當前點擊的是哪一個 第二次點擊的時候會還原lable的顏色 3.根據本日 本周 本月查詢數據 是 ...
  • 1: 有兩個地方必須做異常處理,異常類型為IOException 伺服器讀客戶端發來的信息時: LeafTCPClient client = (LeafTCPClient)ar.AsyncState; try { if (client.NetWork.Connected) { NetworkStre ...
  • 在新的ASP.NET Core MVC中,視圖組件類似於局部視圖,但它們更強大。視圖組件不使用模型綁定,僅依賴於您在調用時提供的數據。 ...
  • 1.字元流 1.1 所有文件的存儲都是位元組的存儲,我們日常在磁碟上保存的其實並不是文件的字元,而是先把字元轉換成位元組,再把這些位元組儲存到磁碟。在讀取文件時,也是一個位元組一個位元組的讀取,然後生成位元組的序列。 1.2 位元組流可以處理任何對象,但是字元流呢,、只用來處理字元或者字元串。可以這樣說,位元組流呢 ...
  • 一共需要創建三個類: 1:Student類 存放程式所需的屬性和方法 2:Control類 具體的實現方法 3:Test類 測試類 Student類 Control類 Test類 ...
  • 此項目利用 TP+Redis+Nginx+nginx-rtmp-module+ffmpeg+HLS +Swoole 的架構方案 GitHub 地址:https://github.com/DOUBLE-Baller/momo QQ群:274904994 演示地址:http://51zhibo.top ...
  • java後端1年經驗和技術總結(1) 1.引言 畢業已經一年有餘,這一年裡特別感謝技術管理人員的器重,以及同事的幫忙,學到了不少東西。這一年裡走過一些彎路,也碰到一些難題,也受到過做為一名開發卻經常為系統維護和發佈當救火隊員的苦惱。遂決定梳理一下自己所學的東西,為大家分享一下。 經過一年意識到以前也 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...