一、ssh登錄遠程服務器
今天分享一篇實用功能,我們在工作中經常需要連接遠程服務器,查日誌,查性能瓶頸等等,那麼除了使用客戶端工具外,我們最常用的就是使用SSH方式連接了,SSH之所以能夠保證安全,原因在於它採用了公鑰加密。那麼鄉親們知道ssh密碼的登錄過程是怎樣的嗎?
ssh密碼登錄過程:
- 用戶使用命令 ssh user@host或者ssh -p port user@host 向遠程主機發登錄請求;
- 遠程主機收到登錄請求以後把自己的公鑰發給用戶。
- 用戶使用這個公鑰,將登錄密碼加密後,發送回遠程主機。
- 遠程主機用自己的私鑰,將用戶輸入的登錄密碼解密,如果密碼正確,用戶登錄成功。
如果是第一次連接登錄遠程主機,會出現下面的警告:
意思是無法確認目標主機的真實性,只知道公鑰指紋,問你是否還要繼續連接?我們選擇yes之後,又會提示一個Warning,這個提示的意思是,目標主機已經得到認可,然後就需要你輸入密碼,密碼正確,就可以連接遠程主機。
下一個問題,爲什麼你輸入yes之後,下次再登錄就不會再出現這個提示了?
因爲在你輸入yes,也就是接受遠程主機的公鑰之後,它會被保存在文件~/.ssh/known_hosts中,下次當你再請求連接時,目標主機會認識這個公鑰被保存過,所以就會跳過警告部分,直接讓你輸入密碼。
每個ssh用戶都有自己的know_hosts文件,我們進入~/.ssh/中看一下是否添加了目標主機的公鑰
可以看到剛纔選擇yes之後,遠程主機的公鑰已經存在我們的know_hosts中了。
二、ssh免密登錄遠程服務器
我們每次連接遠程服務器的時候都需要輸入密碼,不厭其煩,所以我們就想着能不能只要使用ssh user@host就可以直接免密登錄,答案當然是可以的,所謂的免密登錄,其實就是使用ssh公鑰登錄,下面來看。
1、生成公鑰和私鑰
ssh-keygen -t rsa -C '你的郵箱'
命令解釋:
- ssh-keygen : 生成公鑰(其實只輸入這個命令就可以生成公鑰了)
- -t rsa : 祕鑰的類型(這裏是rsa)
- -C '你的郵箱' :用戶識別祕鑰的註釋(不一定是郵箱,可以是任何內容,默認是生成祕鑰所在的宿主機用戶名)
然後一路"Enter"下去:
最後會在 ~/.ssh 目錄下生成兩個文件 id_rsa.pub和id_rsa ,前者是公鑰,後者是私鑰,可以查看一下公鑰,如圖:
2、設置免密登錄(公鑰登錄)
公鑰生成後,在終端輸入下面的命令
ssh-copy-id -i ~/.ssh/id_rsa.pub 服務器主機用戶名@服務器地址
可以發現公鑰已經添加到目標主機,我們來驗證下:
3、問題彙總
- 公鑰拷貝到目標主機可以通過ssh-copy-id -i命令,可以手動拷貝,自己登錄到目標主機,把id_rsa.pub的內容粘貼到目標主機的.ssh/authorized_keys文件中,若該文件不存在,需要手動創建。
- 如果上面兩個方法還是不能免密登錄,就去到目標主機的/etc/ssh/sshd_config這個文件,檢查下面幾行前面的"#"註釋是否取掉。
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized\_keys
4、原理解釋
公鑰登錄是爲了解決每次登錄服務器都要輸入密碼的問題,流行使用RSA加密方案,主要流程包含:
1、客戶端生成RSA公鑰和私鑰
2、客戶端將自己的公鑰存放到服務器
3、客戶端請求連接服務器,服務器將一個隨機字符串發送給客戶端
4、客戶端根據自己的私鑰加密這個隨機字符串之後再發送給服務器
5、服務器接受到加密後的字符串之後用公鑰解密,如果正確就讓客戶端登錄,否則拒絕。這樣就不用使用密碼了。
三、ssh使用別名免密登錄遠程服務器
遠程登錄服務器,除了每次輸入密碼以外,每次ssh 服務器用戶名@服務器地址 也很麻煩,而且也不容易記住,如果我們能自己定義一個別名,每次只要ssh 別名,就能直接免密登錄,那該多好!別急,這也很簡單,下面來看。
上面我們看到~/.ssh下面有一個config文件,如果你沒有就創建一個,我們使用 vim ~/.ssh/config 命令編輯這個文件,添加如下內容:
#服務器別名
Host mzc
#服務器地址
HostName 服務器地址
#服務器用戶名
User root
#端口(如果有必要)
Port 22
我裏面本來就添加了幾個,現在我再爲上面示例中的阿里雲服務器加個mzc的別名,如下圖所示:
驗證一下:
好了,這樣就可以實現使用別名免密登錄了。
四、使用iTerm2的Profiles快捷登錄ssh
上面其實已經講完了ssh使用別名免密登錄遠程服務器的所有步驟了,只要跟着做下來的,一定能成功。可是這時候,有的鄉親們又問了,如果我連ssh 別名 都不想輸入呢?WTF?果然懶得清醒脫俗,都說懶人的想象力與創造力都驚爲天人,我服,既然這樣了,那就別怪我秀了,巧了,這個問題我又會了,沒想到吧!
下面就跟大家講一下真香系列之使用iTerm2的Profiles快捷登錄遠程服務器。
1、本地創建一個存放腳本文件的目錄
cd /Users/moore/Documentsmkdir Scripttouch ssh_mzc
上面的ssh_mzc就是我創建的腳本文件,你可以自己命名。
2、編輯腳本
vim ssh_mzc
在腳本文件中輸入下面的腳本:
#!/usr/bin/expect
set PORT 22
set HOST 你的遠程服務器地址
set USER 服務器用戶名
set PASSWORD 服務器登錄密碼
spawn ssh -p $PORT $USER@$HOST
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password:*" { send "$PASSWORD\r" }
}
interact
然後esc,wq保存退出,cat一下:
3、設置iTerm
點擊 iTerm2 ——> Preferences,選擇Profiles,然後按照下面的6個步驟操作:
- 點擊Profiles
- 點擊左下角的+號
- 輸入Name,自定義
- 輸入Tags,自定義
- Command下拉框選擇Command
- 命令輸入 expect 上面創建的腳本文件路徑
好了,到這兒準備工作就全部完成了。
4、驗證
使用快捷鍵command+O,雙擊剛纔設定的profile,就快速連接登錄遠程服務器了。
或者,在菜單欄點擊Profiles,也可以看到剛纔創建的profile,選擇後也能快速連接登錄上遠程服務器。
好了,本篇文章就講到這裏了,我們說了遠程連接服務器的原理,也說了免密登錄的原理和步驟,接下來又講解了ssh使用別名免密登錄的操作,最後又說到了如何使用iTerm2快速連接登錄遠程服務器,應該能解決鄉親們大多數的需求了,歡迎留言討論,如果對你有幫助,可以關注一下我的公衆號“碼之初”,就是對我最大的支持了,謝謝鄉親們!