关于 ssh 免密登录,还是直接总结一个清晰一点的教程比较好。

# ssh 免密登录原理

ssh 免密登录的原理是,客户端生成一对公私钥,将公钥上传到服务器,然后客户端在登录时,使用私钥对登录信息进行加密,服务器收到加密信息后,使用公钥进行解密,如果解密成功,则登录成功。因此,其需要在登录时,要求客户端可以自动检测到私钥的位置并进行匹配。

# 公私钥生成

首先要在客户端生成一个公私钥对,使用命令:

ssh-keygen -t rsa

随后会弹出键入文件名的命令,默认文件名为 ~/.ssh/id_rsa~/.ssh/id_rsa.pub . 如果希望生成特殊文件名,可以选择修改。需要注意,这里键入的文件名需要包含路径,如果仅键入文件名,则会将公私钥对创建在 powershell 打开的文件目录下。

随后会要求输入 passphrase. 该 passphrase 是保护私钥的密码。当后续使用私钥时,需要输入该密码。

# 公钥上传

随后需要将公钥上传到服务器,使用命令:

mkdir ~/.ssh
echo "ssh-rsa xxx" >> ~/.ssh/authorized_keys

其中, xxx 是公钥的内容。需要注意的是,在 Windows 平台上生成的公钥后续可能会包含主机名,在执行 echo "ssh-rsa xxx" 时,需要将主机名删除。

# 将私钥添加到 SSH 代理

如果需要在登入远程机时,自动检测私钥的位置并进行匹配,需要将私钥添加到 SSH 代理中。使用命令:

ssh-add ~/.ssh/id_rsa

在执行该命令时,需要依据命令行提示,输入 passphrase.

# for Windows

在 Windows 系统中,该命令可能弹出错误

Could not open a connection to your authentication agent.

则需要先启动 SSH 代理,使用命令:

eval `ssh-agent -s`

需要注意,该命令需要在 powershell 中执行而非使用 git bash 命令执行,否则无法正常工作。

# for macOS

在 macOS 中,该命令一般不会弹出错误。但是在重启电脑后,仍然需要输入密码,即 ssh-add 命令重启后失效。这是因为 macOS 的 ssh-add 命令和 ssh-agent 都是一个进程,当电脑重启后,进程会消失,因此需要重新启动 ssh-add .

这里,只需要将 ssh-add 加入到开机启动项中即可。此外,为了不使私钥 passphrase 明文暴露,需要将 passphrase 存储到 macOS 钥匙串中。使用命令:

echo "ssh-add --apple-use-keychain ~/.ssh/id_rsa" >> ~/.zshrc

即可。