Contents
  1. 1. 原理
  2. 2. 准备环境
    1. 2.1. 建立公钥和私钥(A)
    2. 2.2. 设置主机B别名(A)
    3. 2.3. 设置SSH服务(B)
  3. 3. 上传公钥
    1. 3.1. 命令行上传
    2. 3.2. 直接拷贝
  4. 4. 致谢&参考

随着虚拟机以及远程主机数量的增加,每次登陆时都需要输入密码也是一件挺麻烦的事,尤其是有的远程主机需要1-2层跳板机才能登录上去,实在是有些繁琐。还好我们有免密登录,这样可以省去我们很多麻烦。这篇博文就介绍下如何才能使用SSH的免密登录。

我们首先假设自己的机器为A (ip:192.168.1.100),而今天我们要尝试免密登录的服务器为B (ip:192.168.1.101)。
正常的从A通过SSH登录到B的过程是:

1
$ ssh root@192.168.1.101

然后就需要输入主机B的密码,就可以登录了。

那么今天这篇文章就是教大家如何不需要输入密码就可以登录上去,甚至最后可以简写成这样的方式:

1
$ ssh host_B

不用密码,一步SSH到主机B上!是不是很爽??下面就开始一步一步搞定它吧~~

原理

所谓”免密登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

准备环境

使用过SSH(包括git)的同学们都知道,在主机上都会有一个.ssh的隐藏文件夹,里面分别存放着下面这几个重要的文件:

  • 本机的公钥和私钥
  • config ssh配置文件
  • knows_hosts 主机信息文件
  • authorized_keys 公钥认证文件,里面填写自动通过认证的公钥

我们就先来依次做好准备吧。


注:
小标题后面括号中的A和B分别表示当前步骤要在A还是B上操作。

建立公钥和私钥(A)

首先我们要做的是在本机上建立自己的公钥和私钥了,没有公钥,我们是无法做到免密登录了。

1
$ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。
运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pubid_rsa。前者是你的公钥,后者是你的私钥。

我们当然也可以把这两个文件改成自己的名字(例如michael.pubmichael),不过要记得公钥后面加上.pub区分一下。

设置主机B别名(A)

为了能使用ssh host_B这样的命令来代替ssh root@192.168.1.101,我们需要修改下config配置文件。 执行:

1
$ vim ~/.ssh/config

然后添加下面的内容:

1
2
3
4
5
Host host_B
HostName "192.168.1.101"
User "root"
IdentityFile "~/.ssh/michael"
port 22

说明:

  • Host 字段就是我们要设置的主机别名
  • HostName 是主机的ip地址
  • User 表示我们使用哪个用户进行登录
  • IdentityFile 就是我们的私钥
  • port 一般ssh默认的是22端口,如果您的主机设置了特殊的端口,请自行修改

设置SSH服务(B)

首先当然是要确保主机B上的ssh服务是开启状态的。

1
$ /etc/rc.d/init.d/sshd start

如果.ssh文件夹中没有authorized_keys文件,我们就自己新建一个好了。这一步也可以省略,不过保险期间,我们还是自己来吧:

1
$ vim ~/.ssh/authorized_keys

直接wq进行保存并退出,创建一个空的文件。

接下来检查一下ssh的配置:

1
$ vim /etc/ssh/sshd_config

看看这个文件里面下面几行前面”#”注释是否取掉:

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

如果修改了配置文件,记得重启一下ssh服务

1
$ /etc/rc.d/init.d/sshd restart

最后一定要确保ssh文件的权限,对于其他组用户不能太高:

1
2
$ chmod 700 .ssh  
$ chmod 600 authorized_keys

上传公钥

这里有2个方法上传我们的公钥,命令行上传和手动粘贴公钥信息

命令行上传

在我们的主机A上,执行下面的命令:

1
$ ssh-copy-id -i ~/.ssh/michael.pub host_B

说明:

  • -i后跟上公钥的绝对地址
  • 后面再跟上主机名称,因为我们之前配置过了,所以用host_B来代替,你也可以输入 `root@192.168.1.101`

这里因为我们还没有完成免密认证,所以需要输入主机B的登录密码,上传成功之后,整个过程就配置好了!!

直接拷贝

我们首先登录到主机B上,然后手动将自己的公钥内容,粘贴到authorized_keys文件后面。
不过因为容易出现格式错误,所以我们强烈推荐使用命令行方式进行上传。

上传成功后,我们就可以在命令行中直接输入下面的命令,看看是不是就不用再输入密码,直接登录上去了

1
$ ssh host_B

有没有很爽?!

致谢&参考

Contents
  1. 1. 原理
  2. 2. 准备环境
    1. 2.1. 建立公钥和私钥(A)
    2. 2.2. 设置主机B别名(A)
    3. 2.3. 设置SSH服务(B)
  3. 3. 上传公钥
    1. 3.1. 命令行上传
    2. 3.2. 直接拷贝
  4. 4. 致谢&参考