做为一名 linux 管理员,在多台 Linux 服务器上登录进行远程操做是天天工做的一部分。但随着服务器的增多,每次登录,系统都会提示输入用户名和密码,频繁的输入用户名和密码是一件让人很烦的事情。也许有人说能够用一些客户端工具,好比:SecureCRT 等,的确使用这些软件会方便不少,可是这些软件不是价格昂贵的商业软件就是依附于特定平台才能安装使用,因此我今天介绍的是使用 ssh 自带的功能实现使用客户端工具所能带来的便利,那就是使用 ssh 的公钥密钥实现自动登录。linux
测试环境:
操做系统:Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
软件版本:OpenSSH_3.9p1, OpenSSL 0.9.7a
管理服务器: ip:192.168.0.1 机器名:server
被管理服务器:ip:192.168.0.2 机器名:client算法
第一步:生成 ssh 公钥密钥对
首先,若是你没有安装OpenSSH,请先安装,这个废话了,咱们如今的 linux 服务器默认都安装 openssh 的软件。
生成公钥密钥对是在管理服务器上生成的:缓存
[root@server ~]# ssh-keygen -b 1024 -t rsa Enter file in which to save the key (/home/usrname/.ssh/id_dsa): #询问公钥和私钥存放的位置,回车用默认位置便可服务器 Enter passphrase (empty for no passphrase): #询问输入私钥密语,输入密语ssh Enter same passphrase again: #再次提示输入密语确认ide Your identification has been saved in /home/usrname/.ssh/id_dsa. #提示公钥和私钥已经存放在/root/.ssh/目录下 The key fingerprint is: |
简单说明一下:
-b 1024 采用长度为1024字节的公钥/私钥对,最长4096字节,通常1024或2048就足够知足安全须要了,太长的话加密解密须要的时间也增加。
-t rsa 采用rsa加密方式的公钥/私钥对,除了rsa还有dsa方式,rsa方式最短不能小于768字节长度。
若是还须要使用更多其余参数请参考man ssh-keygen。加密
在生成密钥对的过程当中你被询问:输入密码短句 Enter passphrase (empty for no passphrase) ,密码短句(passphrase)是你使用一个短语或者一句话做为密码输入,再由系统内部的加密或是散列算法生成虚拟密码后,进行下一步的认证。好处是加强了安全性不易被破解。看过不少文章,里面都把这个短句输入为空,也就是表明不使用密码短句。在这里我强烈要求你输入密码短句。有人会说使用密码短句后,登录还要输入密码短句这样使用没有比使用用户名和密码登录方便多少,我说请你不要急,接着看个人文章。
注意:若是你生成密钥对而不设置密码短语,那么若是你的私钥丢失了,那么就你的麻烦可能会比丢失用户名密码还严重。
第二步:拷贝你的公钥到被管理的服务器上
在你的管理服务器上把你的公钥拷贝到被管理服务器上要进行自动登录的用户目录下。
[root@server ~]# scp .ssh/id_dsa.pub remote_usrname@192.168.0.2: #好比你想使用用户peter登录,则remote_usrname请以peter代替 |
更名和进行权限设置
登录被管理的服务器,进入须要远程登录的用户目录,把公钥放到用户目录的 .ssh 这个目录下(若是目录不存在,须要建立~/.ssh目录,并把目录权限设置为700),把公钥更名为authorized_keys2,而且把它的用户权限设成600。
[peter@client ~]$ ls id_rsa.pub [peter@client ~]$ mkdir ~/.ssh #若是当前用户目录下没有 .ssh 目录,请先建立目录 [peter@client ~]$ chmod 700 ~/.ssh [peter@client ~]$ mv id_rsa.pub ~/.ssh [peter@client ~]$ cd ~/.ssh [peter@client ~]$ cat id_rsa.pub >> authorized_keys2 [peter@client ~]$ rm -f id_rsa.pub [peter@client ~]$ chmod 600 authorized_keys2 [peter@client ~]$ ls -l total 4 -rw------- 1 peter peter 225 Oct 10 11:28 authorized_keys2 |
测试使用密钥对进行远程登录
[root@server ~]# ssh peter@192.168.0.2 Enter passphrase for key '/root/.ssh/id_rsa': #提示输入密码短语,请输入刚才设置的密码短语 Last login: Sun Oct 10 11:32:14 2010 from 192.168.0.1 [peter@client ~]$ |
若是你不能用正确的登陆,应该从新检查一下你的authorized_keys2的权限。也可能要检查.ssh目录的权限。
使用 ssh-agent(ssh代理)自动输入密码短语
牢记你的“密码短句”,如今你能够用你的密钥而不是密码来登陆你的服务器了,可是这样仍然没有省什么事,你仍是要输入密钥的“密码短语”。有更简便的方法吗?答案就是采用SSH代理(ssh-agent),一个用来帮你记住“密码短语”的程序。 ssh-agent是OpenSSH中默认包括的ssh代理程序。
登录管理服务器
[root@server ~]# ssh-agent SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK; SSH_AGENT_PID=2148; export SSH_AGENT_PID; echo Agent pid 2148; |
当你运行ssh-agent,它会打印出来它使用的 ssh 的环境和变量。要使用这些变量,有两种方法,一种是手动进行声明环境变量,另外一种是运行eval命令自动声明环境变量。
方法一:手动声明环境变量
[root@server ~]# SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK; [root@server ~]# SSH_AGENT_PID=2148; export SSH_AGENT_PID; [root@server ~]# printenv | grep SSH #检查 ssh 环境变量是否已经加入当前会话的环境变量 SSH_AGENT_PID=2148 SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147 |
方法二:运行eval命令自动声明环境变量
[root@server ~]# eval `ssh-agent` Agent pid 2157 [root@server ~]# printenv | grep SSH #检查 ssh 环境变量是否已经加入当前会话的环境变量 SSH_AGENT_PID=2148 SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147 |
如今 ssh-agent 已经在运行了,可是 ssh-agent 里面是空白的不会有解密的专用密钥。咱们要告诉它咱们有私钥和这个私钥在哪儿。这就须要使用 ssh-add 命令把咱们的专用密钥添加到 ssh-agent 的高速缓存中。
[root@server ~]# ssh-add ~/.ssh/id_dsa
|
输入了密码短句,如今好了,你能够登陆你的远程服务器而不用输入你的密码短语了,并且你的私钥是密码保护的。试试看是否是很爽!
[root@server ~]# ssh peter@192.168.0.2 Last login: Sun Oct 10 11:32:45 2010 from 192.168.0.1 [peter@client ~]$ |
登录服务器进行操做结束后,记得还要把 ssh-agent 关掉,否则其余人登录后也能够远程了。
[root@server ~]# ssh-agent -k unset SSH_AUTH_SOCK; unset SSH_AGENT_PID; echo Agent pid 2148 killed; [root@server ~]# ssh-add -l #查看一下,缓存里已经没有了密钥了 The agent has no identities. |
呵呵,爽了吧,固然了若是管理数量众多的服务器(服务器数量≥2位数),第一次上传公钥可能会是比较累的工做,可是之后就能够在维护工做中体会这种公钥密钥自动登录的便利了。