一、前言
ssh或者vscode每次登录服务器都要输入密码,繁琐还记不住。免密是个好东西
二、本地为Linux的ssh免密登录
-
本地打开terminal,执行以下命令
cd ~/.ssh ssh-keygen -t rsa -C "mail@163.com" -f ~/.ssh/server
"mail@163.com"只是作为server.pub公钥中的标记使用,便于识别;~/.ssh/server中的server可以修改成需要的名字,便于识别。
-
此时,
~/.ssh
路径下新增了server(私钥)和server.pub(公钥)两个文件。# 将公钥传送到远端服务器 ssh-copy-id -i ~/.ssh/server.pub -p 3322 account@服务器IP # 如果有端口需要指定,默认端口可以去掉-p参数
也可以手动复制
~/.ssh/server
文件的内容到远端服务器的~/.ssh/authorized_keys
中mkdir -p ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys vim ~/.ssh/authorized_keys # 粘贴公钥内容 :wq # 保存退出
-
编写 config 文件,在 ~/.ssh 目录下新建文件 config ,写入刚刚的密钥配置信息
Host 4090 HostName 127.0.0.1 User jerry Port 3322 IdentityFile ~/.ssh/server IdentitiesOnly yes # 参数说明 - `HostName`: 服务器的ip - `User`: 用户名 - `Port`: 端口 - `IdentityFile`: 指定用于身份验证的私钥文件,server为秘钥文件名 - `IdentitiesOnly`: 仅使用 IdentityFile 指定的私钥文件进行身份验证,有时可以省略
设置完成后,执行 ssh 4090 效果等同于 ssh -p 3322 用户名@服务器的ip,即可实现免密登录。vscode现在也可以免密登录喽!!
三、Windows的ssh免密登录
下载安装git,传送门.其余步骤和linux类似
- 安装好git后,在桌面右键–>点击
git bash here
然后一路enter到底。(如果之前有使用过,那么会提示输入新的公钥和密钥名字,写一个新的名字,然后再enter到底)# 创建密钥对 ssh-keygen –t rsa –C "注释"
- 然后依次打开
本地磁盘C-->用户-->89724-->.ssh
,然后右键–>点击git bash here
# 上传私钥到ssh-host ssh-copy-id id_rsa.pub 用户名@主机ip # 将id_rsa.pub替换成你需要上传的公钥文件(.pub结尾的文件) # 登录ssh ssh 用户名@主机ip
然后用vscode连接,可能会连接不上,然后去按照上边的路径本地磁盘C-->用户-->89724-->.ssh-->config
,右键config
,依次点击属性-->安全-->高级-->禁用继承-->将已继承的权限转换为此对象的显式权限
。然后回到安全
,选择组或用户名
,找到everyone
,将其删除,然后vscode重连即可成功。
四、常见问题
-
如果密钥配置后,用 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
不使用公钥验证
ssh-copy-id -i ~/.ssh/auc -p 3322 -o PubkeyAuthentication=no 用户名@服务器的ip
还有在ssh连接服务器或者scp给服务器传文件时,出现这个提示,都可以使用这个指令解决。如:
scp -o PubkeyAuthentication=no file scpuser@172.23.0.1:/home/scpuser/uploads/ ssh -o PubkeyAuthentication=no scpuser@172.23.0.1
-
还有可能服务器上的签名算法和本地不一致,日志如下:
# 报错log debug1: Next authentication method: publickey debug1: Offering public key: /home/jerry/.ssh/server RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent debug1: send_pubkey_test: no mutual signature algorithm debug1: Next authentication method: password
# 正常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/server RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent debug1: Server accepts key: /home/jerry/.ssh/server 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文件中加一行跟本地一致的加密算法即可:Host 4090 HostName 127.0.0.1 User jerry Port 3322 IdentityFile ~/.ssh/server IdentitiesOnly yes PubkeyAcceptedKeyTypes ssh-rsa
四、小结
笔者最近遇到的问题比较多,做了一些小结。希望能帮助到各位小伙伴们。