松江集團(tuán)網(wǎng)站建設(shè)外鏈相冊(cè)
SSH 概述
SSH
(安全外殼協(xié)議 Secure Shell Protocol,簡(jiǎn)稱(chēng)SSH)是一種加密的網(wǎng)絡(luò)傳輸協(xié)議,用于在網(wǎng)絡(luò)中實(shí)現(xiàn)客戶(hù)端和服務(wù)端的連接,典型的如我們?cè)诒镜仉娔X通過(guò) SSH
連接遠(yuǎn)程服務(wù)器,從而做開(kāi)發(fā),Windows、macOS、Linux都有自帶的 SSH
客戶(hù)端,但是在Windows上使用 SSH
客戶(hù)端的體驗(yàn)并不是很好,所以我們一般使用 Xshell
來(lái)代替。
一,準(zhǔn)備工作
1.1, 安裝 SSH 客戶(hù)端
為了建立 SSH 遠(yuǎn)程連接,需要兩個(gè)組件:客戶(hù)端和相應(yīng)服務(wù)端組件,SSH 客戶(hù)端是我們安裝在本地電腦的軟件;而服務(wù)端,也需有一個(gè)稱(chēng)為 SSH 守護(hù)程序的組件,它不斷地偵聽(tīng)特定的 TCP/IP 端口以獲取可能的客戶(hù)端連接請(qǐng)求。 一旦客戶(hù)端發(fā)起連接,SSH 守護(hù)進(jìn)程將以軟件和它支持的協(xié)議版本作為響應(yīng),兩者將交換它們的標(biāo)識(shí)數(shù)據(jù)。如果提供的憑據(jù)正確,SSH 會(huì)為適當(dāng)?shù)沫h(huán)境創(chuàng)建一個(gè)新會(huì)話(huà)。
MacOS 系統(tǒng)自帶 SSH 客戶(hù)端,可以直接使用,Windows 系統(tǒng)需要安裝 Xshell
客戶(hù)端軟件,大部分 Linux 發(fā)行版系統(tǒng)都自帶 SSH 客戶(hù)端,可以直接使用,可通過(guò) ssh -V
命令查看當(dāng)前系統(tǒng)是否有 SSH 客戶(hù)端。
[root@VM-0-2-centos ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
1.2, 安裝 SSH 服務(wù)端
Linux 系統(tǒng)檢查 ssh 服務(wù)端是否可用的命令有好幾種,比如直接看是否有 ssh
進(jìn)程在運(yùn)行:
ps -ef | grep ssh
運(yùn)行以上后,輸出結(jié)果示例如下,有 sshd 進(jìn)程在運(yùn)行,說(shuō)明 ssh 服務(wù)端可用。
-bash-4.3$ ps -e|grep ssh336 ? 00:00:00 sshd358 ? 00:00:00 sshd1202 ? 00:00:00 sshd1978 ? 00:00:00 sshd1980 ? 00:00:00 sshd2710 ? 00:00:00 sshd2744 ? 00:00:00 sshd2829 ? 00:00:00 sshd2831 ? 00:00:00 sshd9864 ? 00:00:00 sshd9893 ? 00:00:02 sshd
對(duì)于 Ubuntu 系統(tǒng),可通過(guò)以下命令檢查 OpenSSH
服務(wù)端軟件是否可用:
ssh localhost # 不同 Linux 系統(tǒng)輸出可能不一樣
二,基于密碼的登錄連接
典型用法,只需輸入以下命令即可連接遠(yuǎn)程服務(wù)器。
# ssh連接默認(rèn)端口是22,如果本地機(jī)用戶(hù)名和遠(yuǎn)程機(jī)用戶(hù)名一致,可以省略用戶(hù)名
ssh username@host
# 也可以指定連接端口
ssh -p port user@host
上述命令是典型的 SSH 連接遠(yuǎn)程服務(wù)器的命令,如果是第一次連接運(yùn)行后會(huì)得到以下提示,正常輸入 yes
,然后輸入賬號(hào)密碼即可連接成功:
The authenticity of host '81.69.58.141 (81.69.58.141)' can't be established.
ED25519 key fingerprint is SHA256:QW5nscbIadeqedp7ByOSUF+Z45rxWGYJvAs3TTmTb0M.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yesLast login: Tue Feb 28 15:33:06 2023 from xx.xx.xx.xx
三,基于公鑰登錄連接
前面的命令是通過(guò)密碼(私鑰)登錄,這樣比較麻煩,因?yàn)槊看蔚卿浳覀兌夹枰?strong>輸入密碼,因此我們可以選擇 SSH 的公鑰登錄連接方式,省去輸入密碼的步驟。
公鑰登錄的原理,是先在本地機(jī)器上生成一對(duì)公鑰和私鑰,然后手動(dòng)把公鑰上傳到遠(yuǎn)程服務(wù)器。這樣每次登錄時(shí),遠(yuǎn)程主機(jī)會(huì)向用戶(hù)發(fā)送一段隨機(jī)字符串,而用戶(hù)會(huì)用自己的私鑰對(duì)這段隨機(jī)字符串進(jìn)行加密,然后把加密后的字符串發(fā)送給遠(yuǎn)程主機(jī),遠(yuǎn)程主機(jī)會(huì)用用戶(hù)的公鑰對(duì)這段字符串進(jìn)行解密,如果解密后的字符串和遠(yuǎn)程主機(jī)發(fā)送的隨機(jī)字符串一致,那么就認(rèn)為用戶(hù)是合法的,允許登錄。
只需要把私鑰傳給遠(yuǎn)程服務(wù)器,遠(yuǎn)程服務(wù)器就可以驗(yàn)證私鑰是否是對(duì)應(yīng)的公鑰,如果是就允許登錄,這樣就不需要輸入密碼了。
SSH 支持多種用于身份驗(yàn)證密鑰的公鑰算法, 包括 RSA、DSA、ECDSA 和 ED25519 等,其中 RSA 算法是最常用的,因?yàn)樗?SSH 協(xié)議的默認(rèn)算法,所以我們這里以 RSA
算法為例來(lái)生成密鑰,并配置免密碼遠(yuǎn)程連接。
ssh-keygen
是為 SSH 創(chuàng)建新的身份驗(yàn)證密鑰對(duì)的工具。此類(lèi)密鑰對(duì)用于自動(dòng)登錄、單點(diǎn)登錄和驗(yàn)證主機(jī),常用參數(shù)定義如下:
-t
參數(shù)指定密鑰類(lèi)型-b
參數(shù)指定密鑰長(zhǎng)度
基于公鑰登錄連接的具體步驟如下:
1,本地終端運(yùn)行 ssh-keygen -t rsa -b 4096
命令生成密鑰對(duì),運(yùn)行后會(huì)提示輸入密鑰保存路徑,直接回車(chē)即可,保存在默認(rèn)路徑下,然后會(huì)提示輸入密鑰密碼,這里我們不設(shè)置密碼,直接回車(chē)即可,然后會(huì)提示再次輸入密碼,這里也不設(shè)置密碼,直接回車(chē)即可,最后會(huì)提示密鑰生成成功,如下圖所示,可以看出 ~/.ssh/
目錄下,會(huì)新生成兩個(gè)文件:id_rsa.pub
和 id_rsa
,分別是公鑰和私鑰文件。
2,將本地 .ssh
目錄下的 id_rsa.pub
文件內(nèi)容添加到目標(biāo)服務(wù)器的 ~/.ssh/authorized_keys
文件中,如果目標(biāo)服務(wù)器沒(méi)有 .ssh
目錄,需要先創(chuàng)建 .ssh
目錄,然后再創(chuàng)建 authorized_keys
文件,然后再添加文件內(nèi)容。
具體操作命令如下:
# 1,本地終端運(yùn)行命令
cat ~/.ssh/id_rsa.pub # 查看本地公鑰文件內(nèi)容,并復(fù)制
# 2,遠(yuǎn)程終端運(yùn)行命令,有 authorized_keys 文件則跳過(guò)
mkdir -p ~/.ssh # 創(chuàng)建 .ssh 目錄
touch ~/.ssh/authorized_keys # 創(chuàng)建 authorized_keys 文件
# 3,然后將本地公鑰文件內(nèi)容粘貼到 `authorized_keys` 文件中,保存退出
如果覺(jué)得上述步驟太過(guò)繁瑣,可通過(guò)下面命令,一鍵完成公鑰登錄連接的配置:
$ ssh username@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
只要將公鑰文件內(nèi)容寫(xiě)入遠(yuǎn)程服務(wù)器的 authorized_keys
的文件,公鑰登錄的設(shè)置就完成了,后續(xù)遠(yuǎn)程連接就不用每次輸入密碼了!
Github
提交代碼的時(shí)候,也是通過(guò)公鑰登錄連接的方式,只要將本地的公鑰文件內(nèi)容添加到 github 的 authorized_keys
文件中,就可以免密碼提交代碼了,原理是一模一樣的。
四,VSCode 遠(yuǎn)程連接
VSCode 也支持遠(yuǎn)程連接,可以通過(guò) Remote-SSH
插件來(lái)實(shí)現(xiàn),具體操作步驟如下:
1,在 VSCode 中安裝 Remote-SSH 插件。
2,windows 系統(tǒng) ctrel + shift + p
命令打開(kāi)命令面板,輸入 Remote-SSH: Connect to Host...
,然后選擇 SSH Configuration
,或者通過(guò)左側(cè)菜單欄的 Remote Explorer
-> SSH Targets
-> SSH Configuration
進(jìn)入。如下圖所示:
3,然后會(huì)打開(kāi) ~/.ssh/config
配置文件,可以參考如下所示模板進(jìn)行配置:
# Read more about SSH config files: https://linux.die.net/man/5/ssh_configHost JumpMachineHostName jump-vscode.sensetime.com# 你跳板機(jī)的用戶(hù)名User usernameHost T4# 目標(biāo)機(jī)的ip地址HostName xxx.xxx.xxx.xxx# 你目標(biāo)機(jī)的用戶(hù)名User username# 目標(biāo)機(jī)登錄端口Port 22# macos系統(tǒng): ProxyCommand ssh -q -W %h:%p JumpMachineProxyCommand ssh -q -W %h:%p JumpMachine
4,本地機(jī)生產(chǎn)公鑰并追加到遠(yuǎn)程服務(wù)器 authorized_keys
中的步驟,參考第三章。
5,配置完成后,保存退出,然后在 VSCode 中,點(diǎn)擊左側(cè)菜單欄的 Remote Explorer
-> SSH Targets
-> T4
,即可連接到遠(yuǎn)程服務(wù)器。
參考資料
- 維基百科-Secure Shell
- How to Use ssh-keygen to Generate a New SSH Key?
- SSH原理與運(yùn)用(一):遠(yuǎn)程登錄