Skip to content

SSH 免密登录

约 916 字大约 3 分钟

Linuxssh

2025-01-14

介绍

我们经常需要使用ssh命令来连接远程服务器等,每次都需要输入密码,比较麻烦,可以通过配置SSH实现免密登录。

使用

在远程主机的操作,主要是添加公钥。 在本地主要是修改SSH配置文件。

主要流程如下:

  1. 在本地生成公钥和私钥
  2. 将公钥添加到远程主机
  3. 修改本地SSH配置文件,实现免密登录
  4. 测试免密登录

生成RSA秘钥

可以参考windows生成RAS密钥,和Linux中的差不多。

添加公钥到远程主机

  • 添加公钥到云服务器

将生成的公钥内容添加到服务器的 ~/.ssh/authorized_keys 文件中。

注意 需要注意 authorized_keys 文件的权限,必须是 600。可以通过chmod命令修改权限。

  • 添加公钥到Github

登录Github后,进入Settings->SSH and GPG keys->New SSH key粘贴上公钥,然后取个便于区别密钥来源的名称就行了。

修改本地SSH配置文件

将公钥添加到 authorized_keys 文件等远程中,私钥在本地,可以通过ssh root@10.1.1.1的方式访问远程,省去了输入密码的步骤,但用户名和 IP 地址也不短,或处于安全的原因,不想让其他人看到。可以通过配置 ~/.ssh/config 实现省略用户名和 IP 地址。默认情况下 ~/.ssh 目录下是没有 config 文件的。

我们可以通过命令创建:

$ vim ~/.ssh/config

SSH 客户端配置文件位于 ~/.ssh/config,添加内容如下:

Host example
HostName example.com
User root
Port 22
IdentityFile ~/.ssh/id_rsa

Host 代表云服务器昵称 HostName 为云服务器的公网 IP 地址,如果配置了域名也可以使用域名,如上就是使用的域名。 Port 代表连接时使用的端口号 User 代表连接时选用的用户名 IdentityFile 代表本地私钥文件的路径。

这样我们就可以用云服务器昵称登录云服务器啦,在终端输入:

$ ssh example

连接测试

可以使用如下命令测试Github的连通性

$ ssh -T git@github.com
Hi matiastang! You've successfully authenticated, but GitHub does not provide shell access.

如上面一步配置好后可以使用如下命令连接:

$ ssh example

如果是第一次登录到这台云服务器,终端会有确认提示:

The authenticity of host '10.1.1.1 (10.1.1.1)' can't be established.
ECDSA key fingerprint is SHA256:nGvmS+JKzQf1gG+Nzc0QN/qS6xSp1iV0rJFP1dILel4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

这时候我们输入 yes 并回车即可。下次再链接就不会提示了,这个是为了防止中间人攻击

sshd免密登录失败

有些服务器中的 sshd 服务配置并未开启公钥登录选项,如果ssh root@10.1.1.1命令回车后终端显示的不是云服务器相关信息,而是输入密码的话,就需要我们到云服务器上开启 sshd 服务的公钥登录配置。

在云服务器上执行:

$ vim /etc/ssh/sshd_config

进入到 sshd 配置文件后。找到 PubkeyAuthentication 项,删除该项的注释符 # 并确保该项对应的开关为 yes

错误的配置和正确的配置如下:

#PubkeyAuthentication no  # -> 错误的配置
PubkeyAuthentication yes  # -> 正确的配置

操作完之后重新启动 sshd 服务,再次尝试就可以免密登录了。 重启命令为:

$ service sshd restart。

参考

Linux ssh

windows生成RAS密钥