使用python脚本批量向多个主机发送ssh公钥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python脚本批量向多个主机发送ssh公钥相关的知识,希望对你有一定的参考价值。

适用场景:

  流行的自动化运维之一:ansible是基于ssh通信来实现的。因此,使用ansible之前,需要先解决ansible服务端与各个被管理节点之间的ssh通信问题。第一种方法是使用用户名和密码的方式进行ssh通信,密码需要以明文方式保存在ansible的hosts文件中,存在泄漏密码的安全隐患。第二种方法是基于密钥来实现免密码的ssh通信,因此需要先将自己的公钥发送给所有被管理节点。

  以下脚本可以免交互地自动向多个远程主机发送公钥。脚本是使用python 2.7编写的,需要先安装pexpect模块,安装方法:easy_install pexpect

  可以根据需要修改远程主机列表,远程主机用户,ssh端口号以及需要发送的公钥路径:

#!/usr/bin/env python
#coding: utf-8
import pexpect
import sys
import os
def putPublicKey(publicKey,user,servers,port):
    for server in servers:
        child = pexpect.spawn("/usr/bin/ssh-copy-id -p %s -i %s %[email protected]%s" %(port,publicKey,user,server))
        index = child.expect(["yes/no","password","exist",pexpect.exceptions.EOF, pexpect.TIMEOUT])
        if index != 0 and index != 1:
            print ("未向%s上传公钥匙"%(server))
            child.close(force=True)
        else:
            print ("开始向%s上传公钥"%(server))
            child.sendline("yes")
            child.expect("password")
            child.sendline("12345")
            child.expect("added")
            print ("已向%s上传公钥"%(server))
            print 
    print ("任务执行完成")
if __name__ == ‘__main__‘:
    user = "root"     #指定远程主机用户名
    servers = ["lb1","lb2"]  #指定远程主机列表
    port = "2222"  #指定远程主机的ssh端口
    publicKey = "/home/ansible/.ssh/id_rsa.pub"  #指定要上传的公钥
     #如果指定的公钥不存在,自动创建
    if not os.path.exists(publicKey):
         direname = os.path.dirname(publicKey)
         print("指定公钥不存在,将自动生成私钥和公钥,路径为:%s"%(direname))
         child = pexpect.spawn("ssh-keygen -t rsa -P ‘‘ -f %s/id_rsa" %(direname))
         child.expect(pexpect.exceptions.EOF)
         child.close(force=True)
         print ("已生成私钥和公钥")
         print 
    putPublicKey(publicKey,user,servers,port)


效果:


技术分享


以上是关于使用python脚本批量向多个主机发送ssh公钥的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本实现ssh-copy-id批量自动发送公钥到远程主机

使用sshpass 和 ssh-copy-id批量拷贝公钥到远程主机

Expect实现批量主机公钥推送

SSH免密登录

免交互方式批量分发公钥脚本

SSH验证原理