文章目錄
- 設備描述
- 狀況描述
- 解決方法
- 當ssh連接出問題時的排錯方法
設備描述
主機:win11,使用vscode的remote-ssh插件
服務器:阿里云的2C2GUbuntu 22.04 UFIE
狀況描述
之前一直使用的是vscode的remote服務,都是能夠正常連接服務器的,但是今天由于一些情況,我對服務器的系統進行了重裝,然后我再想使用vscode連接服務器就連不上了,一直彈窗出錯,重試了幾次都沒沒什么效果。
我使用了阿里云自帶的webbench,并使用ssh連接,發現沒問題。于是我再次檢查了服務器22端口的開啟情況和防火墻的開啟情況,發現也沒有問題,于是懷疑是vscode出問題了。
再嘗試卸載、重裝remote_ssh插件后,情況依舊沒有好轉;于是又換用別的ssh連接工具(嘗試了Tabby、XShell發現能正常連接),于是確定問題不在服務器。
解決方法
經查,ssh協議在連接的時候會生成一個連接密鑰,以標識該主機,該標識會被存儲起來,方便下次訪問的時候直接使用,而不用再次生成、接收。
在ssh連接的報錯信息中,出現了如下信息:
其中就已經明確指出:host key有問題,它在C:\users\Lenovo.ssh\known_hosts這個文件中,于是我順著提示找到了這個文件,使用文本編輯器后打開,果然找到了相對的主機的Key。
這樣一切都能說清楚了:
[!問題分析]
由于我重裝了系統,ssh自然也重裝了,服務器重新生成了密鑰,但是我的vscode卻不知道,還存儲的是之前的密鑰,因此在連接的時候,密鑰對不上,就出現了連接失敗的問題。
因此,我們只需將相對應主機的相關Key全部刪除就好了,再下次連接的時候重新獲取服務器的ssh令牌(Key)。
再嘗試連接服務器,重新獲取Key,就發現能正常連接了。
當ssh連接出問題時的排錯方法
那么當出現問題的時候我們應當如何排查呢?
以下是我的一些經驗總結:
-
首先查看服務器的ssh服務是否出問題了:
systemctl status sshd
如果看到的是類似如下的結果,百分之八十應該是沒問題的:
這說明ssh服務是正常開啟的。 -
接下來就是檢查防火墻是否關閉:
systemctl status firewalld
我的服務器不知道是為啥,似乎是裝不了防火墻?反正沒有,如果檢查到防火墻處于running狀態的要先將其暫停:
systemctl stop firewalld
現在再試試能不能連上服務器了。
如果還是不行,然后又不是我這種報錯的,可以使用telnet命令,看看服務器的端口狀態:telnet <IP> <PORT>
看看是否能夠正常檢測,檢測成功會出現如下內容:
有極少數的情況就是22端口本身就被占用了,因此ssh服務可能使用其它端口用于監聽連接,但是這種情況我不熟,也還沒有碰到過,就暫時不說了吧。
還有文章說,需要手動安裝openssh:sudo apt install openssh
也可以試試吧,但我記得在安裝ssh的時候默認就會有這個,似乎是不存在這個問題?
-
檢查主機的ssh是否正常。
-
若是上述方法試了還不行,就試著刪除主機中所存儲的Key吧,方法上面說了。