前言
前两天因为做项目的需要,准备白嫖一个月腾讯的云服务器,但是在使用过程中遇到了不少麻烦。
由于是云服务器,我们一般在网页端控制台进行一系列操作,但是用过的都懂,又丑又麻烦,所以我决定使用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是公网地址
如果你是云服务器,应该很容易就能找到。至于个人家庭服务器的话可能要摸索一下,因为我没搞过这个。
出错
如果你是一名在校大学生,按照上面步骤操作,那么你会惊喜的发现:居然连不上!
然后你开始疯狂百度,疯狂找资料,最后还是没能找到解决办法…
其实原因很简单:部分校园网可能设置了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)对私钥加密后的字符串进行解密,服务端对比解密后的字符串和第一次发送给客户端未加密的字符串,若一致则判断为登录成功