理想案例

假设一切都很顺利的话,最简单的方式如下:

  1. 使用 ssh-keygen 命令在本地生成一对密钥(Public/Private Key)
  2. 使用 ssh-copy-id username@your-server-ip 命令将本地的公钥上传到远程服务器
  3. 现在使用 ssh username@your-server-ip 命令即可免密登录了

如果之前已经在本地生成过密钥了,那第一步都可以省了。怎么看有没有生成过:使用 ls -a ~/.ssh 命令看下是否已经存在 id_rsa 和 id_rsa.pub 文件,有即生成过。

现实情况

但往往看别人玩的很嗨,到自己实操了就会出现各种问题。还是那句话:该踩的坑一个都不会少! 如果遇到问题了可以看看下面列举出来的常见的 TROUBLESHOOTING

  1. 如果你在执行 ssh-copy-id 命令时指定了某个公钥,比如 ssh-copy-id -i ~/.ssh/id_rsa_another.pub username@your-server-ip,此时注意在使用 ssh 命令远程连接的时候也需要指定这个公钥,否则默认是会拿 ~/.ssh/id_rsa.pub 去匹配的,所以你的连接命令应该是类似这样:ssh -i ~/.ssh/id_rsa_another.pub username@your-server-ip
  2. SSH 服务端可能配置了不允许公钥授权登录。查看服务器上的 /etc/ssh/sshd_config 文件里是否配置正确:PubkeyAuthentication yes
  3. SSH 服务端可能配置了不允许 root 用户登录。查看服务器上的 /etc/ssh/sshd_config 文件,其中如果包含 PermitRootLogin no 则将其改为 yes

基本原理

一张时序图最能说明问题了 :P

参考资料


封不羁
1.1k 声望82 粉丝