SSH 登入主機利用 ssh-keygen 交換金鑰免輸入帳號密碼及小撇步

使用 SSH 登入時不用輸入帳號密碼
第一次遇到 ssh-keygen 是在 2009 年碰 Red Hat 的時候, 常用則是直到 2010 年接觸 Hadoop 後才開始。但是直到現在, 每次想要產生一個新的金鑰時, 我還是會想去翻我在 Evernote 上的小抄, 或許有人跟我一樣沒辦法好好記住那些指令, 以及一些方便的小經驗, 於是我決定寫下這篇筆記分享一些我的 SSH 使用經驗, 也希望有不一樣使用方式的朋友可以互相交流成長一下。

原理簡介


免輸入帳號密碼的原理簡單的說就是靠一些加密編碼的演算法, 產生一組很長又混亂的字串及檔案, 這組資料分別為私鑰 (private key) 與公鑰 (public key), 接著將公鑰傳至想要可以免帳號密碼登入的主機上, 由於主機上存有與你電腦中私鑰相關連的公鑰,  因此, 在登入主機進行驗證使用者身分時, 主機就會認為你是驗證通過的使用者, 就可以免帳號密碼登入囉。

基本使用狀況


產生公私鑰:
ssh-keygen -t rsa -C "[email protected]"
用上面這個指令會產生一組公私鑰, 分別是私鑰 id_rsa 及公鑰 id_rsa.pub, 預設被存於 ~/.ssh 資料夾裡。

將公鑰上傳至欲免輸入帳號密碼驗證的主機及相對應的使用者帳號上:
scp ~/.ssh/id_rsa.pub your_account@server_hostname:~/.ssh/
接著登入主機將公鑰加入授權名單中:
ssh your_account@server_hostname
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

使用 Github 時


由於我個人使用偏好習慣, 喜歡將公私鑰做一些分類, 於是像是在使用如 Github 一些網路服務的網站時, 用的公私鑰也會不一樣, 這時候就要用下列指令額外命名檔案了。
ssh-keygen -t rsa -P '' -C '[email protected]' -f ~/.ssh/github_rsa
其餘詳細步驟可以參考官方網站的 Generating SSH Keys 這篇文章。

結合自有主機操作


編輯 ~/.ssh/config (如果沒有這個檔案請自行建立) 可以建立一些偏好設定, 下面的設定主要是設定哪個主機要使用哪個對應的私鑰:
Host mydev
    HostName dev.plusdiff.com
    User plusdiff
    IdentityFile ~/.ssh/plusdiff_dev

Host myprod
    HostName prod.plusdiff.com
    User root
    IdentityFile /Users/andre/Documents/andre-plusdiff.pem

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github
接著搭配編輯 /etc/hosts, 不論在公有 IP 或是私有 IP 及 VPN 下都相當好用:
192.168.1.10 dev.plusdiff.com
11.22.33.44 prod.plusdiff.com #ip of ec2 instances or other public servers
接下來只需要使用
ssh mydev

ssh myprod
就可以直接登入主機了。

終極懶人法


如果懶到連 ssh 三個英文字母都不想打, 在 Terminal 輸入下面的 alias:
alias mydev='ssh mydev'
alias myprod='ssh myprod'
最後只要在 Terminal 上直接打 mydev 或 myprod 就可以直接登入操作自有主機、EC2 或 Linode 的服務了。

留言