【Linux】SSH免密登录
阅读数:
随着虚拟机以及远程主机数量的增加,每次登陆时都需要输入密码也是一件挺麻烦的事,尤其是有的远程主机需要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.pub
和id_rsa
。前者是你的公钥,后者是你的私钥。
我们当然也可以把这两个文件改成自己的名字(例如michael.pub
和michael
),不过要记得公钥后面加上.pub
区分一下。
设置主机B别名(A)
为了能使用ssh host_B
这样的命令来代替ssh root@192.168.1.101
,我们需要修改下config
配置文件。 执行:1
$ vim ~/.ssh/config
然后添加下面的内容:
1 | Host host_B |
说明:
- 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 | RSAAuthentication yes |
如果修改了配置文件,记得重启一下ssh服务
1 | $ /etc/rc.d/init.d/sshd restart |
最后一定要确保ssh
文件的权限,对于其他组用户不能太高:
1 | $ chmod 700 .ssh |
上传公钥
这里有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 |
有没有很爽?!