多台计算机之间的ssh无密钥登陆

  在不少分布式系统中,咱们最常遇到的一个问题是,须要在服务器集群上保证多台机器之间的SSH无密钥登陆。以Hadoop为例,为了方便,咱们须要在master和slaves之间配置密钥登陆,这样咱们启动Hadoop时就不用一个个输入密码了。问题是在配置无密钥登陆过程当中,若是集群机器不少,咱们要将master机器上产生的公钥分发给全部的slaves, 分发一次就要输入一次密码,这种超费体力的活咱们何不交给计算机本身来作呢? 因而就有了这篇文章。html

1. 准备工做python

  • 集群机器信息

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

主机名 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用户)github

  • maste机器配置

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

  


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

  • 安装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。 less

2. 无密钥登陆程序ssh

  下面两个脚本就是本文中实现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="111111"

#命令参数为保存全部slave节点ip地址文件,一个ip一行
if [ $# != 1 ]; then
    echo "need ip list file"
    exit
fi
ip_list_file=$1

# 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[1]
user_name = sys.argv[2]
pwd = sys.argv[3]
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 == 0:
            child.sendline(pwd)
        elif i == 1:
            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

相关文章
相关标签/搜索