在很多分布式系统中,我们最常遇到的一个问题是,需要在服务器集群上保证多台机器之间的SSH无密钥登录。以Hadoop为例,为了方便,我们需要在master和slaves之间配置密钥登录,这样我们启动Hadoop时就不用一个个输入密码了。问题是在配置无密钥登录过程中,如果集群机器很多,我们要将master机器上产生的公钥分发给所有的slaves, 分发一次就要输入一次密码,这种超费体力的活我们何不交给计算机自己来做呢? 于是就有了这篇文章。

1. 准备工作

  • 集群机器信息

    本次实验使用Openstack云平台来创建测试集群, 所有节点采用的配置为CPU: 1Core MEM: 512M Disk: 10G OS: CentOS 6.4. 各个节点的详细信息如下表:

主机名 IP地址
master 172.16.0.200
slave1 172.16.0.201
slave2 172.16.0.202
slave3 172.16.0.203
slave4 172.16.0.204

    注意: 由Openstack创建的所有节点的初始登录用户名密码均相同(本实验中使用root用户)

  • maste机器配置

    1. 登录到master机器, 打开文件ssh_config(/etc/ssh_config), 在ssh_config文件中找到Host *这一行,在下面行中加入 StrictHostKeyChecking no 如下图:

  

    2. 生成ssh密钥, 命令: ssh-keygen -t rsa。不用管提示,一路回车即可。最后会生成两个密钥文件id_rsa, id_rsa.pub, 分别为私钥和公钥。公钥是我们待会要发送给各个slave节点的。

  • 安装pexpect(Python 模块)

    在配置无密钥登录的过程中,最重要的一步是将master生成id_rsa.pub文件拷贝的各个slave节点上,并追加到各个slave节点的authorized_keys文件中(上面两步操作也可以使用ssh提供的ssh-copy-id命令,本文用的就是这种方法)。但在拷贝过程中会让我们输入slave节点的密码。这也是阻碍我们自动化配置无密钥登录的最大障碍。 为了解决这个问题,本文采用python的pexpect模块,该模块能够让程序与shell命令进行交互。 pexpect下载地址: https://pypi.python.org/pypi/pexpect/ , 下载完成后,解压。解压后在目录下运行:python ./setup.py install(root权限) 安装完成以后,就可以进行我们下一步的工作了。

    另外我们也可以直接安装expect工具。具体的请百度 expect。

2. 无密钥登录程序

  下面两个脚本就是本文中实现SSH批量无密钥登录的程序,free_login.sh配置slave的用户名密码,并调用free_login.py,  free_login.py负责将master的公钥拷贝到各个slave机器上。代码如下:

free_login.sh

#!/bin/bash

#slave节点的user_name和password
user_name="root"
user_pass="" #命令参数为保存所有slave节点ip地址文件,一个ip一行
if [ $# != ]; then
echo "need ip list file"
exit
fi
ip_list_file=$ # first invoke free_python.py to setup passphraseless ssh to
# all hosts in ip list file `./free_login.py ${ip_list_file} ${user_name} ${user_pass}`

free_login.py

#!/usr/bin/python

import os
import pexpect
import sys file_path = sys.argv[]
user_name = sys.argv[]
pwd = sys.argv[]
file = open(file_path,"r")
lines = file.readlines()
for line in lines:
line = line.strip('\n')
print "set free login on host:%s" % line
child = pexpect.spawn('ssh-copy-id -i /root/.ssh/id_rsa.pub ' + user_name + '@' + line)
message = ''
try:
i = child.expect(['[Pp]assword:','continue connecting (yes/no?)'])
if i == :
child.sendline(pwd)
elif i == :
child.sendline('yes')
child.expect('[Pp]assword')
child.sendline(pwd)
else:
pass
except pexpect.EOF:
message = child.read()
child.close()
else:
message = child.read()
child.expect(pexpect.EOF)
child.close()

  注意,在使用时,free_login和free_login.py应放在同一个目录下。执行如下命令,即可完成无密钥登录操作。

bash ./free_login 'ip list file'

  以上便是自动化无密钥登录的全部过程,上面用到的代码和工具可以到github上下载,地址: https://github.com/meibenjin/FreeLogin

本文来自博客园,如果查看原文请点击:  http://www.cnblogs.com/meibenjin/p/3434178.html

多台计算机之间的ssh无密钥登录的更多相关文章

  1. 016 在大数据中,SSH无密钥登录

    一:概述 1.关于ssh ssh是一种安全协议. 会生成一对公钥和私钥. 2.问题的由来 3.解决方式 将生成的公钥发送到远程的机器上. 4.位置 主目录下的.ssh文件下. 二:在伪分布式下的操作 ...

  2. 服务器间打通ssh无密钥

    1 打通无密钥 配置HDFS,首先就得把机器之间的无密钥配置上.我们这里为了方便,把机器之间的双向无密钥都配置上. (1)产生RSA密钥信息 ssh-keygen -t rsa 一路回车,直到产生一个 ...

  3. 配置SSH无密钥登陆(三)

    配置SSH无密钥登陆 (1).关闭防火墙 对每个虚拟机进行如下操作:   su    chkconfig  iptables  off 执行之后重启虚拟机:reboot (2).关闭之后,在maste ...

  4. 基于WSAAsyncSelect模型的两台计算机之间的通信

    任务目标 编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递.客户端向服务器端发送"请输出从1到1000内所有 ...

  5. Linux机器之间SSH免密钥登录设置

    SSH免密钥登录 私钥:密钥留在本机 公钥:密钥发给其他机 hadoop01 生成密钥: ssh-keygen -t rsa (密钥存放路径:/root/.ssh) id_rsa:私钥 id_rsa. ...

  6. 无密钥登录的自动脚本实现(ssh-copy-id、expect免交互输入脚本)

    感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息. Better Me的博客:blog.csdn.net/tantexian 如需 ...

  7. linux系统ssh免密钥登录配置

    linux主机配置ssh免密钥登录,具体配置如下: 1.执行命令ssh-keygen -t rsa,生成公钥和私钥(具体步骤详见下图) 2.会在当前用户的家目录的.ssh/生成公钥和私钥, 3.执行s ...

  8. 配置docker容器上ssh无密登录

    配置docker容器上ssh无密登录 1.修改所有容器中root账户密码 ssh到远程主机时,首次需要密码访问,因此需要修改root账号密码. 密码必须要8位以上字母数字混合. $>passwd ...

  9. 集群中配置多台计算机之间ssh无密码登录的一种简便方法

    当我们在配置多台计算,使之可以相互使用无密码登录-ssh,之前都是一台一台的配置,现在一台A上添加B,然后在另一台B上再次添加A,这样使得 authorized_keys中的内容相同,但时并不是完全相 ...

随机推荐

  1. IOS-textField

    //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, ...

  2. Elasticsearch学习1--head插件安装

    1.简要介绍 elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序. 2.最近尝试学习elasticsearch,查了一些资料,但 ...

  3. Java学习----HashMap原理

    1.HashMap的数据结构 数组的特点是:寻址容易,插入和删除困难:而链表的特点是:寻址困难,插入和删除容易.那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的, ...

  4. for语句嵌套使用 实现9*9乘法表

         这个实例主要考察对for循环语句的使用,出现递增规律的乘法表. 开发环境      开发工具:Microsoft Visual Studio2010 旗舰版 具体步骤      先是制作一个 ...

  5. Winform控件Enable=false显示优化

    在B/S开发中(ASP.NET),往往可以css样式表来让页面控件更加美观,但是在C/S中(Winform)里面,我们则需要通过其他取巧的 方式来实现.例如:当你因为某个需求需要将控件设置为Reado ...

  6. NandFlash

    一.概述 1.NandFlash NAND结构能提供极高的单元密度,可以达到高存储密度,比如能达到256M,并且写入和擦除的速度也很快.应用NAND的困难在于flash的管理需要特殊的系统接口. 2. ...

  7. 项目任务管理(TaskMgr)设计篇

    为什么使用void FilllXX(TypeA pParm1, TypeB pParm2) 应用场景色:void FillXX的好处是可以不用关心实例情况:如果在方法体中需要一个实例,而方法体只知道基 ...

  8. bzoj3583: 杰杰的女性朋友 && 4362: Graph

    Description 给出一张n个点的有向图G(V,E).对于任意两个点u,v(u可以等于v),u向v的连边数为: ∑OUT(u,i) * IN(v,i),其中1<=i<=K 其中k和数 ...

  9. UIDevice-b

    typedef NS_ENUM(NSInteger, UIDeviceOrientation) //设备方向 { UIDeviceOrientationUnknown, UIDeviceOrienta ...

  10. jQuery Ajax 分页插件

    很多社交网站都使用无限滚动的翻页技术来提高用户体验,当你页面滑到列表底部时候无需点击就自动加载更多的内容 很多社交网站都使用无限滚动的翻页技术来提高用户体验,当你页面滑到列表底部时候无需点击就自动加载 ...