ssh免密登录(本地Windows、linux 连接linux服务器)
前言
ssh或者vscode每次登录服务器都要输入密码,繁琐还记不住。免密是个好东西。
如果你的本地是linux,直接看第二节;如果本地是windows,直接看第三节。
SSH免密登录(Linux)
生成公钥和私钥
本地打开terminal,执行以下命令生成公钥和私钥:
1 | cd ~/.ssh |
linux2A100
这个内容会写到公钥中,可以改成自己的,笔者这么写目的:表示本地linux连接A100服务器的意思。
指令最后的A100是生成公钥和私钥的文件名字,可以改成自己的。此时,~/.ssh
路径下新增了A100(私钥)和A100.pub(公钥)两个文件。
公钥传送到远端服务器
将公钥传送到远端服务器
1 | ssh-copy-id -i ~/.ssh/A100.pub -p 3322 account@服务器IP # 如果有端口需要指定,默认端口可以去掉-p参数 |
也可以手动复制~/.ssh/A100
文件的内容到远端服务器的~/.ssh/authorized_keys
中
1 | mkdir -p ~/.ssh |
编写config文件
在 ~/.ssh 目录下新建文件 config ,写入刚刚的密钥配置信息
1 | Host a100 |
设置完成后,执行 ssh a100 效果等同于 ssh -p 3322 用户名@服务器的ip,即可实现免密登录。vscode现在也可以免密登录喽!!
SSH免密登录(Windows)
下载安装git,传送门.其余步骤和linux类似
生成公钥和私钥
依次打开本地磁盘C-->用户-->89724-->.ssh
,在桌面右键–>点击git bash here
(如果没有前边的路径,就在桌面右键–>git bash here
)
1 | # 创建密钥对,记得手敲,不要复制!!! |
win2A100
这个内容会写到公钥中,可以改成自己的,笔者这么写目的:表示本地win连接A100服务器的意思。
指令最后的A100是生成公钥和私钥的文件名字,可以改成自己的。然后一路enter到底。(如果遇到Enter passphrase (empty for no passphrase):
,直接enter即可)
公钥传送到远端服务器
依次打开本地磁盘C-->用户-->89724-->.ssh
,然后右键–>点击git bash here
,上传公钥到ssh-host
1 | ssh-copy-id -i A100.pub 用户名@主机ip |
使用 ssh 用户名@主机ip
登录服务器即可。用vscode连接,可能会连不上,然后按照上边的路径本地磁盘C-->用户-->89724-->.ssh-->config
,右键config
,依次点击属性-->安全-->高级-->禁用继承-->将已继承的权限转换为此对象的显式权限
。然后回到安全
,选择组或用户名
,找到everyone
,将其删除,然后vscode重连即可成功。
SSH跳板
假设你有一台云服务器A和内网服务器B,想用外网笔记本通过A访问B,就可以这么干。以下配置都在你的笔记本上,笔者使用mac进行配置。
SSH配置
首先按照上面的教程分别配置mac到A,mac到B的密钥登录,分别用于连接A和B,~/.ssh/config
如下:
1 | Host aliyun |
然后还是在 ~/.ssh/config
文件中,添加如下跳板配置:
1 | Host jump.4090 |
注:前提是阿里云的10001端口与4090内网的22端口做了内网穿透,访问
阿里云的IP:10001
相当于访问4090的IP:22
,这样又可以将10001端口隐藏起来,更加安全。Host jump.4090
的原理是 首先判断是否存在Proxyjump,如果存在,登录aliyun账户,然后站在aliyun上访问aliyun(127.0.0.1)的10001端口,相当于访问内网22端口,再然后会提示内网用户名和密码,即可完成登录。
Proxyjump使用
现在可以使用 jump.4090
从外网免密登录内网的4090服务器了。如果连接内网其他服务器,可以使用 ssh -J jump.4090 3090
,其中 3090
的配置和上一步4090的配置一致。或者可以写成配置文件:
1 | Host jump.3090 |
然后使用 ssh jump.3090
连接即可。当然scp也可以使用proxyjump传文件,如 scp -o ProxyJump=jump.4090
常见问题
- 如果密钥配置后,用 Host 连接仍需输入密码,很可能是文件权限错误,ssh 对文件的权限敏感,解决方法如下:
- 登录服务器,进入
.ssh
目录 - 输入
ls -la
查看文件权限 - 确保权限为:
.ssh
的权限为rwx --- ---
authorized_keys
的权限为rw- --- ---
- 如果权限错误,修改一下
chmod 700 ~/.ssh
chmod 600 authorized_keys
- 使用
ssh-copy-id
上传公钥时,提示Too many authentication failures
-
错误原因:ssh 连接会逐个验证本地公钥,验证次数过多将导致失败。
-
解决方法:指定参数
-o PubkeyAuthentication=no
不使用公钥验证1
ssh-copy-id -i ~/.ssh/auc -p 3322 -o PubkeyAuthentication=no 用户名@服务器的ip
还有在ssh连接服务器或者scp给服务器传文件时,出现这个提示,都可以使用这个指令解决。如:
1
2scp -o PubkeyAuthentication=no file scpuser@172.23.0.1:/home/scpuser/uploads/
ssh -o PubkeyAuthentication=no scpuser@172.23.0.1
-
还有可能服务器上的签名算法和本地不一致,日志如下:
1
2
3
4
5# 报错log
debug1: Next authentication method: publickey
debug1: Offering public key: /home/jerry/.ssh/A100 RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent
debug1: send_pubkey_test: no mutual signature algorithm
debug1: Next authentication method: password1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 正常log
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: /home/jerry/.ssh/A100 RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent
debug1: Server accepts key: /home/jerry/.ssh/A100 RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent
Authenticated to 172.23.148.25 ([172.23.148.25]:22) using "publickey".
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: filesystem
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: client_input_hostkeys: searching /home/jerry/.ssh/known_hosts for 172.23.148.25 / (none)
debug1: client_input_hostkeys: searching /home/jerry/.ssh/known_hosts2 for 172.23.148.25 / (none)
debug1: client_input_hostkeys: hostkeys file /home/jerry/.ssh/known_hosts2 does not exist
debug1: Sending environment.
解决办法:在服务器上使用相同的签名算法,只需要将~/.ssh
下的config文件中加一行跟本地一致的加密算法即可:
1 | Host 4090 |
注:默认不要加这一行
PubkeyAcceptedKeyTypes ssh-rsa
四、小结
笔者最近遇到的问题比较多,做了一些小结。希望能帮助到各位小伙伴们。