转发注明出处:http://www.cnblogs.com/0zcl/p/6352278.html

今天做了一个很简单的小项目,感受到了paramiko模块的强大,也深感自己Linux的功力不行~~

一、需求

二、简单需求分析及流程图

需求很少,我就简单地说下:
  1. 主机分组可以配置文件实现(我用字典存数据的).
  2. 登陆功能不做。选择分组后可查看组内对应主机的主机名和IP地址.
  3. >>>cmd: df(输入命令则起多个线程(视组内有多少个主机而定)同时执行)
    输出:
    -------------h1------------
    ……(命令返回的数据)
    -------------h2------------
    ……
    >>>put  test.yy(本地文件)   filename (把本地的test.yy文件传到远程主机的/root目录下)
  4.可写在配置文件中。包括远程主机的: 主机名 IP 用户名 密码 端口

流程图

我做的流程图https://www.processon.com/diagraming/588a1219e4b087b11659068b

三、目录结构及源代码

目录结构:

from_windows.py(待上传的文件)

main.py(批量主机管理接口)

 """批量主机管理接口"""

 import core

 if __name__ == "__main__":
core.run()

core.py(核心代码,被接口调用)

 """核心代码"""
import settings
import paramiko
import threading
import os class REMOTE_HOST(object):
#远程操作主机
def __init__(self, host, port ,username, password, cmd):
self.host = host
self.port = port
self.username = username
self.password = password
self.cmd = cmd def run(self):
"""起线程连接远程主机后调用"""
cmd_str = self.cmd.split()[0]
if hasattr(self, cmd_str): #反射 eg:调用put方法
getattr(self, cmd_str)()
else:
#setattr(x,'y',v)is equivalent to ``x.y=v''
setattr(self, cmd_str, self.command)
getattr(self, cmd_str)() #调用command方法,执行批量命令处理 def command(self):
"""批量命令处理"""
ssh = paramiko.SSHClient() #创建ssh对象
#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password)
stdin,stdout,stderr = ssh.exec_command(self.cmd)
result = stdout.read()
print("%s".center(50, "-") % self.host)
print(result.decode())
ssh.close() def put(self):
"""上传文件"""
filename = self.cmd.split()[1] #要上传的文件
transport = paramiko.Transport((self.host, self.port))
transport.connect(username=self.username, password=self.password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(filename, filename)
print("put sucesss") transport.close() def show_host_list():
"""通过选择分组显示主机名与IP"""
for index, key in enumerate(settings.msg_dic):
print(index + 1, key, len(settings.msg_dic[key]))
while True:
choose_host_list = input(">>>(eg:group1)").strip()
host_dic = settings.msg_dic.get(choose_host_list)
if host_dic:
#print(host_dic)
for key in host_dic:
print(key, host_dic[key]["IP"])
return host_dic
else:
print("NO exit this group!") def interactive(choose_host_list):
"""根据选择的分组主机起多个线程进行批量交互"""
thread_list = []
while True:
cmd = input(">>>").strip()
if cmd:
for key in choose_host_list:
host, port, username, password = choose_host_list[key]["IP"], choose_host_list[key]["port"], \
choose_host_list[key]["username"], choose_host_list[key]["password"]
func = REMOTE_HOST(host, port, username, password, cmd) # 实例化类
t = threading.Thread(target=func.run) # 起线程
t.start()
thread_list.append(t)
for t in thread_list:
t.join() # 主线程等待子线程执行完毕
else:
continue def run():
choose_host_list = show_host_list()
interactive(choose_host_list)

settings.py(配置文件)

 """配置文件"""

 msg_dic = {
"group1":{ #分组1
"h1":{"IP":"192.168.1.1", "username":"", "password":"aa", "port":22},
"h2":{"IP":"192.168.1.2", "username":"", "password":"bb", "port":22},
"h3":{"IP":"192.168.1.3", "username":"", "password":"cc", "port":22},
"h4":{"IP":"192.168.1.4", "username":"", "password":"dd", "port":22},
"h5":{"IP":"192.168.1.5", "username":"", "password":"ee", "port":22},
"h6":{"IP":"192.168.1.6", "username":"", "password":"ff", "port":22},
}, "group2":{ #分组2
"h1":{"IP":"192.168.2.1", "username":"", "password":"aaa", "port":22},
"h2":{"IP":"192.168.2.2", "username":"", "password":"bbb", "port":22},
"h3":{"IP":"192.168.2.3", "username":"", "password":"ccc", "port":22},
"h4":{"IP":"192.168.2.4", "username":"", "password":"ddd", "port":22},
"h5":{"IP":"192.168.2.5", "username":"", "password":"eee", "port":22},
"h6":{"IP":"192.168.2.6", "username":"", "password":"fff", "port":22},
"h7":{"IP":"192.168.2.7", "username":"", "password":"ggg", "port":22},
"h8":{"IP":"192.168.2.8", "username":"", "password":"hhh", "port":22},
}, "group3":{
"h1":{"IP":"192.168.179.133", "username":"root", "password":"zcl", "port":22},
}
}

测试:

硬件限制,我只用连接一台虚拟机测试~

C:\Python34\python3.exe C:/Users/Administrator/PycharmProjects/laonanhai/host_manage/main.py
1 group1 6
2 group3 1
3 group2 8
>>>(eg:group1)group3
h1 192.168.179.133
>>>put from_windows.py
put sucesss
>>>
>>>ls
------------------------192.168.179.133------------------------
anaconda-ks.cfg
database_test
from_windows.py
install.log
install.log.syslog
m
oot
\root
tmp\from_windows.py >>>

上传前没有from_windows.py文件,上传后就有了!

PS:关于paramiko模块可以看看这篇博客http://www.cnblogs.com/starof/p/4670433.html

python之简单主机批量管理工具的更多相关文章

  1. Python开发程序:简单主机批量管理工具

    题目:简单主机批量管理工具 需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ### 作者介绍: * au ...

  2. Python简单主机批量管理工具

    一.程序介绍 需求: 简单主机批量管理工具 需求: 1.主机分组 2.主机信息使用配置文件 3.可批量执行命令.发送文件,结果实时返回 4.主机用户名密码.端口可以不同 5.执行远程命令使用param ...

  3. 简单主机批量管理工具(这里实现了paramiko 用su切换到root用户)

    项目名:简单主机批量管理工具 一.需求 1.主机分组 2.可批量执行命令.发送文件,结果实时返回,执行格式如下 batch_run  -h h1,h2,h3   -g web_clusters,db_ ...

  4. python 简单主机批量管理工具

    需求: 主机分组 主机信息配置文件用configparser解析 可批量执行命令.发送文件,结果实时返回,执行格式如下  batch_run  -h h1,h2,h3   -g web_cluster ...

  5. 【Python之旅】第六篇(七):开发简易主机批量管理工具

    [Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...

  6. Linux系统——Ansible批量管理工具

    批量管理工具: (1)ansible 操作简单(适用于500台以下服务器) (2)saltstack 比较复杂(一般适用于1000-4w台服务器) (3)puppet超级复杂 systemctl(统一 ...

  7. 轻量级批量管理工具pssh

    pssh工具 pssh工具是个轻量级的批量管理工具,相比同类型的开源工具 Ansible,Saltstack,他比较轻量级,需要对管理的主机做秘钥认证 Ansible是可以做秘钥认证,也可以通过配置文 ...

  8. windows下运行的linux服务器批量管理工具(带UI界面)

    产生背景: 由于做服务器运维方面的工作,需要一人对近千台LINUX服务器进行统一集中的管理,如同时批量对LINUX服务器执行相关的指令.同时批量对LINUX服务器upload程序包.同时批量对LINU ...

  9. Linux下批量管理工具pssh安装和使用

    Linux下批量管理工具pssh安装和使用 pssh工具包 安装:yum -y install pssh pssh:在多个主机上并行地运行命令 pscp:把文件并行地复制到多个主机上 prsync:通 ...

随机推荐

  1. EasyUI中dialog中嵌入form细节问题记录

    当代码如下: function myClear() { $("#add_form").form("reset"); $("#add_dialog&qu ...

  2. hibernate---关联关系的 crud_cascade_fetch

    CRUD怎么写?? 存user信息, 自动存group信息 user.java package com.bjsxt.hibernate; import javax.persistence.Cascad ...

  3. hibernate---一对一单向外键关联--XML

    Student.java: package com.bjsxt.hibernate; public class Student { private int id; private String nam ...

  4. 滚动时div的背景图片随之滚动

    在浏览一些网站时发现有一种效果是当滚动时看到某一DIV的背景也会随之滚动,如下: 当滚动时内容位置保持不变,但是内容后面的背景却在随着滚动.随之我通过审查元素看到了其是通过background-pos ...

  5. 控制流之for

    for..in是另外一个循环语句,它在一序列的对象上 递归 即逐一使用队列中的每个项目.我们会在后面的章节中更加详细地学习序列.使用for语句~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  6. Laravel 数据插入

    Laravel 的数据库操作基于 Eloquent ORM,在插入数据时有以下几种方式,返回结果也不会不同: 1.insert 插入后会返回 true or false: 2.create 插入成功后 ...

  7. label中添加图片

    创建NSTextAttachment的对象,用来装在图片 将NSTextAttachment对象的image属性设置为想要使用的图片 设置NSTextAttachment对象bounds大小,也就是要 ...

  8. iOS 添加手机密码、指纹进行安全验证

    为APP添加安全验证 1.导入头文件 #import <LocalAuthentication/LocalAuthentication.h> 2.添加手机密码验证 //创建安全验证对象 L ...

  9. 解决浏览器不支持HTML5和CSS3

    Modernizr插件可用于解决:<响应式web设计>提及! 其他: 第一种方法:IE9以下版本的IE将创建HTML5标签, 非IE浏览器会忽略这段代码,因此不会发生http请求,也就不影 ...

  10. USB自定义HID设备实现-STM32

    该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...