Featured image of post SSH 连接服务器踩坑总结

SSH 连接服务器踩坑总结

校园网使用 SSH 远程连接解决方案

前言

前两天因为做项目的需要,准备白嫖一个月腾讯的云服务器,但是在使用过程中遇到了不少麻烦。

由于是云服务器,我们一般在网页端控制台进行一系列操作,但是用过的都懂,又丑又麻烦,所以我决定使用SSH远程连接来进行操控。

准备工作

可以先把密码改了,腾讯云服务器要求密码必须有大小写字母,所以每次sudo输入密码都很麻烦。再加上我对安全性没啥要求,就尽量简单了改

sudo passwd 用户名

安装ssh服务端

使用这段代码前请务必确认apt已经更新好了(👉如何更新

sudo apt install openssh-server

检查是否安装成功

ps  -e | grep ssh

再执行

sudo systemctl status ssh

如果是active则表示已经激活

示例

远程连接

前期的准备工作已经做好,这时我们可以在自己的电脑上进行远程连接

打开cmd或者powershell,执行以下指令:

ssh username@ip_address

其中username=你的用户名,ipaddress是公网地址

如果你是云服务器,应该很容易就能找到。至于个人家庭服务器的话可能要摸索一下,因为我没搞过这个。

公网ip

出错

如果你是一名在校大学生,按照上面步骤操作,那么你会惊喜的发现:居然连不上!

然后你开始疯狂百度,疯狂找资料,最后还是没能找到解决办法…

其实原因很简单:部分校园网可能设置了SSH拦截,所以没有办法通过SSH登录云服务器…

这时候你可以试一下电脑连手机热点再ssh,如果成功可以继续参考我下面的方法,不成功应该是别的地方有问题(防火墙之类)

解决方案

我这里修改连接的端口号,因为22端口连接有问题,所以我们直接换一个端口进行连接就好了

sudo vim /etc/ssh/sshd_config

这里一定要加上sudo,要不然没法修改只读类型的文件

在这里新加入一个端口,具体是多少你可以自己决定,反正别和别的冲突

补:我这里写的有点问题,应该同时加上Port 22,要不然22端口没法用来登陆了(相当于修改端口而不是新增端口)

正确写法:

Port 1022
Port 22

端口

输入:wq!进行保存。

来到云服务器控制台,把我们刚才的端口加上 防火墙

添加规则

输入刚才的端口号

然后再返回你的主机,用以下指令,指定1022端口进行连接

ssh -p 1022 username@ip_address

完成

设置SSH密钥

每次手动输入密码着实有点麻烦,这里我们可以使用SSH秘钥登录

生成密钥对

我们现在的主机是Windows主机,服务器是Linux,版本为 Ubuntu 22.04.2 LTS

在Windows上生成密钥文件

ssh-keygen -t rsa

然后连按三次回车,在c盘用户文件夹下会生成密钥文件

密钥

注意,我们待会要用的是id_rsa.pub,别看错了!

投递公钥到服务端

在服务器终端依次执行:

mkdir -p .ssh
cd .ssh
touch authorized_keys
vim authorized_keys

vim authorized_keys可以换成cat >> .ssh/authorized_keys

最后把id_rsa.pub的内容输入进去,然后:wq保存退出即可

大功告成,已经不需要输密码了!

完成

SSH密钥失效

🔗参考文档

我在用了一段时间后发现连接服务器又要输密码了,显示Permission denied (publickey).也不知道是我哪里出了问题(不知道是不是连了两台电脑,还是改了用户文件夹权限)…无奈,得重新配置一下

请注意以下文件的权限

~./ssh/authorized_keys

~/.ssh

如果已经拒绝了密码登录,首先执行一下指令恢复密码登录

sudo vim /etc/ssh/sshd_config

找到PasswordAuthentication no ,改为PasswordAuthentication yes

然后你自己的电脑重新生成一下SSH密钥,按之前方法投递到服务器

接下来更改文件夹权限,这一步很重要!错误的权限会导致authorized_keys失效

chmod 700 ~/.ssh

chmod 600 ~/.ssh/authorized_keys

执行完以后应该就可以使用SSH了~

💡补充:SSH会话连接过程

本地向远程服务端发起连接,服务端随机生成一个字符串发送给发起登录的本地端,本地对该字符串使用私钥(~/.ssh/id_rsa)加密发送给服务端,服务端使用公钥(~/.ssh/id_rsa.pub)对私钥加密后的字符串进行解密,服务端对比解密后的字符串和第一次发送给客户端未加密的字符串,若一致则判断为登录成功

Licensed under CC BY-NC-SA 4.0