
我在 AWS 上建立了兩個 EC2 執行個體。我為他們每個人創建了一個密鑰對。我下載了 .pem 私鑰並將其轉換為.ppk
格式。我可以使用 PuTTY 及其 .ppk 私鑰連接到每個 ec2 實例。但如何從我的一個 ec2 實例透過 SSH 連線到另一個實例呢?我可以從其中一個 ping 另一個的公共 DNS。但如果我嘗試從一個到另一個的 ssh,我會得到:
權限被拒絕(公鑰)。
答案1
方法 1 - 在伺服器上使用相同的金鑰:
將金鑰轉換為 openssh 格式並將私鑰上傳到伺服器。當您 ssh 到目標主機時,指定私鑰檔案:
ssh -i mykey.pem private.ip.of.other.server
方法 2 - 建立新金鑰
在每台伺服器上運行:
ssh-keygen
按回車鍵回車。您將有兩個文件:
.ssh/id_rsa
.ssh/id_rsa.pub
在伺服器A、 cat 並將公鑰複製到剪貼簿:
cat ~/.ssh/id_rsa.pub
[select and copy to your clipboard]
透過 SSH 進入伺服器B,並將其內容附加到它的authorized_keys 檔案中:
cat >> ~/.ssh/authorized_keys
[paste your clipboard contents]
[ctrl+d to exit]
現在從伺服器 A ssh:
ssh -i ~/.ssh/id_rsa private.ip.of.other.server
答案2
有第三個,恕我直言,最好的解決方案就是所謂的ssh代理轉發:
- 在本機上設定 ~/.ssh/config,透過新增以下部分:
Host <ip-or-name-of-A-server> ForwardAgent yes
- 我假設在伺服器 A 和 B 上,您將本機 ~/.ssh/id_rsa.pub 新增至伺服器的 ~/.ssh/authorized_keys
在伺服器 A 上工作時,您的金鑰可以用於進一步的 ssh 通訊 - 例如:
- 使用 ssh 用戶端連接到其他伺服器 - 在本例中連接到伺服器 B,
- scp(安全副本),
- git - 您可以使用本機身分拉/推到遠端 git 儲存庫
- ETC。
要檢查這是否有效:
- 連接到伺服器A
- 透過偵測 SSH_AUTH_SOCK 環境變數來檢查是否存在用於金鑰交換的套接字連線:
set|grep SSH_AUTH_ # output should be something like this: SSH_AUTH_SOCK=/tmp/ssh-sEHiRF4hls/agent.12042
筆記:
- 你需要執行 ssh 代理程式 - linux:
ps -e | grep [s]sh-agent
,對於 Windows 檢查 putty 的實用程式 pagent 和 plink - 參考:https://help.github.com/articles/using-ssh-agent-forwarding
- ssh 故障排除:
https://confluence.atlassian.com/display/BITBUCKET/Troubleshoot+SSH+Issues
答案3
針對該問題的新 AWS 解決方案。
這是一篇相同的部落格文章:
請注意:
SSH 公鑰在實例元資料中只能一次性使用 60 秒。若要成功連線到實例,您必須在此時間視窗內使用 SSH 連線。由於密鑰會過期,因此無需像以前那樣直接追蹤或管理這些密鑰。