讲解一下ssh远程登陆的基础知识。
目录
- 0. 基本原理
- 1. 安装ssh程序:
- 1.1 windows平台(Win10)
- 1.2 Linux平台(Ubuntu18.04)
- 2. 密码方式远程登录
- 3. 密钥方式远程登录
- 3.1 生成私钥公钥对
- 3.2 将公钥复制到远程机器
- 3.3 尝试ssh远程登录
- 4. 常见问题
- 4.1 sun@192.168.1.21: Permission denied (publickey).
- 4.2 Received disconnect from 192.168.1.21 port 22:2: Too many authentication failures
0. 基本原理
ssh有两部分,分别为ssh客户端程序
和ssh服务端程序
。连接之前,远程目标机器的ssh服务端程序要保持打开,然后本地主机使用ssh客户端程序发起连接请求,输入密码即可登陆成功。
1. 安装ssh程序:
下面分别介绍一下linux和windows平台安装ssh的方法。
1.1 windows平台(Win10)
1.安装ssh的客户端和服务端
正常情况系统默认安装了ssh客户端,依具体情况而定。
2. ssh服务的启动和关闭
调用cmd或powershell终端,然后按情况执行下面命令
开启服务:net start sshd
关闭服务:net stop sshd
1.2 Linux平台(Ubuntu18.04)
1.安装ssh的客户端和服务端
正常情况系统默认安装了ssh客户端,依具体情况而定。
sudo apt install openssh-server
sudo apt install openssh-client
2.开启服务和关闭服务
#启动服务
sudo systemctl start ssh
#关闭服务
sudo systemctl stop ssh
3.查看服务状态
sudo systemctl status sshd
开启状态:
关闭状态:
2. 密码方式远程登录
无论是linux还是windows系统,使用ssh客户端远程登录的命令格式都是ssh 用户名@ip地址
。已知远程机器里注册好了账户sun,并设置好了密码。登录实例如下:
fan@pc:~$ ssh sun@192.168.1.10
sun@192.168.1.10's password:
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-146-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
...
Last login: Mon Apr 24 18:50:03 2023 from 172.32.1.76
sun@pc:~$
登录成功后,就可以通过该账户(sun)进行命令行操作这台远程机器了。
3. 密钥方式远程登录
其实ssh默认是使用密钥登录的,密钥登录的一个优点就是登录的时候不需要输入密码,其原理大概就是登录的时候验证密钥和公钥是否匹配,每个密钥和公钥之间都是唯一匹配的。下面具体说一下准备工作:
3.1 生成私钥公钥对
在本地机器上执行命令ssh-keygen -t rsa -C “邮箱”
,例如:
上面执行完之后,会在/home/fan/.ssh/路径下生成id_rsa和id_rsa.pub文件。其中id_rsa为记录私钥的文件,id_rsa.pub为记录公钥的文件。
3.2 将公钥复制到远程机器
将上一步生成的id_rsa.pub文件内容拷贝追加到远程机器的/home/用户名/.ssh/authorized_keys
中即可。
3.3 尝试ssh远程登录
上面两步做完,执行ssh登录命令,正常情况应该是不需要密码就能连接上了。例:
fan@pc:~$ ssh sun@192.168.1.10
从原理角度讲,每个私钥和公钥都是可以放到多个机器上的,每个私钥(公钥)都有唯一匹配的公钥(私钥)。不过从安全性来讲肯定不建议这么做。
4. 常见问题
4.1 sun@192.168.1.21: Permission denied (publickey).
这个问题是出现在使用git拉取代码的时候,之前一直都是好用的。后来是由于ubuntu升级到22.04,导致ssh也升级到OpenSSH_8.9p1。据官方说这个版本的ssh默认不使用rsa的算法认证,而本地机器与服务器直接一直用的是rsa加密的key,所以才报了这个问题。
解决方法: 在/etc/ssh/ssh_config中加入下面这句话开启rsa算法认证
PubkeyAcceptedAlgorithms +ssh-rsa
4.2 Received disconnect from 192.168.1.21 port 22:2: Too many authentication failures
用ssh连接远程机器时,报了上面的错误。这个是由于我本地创建了很多对密钥,连接的时候验证私钥和公钥次数超过最大验证次数,导致了这个问题。
解决方法1(推荐): 将远程机器最大的验证次数调高,编辑远程机器中的/etc/ssh/sshd_config文件,追加如下内容:
# 这个次数可以依照具体情况进行调整,然后重启一下远程机器的sshd服务才可生效。
MaxAuthTries 10
解决方法2: 连接的时候使用选项Pubkeyauthentication
,这样就此次登录就不会用密钥验证登录的方式而变为密码登录方式。
ssh pan@192.168.1.10 -o Pubkeyauthentication=no
解决方法3: 如果想永久的设置不使用密钥验证登录。可以直接编辑/etc/ssh/ssh_config文件,添加PubkeyAuthentication no
即可。
注意上面的sshd_config和ssh_config不要弄混淆。sshd_config是服务端程序配置文件,ssh_config是客户端程序配置文件。