导读 作为系统管理员,你计划在 Linux 上使用 OpenSSH,完成日常工作的自动化,比如文件传输、备份数据库转储文件到另一台服务器等。为实现该目标,你需要从主机 A 能自动登录到主机 B。自动登录也就是说,要在 shell 脚本中使用ssh,而无需要输入任何密码。
本文会告诉你怎样在 CentOS/RHEL 上设置 SSH 免密码登录。自动登录配置好以后,你可以通过它使用 SSH (Secure Shell)和安全复制 (SCP)来移动文件。
SSH 是开源的,是用于远程登录的最为可靠的网络协议。系统管理员用它来执行命令,以及通过 SCP 协议在网络上向另一台电脑传输文件。
通过配置 SSH 免密码登录,你可以享受到如下的便利:
◆用脚本实现日常工作的自动化。
◆增强 Linux 服务器的安全性。这是防范虚拟专用服务器(VPS)遭受暴力破解攻击的一个推荐的方法,SSH 密钥单凭暴力破解 是几乎不可攻破的。
什么是 Ssh-Keygen
ssh-keygen 是一个用来生成、创建和管理 SSH 认证用的公私钥的工具。通过 ssh-keygen 命令,用户可以创建支持SSH1 和 SSH2 两个协议的密钥。ssh-keygen 为 SSH1 协议创建 RSA 密钥,SSH2 则可以是 RSA 或 DSA。
什么是 Ssh-Copy-Id
ssh-copy-id 是用来将本地公钥拷贝到远程的 authorized_keys 文件的脚本命令,它还会将身份标识文件追加到远程机器的 ~/ssh/authorized_keys 文件中,并给远程主机的用户主目录适当的的权限。
SSH 密钥
SSH 密钥为登录 Linux 服务器提供了更好且安全的机制。运行 ssh-keygen 后,将会生成公私密钥对。你可以将公钥放置到任意服务器,从持有私钥的客户端连接到服务器的时,会用它来解锁。两者匹配时,系统无需密码就能解除锁定。
在 CentOS 和 RHEL 上设置免密码登录 SSH
以下步骤在 CentOS 5/6/7、RHEL 5/6/7 和 Oracle Linux 6/7 上测试通过。
节点1:19216809 节点2 : 192168010
本章目录结构 [收起]
步骤一 :
步骤二:
步骤三:
步骤四:
步骤一 :
测试节点1到节点2的连接和访问:
[root@node1 ~]# ssh root@192168010
The authenticity of host '192168010 (192168010)' can't be established
RSA key fingerprint is 6d:8f:63:9b:3b:63:e1:72:b3:06:a4:e4:f4:37:21:42
Are you sure you want to continue connecting (yes/no) yes
Warning: Permanently added '192168010' (RSA) to the list of known hosts
root@192168010's password:
Last login: Thu Dec 10 22:04:55 2015 from 19216801
[root@node2 ~]#
步骤二:
使用 ssh-key-gen 命令生成公钥和私钥,这里要注意的是可以对私钥进行加密保护以增强安全性。
[root@node1 ~]# ssh-keygen
Generating public/private rsa key pair
Enter file in which to save the key (/root/ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/ssh/id_rsa
Your public key has been saved in /root/ssh/id_rsapub
The key fingerprint is:
b4:51:7e:1e:52:61:cd:fb:b2:98:4b:ad:a1:8b:31:6d root@node1ehowstufflocal
The key's randomart image is:
+--[ RSA 2048]----+
| ++ |
| o o o |
| o o o |
| o + |
| S |
| |
| o E ooo |
| = ooo |
| oo |
+-----------------+
步骤三:
用 ssh-copy-id 命令将公钥复制或上传到远程主机,并将身份标识文件追加到节点2的 ~/ssh/authorized_keys 中:
[root@node1 ~]# ssh-copy-id -i ~/ssh/id_rsapub 192168010
root@192168010's password:
Now try logging into the machine, with "ssh '192168010'", and check in:
ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting
步骤四:
验证免密码 SSH 登录节点2:
[root@node1 ~]# ssh root@192168010
Last login: Sun Dec 13 14:03:20 2015 from >创建ssh公私钥
首先你需要放弃使用的密码登录的方式,因为那种方式实在太让人崩溃了 下面我们开始使用一种被称为“公私钥“认证的方式来进行ssh登录 “公私钥“认证方式简单的解释是
你需要创建一对公私钥
然后把公钥放到服务器上, 自己保留好私钥
当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配如果匹配成功就可以登录了
我们现在来点实际的, 我们有两台机器: qianjianingycom(这是我们的服务器, 实际上它是我的), nbyjianingycom(这是我的笔记本) 首先,使用ssh-keygen程序在笔记本上创建公私钥对
生成公私钥
jianingy@nby:~$ ssh-keygen
Generating public/private rsa key pair
Enter file in which to save the key (/home/jianingy/ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa
Your public key has been saved in id_rsapub
The key fingerprint is:
15:c6:44:59:bf:6f:7a:11:eb:cb:02:d4:aa:33:e0:ae jianingy@nby
ssh-keygen程序会寻问你把公私钥文件存放在哪里根据传统我们会把它放在~/ssh里面如果你不想
追随这个传统, 你可能给花些时间游说那些ssh程序至于公私钥的名字, 用默认的id_rsa吧,道理是一样的
接下来输入一个口令,用来保护这个私钥 我强烈建议你输入这个口令而不是让它为空(稍后我会解释的) 现在公私钥生成好了,
私钥(identification)被保存成了id_rsa, 公钥(public key)被保存成id_rsapub 注意:
一定要保护好你的私钥,他就像你家里存家底的保险柜的钥匙一样重要
现在把doggypub拷贝到服务器上去, 并且将其内容追加到一个叫~/ssh/authorized_keys的文件里去
jianingy@nby:~$ cat /home/jianingy/ssh/doggypub | ssh 19216819 "cat - >> ~/ssh/authorized_keys"
好现在试试看ssh登录吧 如果你想了解更多可以试试看用ssh -v登录
使用密钥登录
jianingy@nby:~$ ssh qianjianingycom
Enter passphrase for key '/home/jianingy/ssh/id_rsa':
现在输入你的passphrase, 然后就能成功登录了的确, 到现在我们还不能无密码登录,
请再耐心点 有个特例是, 如果你使用了空的passphrase,
那么现在已经可以无密码登录了但是我也必须提醒你这是很不安全的做法,一旦有人复制了你的passphrase, 它就真的成了机房“任我行“了
使用ssh-agent提供私钥
接
下来是最关键的部分 前面我们把输入密码变成了输入passphrase,
这没有带来任何方便但是,要知道有个家伙能帮助我们自动输入这个passphrase(只是看起来像是自动输入而已)
我们只要输入一次passphrase, 以后的工作就可以交给那家伙了 它就是ssh-agent(据我所知他和agent
smith没有太多关系) 运行ssh-agent吧
jianingy@nby:~$ eval `ssh-agent`
jianingy@nby:~$ ssh-add
运行ssh-add添加密钥
jianingy@nby:~$ ssh-add
Enter passphrase for /home/jianingy/ssh/id_rsa:
Identity added: /home/jianingy/ssh/id_rsa (/home/jianingy/ssh/id_rsa)
好了,现在再次登录服务器, 我们已经没有密码的烦恼了至于为什么要用这么奇怪的方式运行ssh-agent, 你可以试着在命令行上输入一个ssh-agent回车, 看看输出什么你就会明白了
复用已经存在的ssh-agent
如
果你看了上面直接运行ssh-agent的输出,你应该已经明白了ssh和ssh-agent是如何相互了解的 没错,
通过环境变量ssh知道了与ssh-agent通信的unix
socket在哪里然而当我们打开一个新的终端时我们必须要重新设置这个环境变量做为一个慵懒的系统管理员,这是不可忍受的所以我用perl写了这
个脚本, 他可以找到以前的ssh-agent
view sourceprint
01#!/usr/bin/env perl
02# author: jianingy
03# 2007/06/24
04
05use strict;
06my $exist;
07my @dirs = grep {-r $_} glob "/tmp/ssh-";
08foreach (@dirs) {
09 my @socks = glob("{$_}/agent");
10 next unless (@socks);
11 foreach (@socks) {
12 $exist = $_;
13 # check agent
14 unless (system "SSH_AUTH_SOCK=$_ ssh-add -l >/dev/null 2>&1") {
15 print "export SSH_AUTH_SOCK=$_\n";
16 exit 0;
17 }
18 }
19}
20
21if ($exist) {
22 system "SSH_AUTH_SOCK=$exist ssh-add";
23 print "export SSH_AUTH_SOCK=$exist\n";
24} else {
25 system "ssh-agent";
26 exec $0;
27}
现在只需要在bashrc里加入
eval `ssh-attach`
便可以在每次启动终端的时候就能复用ssh-agent了到了这里我们已经实现了免密码的ssh登录(当然至少要输入一次passphrase, 但是相对于无数次的密码输入相信你不会在乎这一次的:P)1
[root@localhost ssh]# /usr/bin/ssh-keygen -t rsa
Generating public/private rsa key pair
Enter file in which to save the key (/root/ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/ssh/id_rsa
Your public key has been saved in /root/ssh/id_rsapub
The key fingerprint is:
30:f6:d7:2a:ac:56:eb:3f:fa:40:25:8d:90:96:68:cb
root@localhostlocaldomain
在主机/ssh目录下生成密匙
使用ssh的rsa密匙
其中
id_rsa 私匙
id_rsapub 公匙
下述命令产生不同类型的密钥
ssh-keygen -t dsa
ssh-keygen -t rsa
ssh-keygen -t rsa1
2
[root@localhost ssh]# scp /root/ssh/id_rsapubroot@172161425:/root/ssh/authorized_keys
The authenticity of host '172161425 (172161425)' can't be established
RSA key fingerprint is 4b:a5:74:fb:2e:08:60:af:fa:76:d4:b0:26:4c:13:75
Are you sure you want to continue connecting (yes/no) yes
Warning: Permanently added '172161425' (RSA) to the list of known hosts
root@172161425's password:
id_rsapub 100% 236 02KB/s 00:00
说明:
将公钥拷贝到远端主机,并写入授权列表文件
你也可以把公钥文件拷贝过去后,在远端主机下直接执行
touch /root/ssh/authorized_keys
cat /root/ssh/id_rsapub >> /root/ssh/authorized_keys
3
*** 作完毕,登陆检查。
[root@localhost ssh]# ssh 172161425
root@172161425's password:
请注意此时如果仍提示输入密码,请检查如下文件夹和文件的 *** 作权限,这是非常重要的, 否则ssh公钥认证体制不能正常工作:
172161424(客户端)
/home/root文件夹的权限是600
/home/root/ssh文件夹的权限是600 (好像这个权限关系不是很大)
/home/root/ssh/id_dsa私钥的权限600
172161425(远端主机)
/home/root文件夹的权限是644
/home/root/ssh文件夹的权限是644 (好像这个权限关系不是很大)
/root/ssh/authorized_keys公钥的权限644
4
[root@localhost ~]# ssh 172161425
Last login: Sat Dec 15 21:10:17 2007 from 172161424
[root@localhost ~]#
无密码SSH登陆成功!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)