网络编程与并发-批量主机管理工具开发

本文介绍了一个批量主机管理工具,该工具能够实现批量命令执行及文件分发功能。它利用Python的paramiko模块进行SSH连接,并采用多进程方式提高批量操作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

批量主机管理工具开发

要求

1. 实现批量命令执行、文件分发

core.py

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = "Elijah"
__date__ = "2017/10/8 13:56"

import sys

sys.path.append('../conf')
import settings
import paramiko
from multiprocessing import Process


class operation_client(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):
        '''
        起线程连接远程主机后调用
        :return:
        '''
        cmd_str = self.cmd.split()[0]
        if hasattr(self, cmd_str):  # 反射 eg:调用upload方法
            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(30, "-") % self.host)
        print(result.decode())
        ssh.close()

    def upload(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.split('\\')[-1])
        print('上传文件:' + str(filename) + ' 成功!')
        transport.close()


def show_host_list():
    """通过选择分组显示主机名与IP"""
    num_list = []
    for index, key in enumerate(settings.msg_dic):
        num_list.append(key)
        print('主机组编号:' + str(index + 1), '\n\t\t主机组名:' + str(key), '\n\t\t主机数量:' + str(len(settings.msg_dic[key])))
    while True:
        choose_host_list = input("请输入批量操作的主机组编号(或者输入q退出):>>>").strip()
        if choose_host_list.lower() == 'q':
            break
        host_dic = settings.msg_dic.get(num_list[int(choose_host_list) - 1])
        if host_dic:
            for key in host_dic:
                print(key, host_dic[key]["IP"])
            return host_dic
        else:
            print("对不起!您输入的主机组编号有误!\n")
            continue


def interactive(host_dic):
    '''
    根据选择的分组主机多线程批量操作
    :param host_dic:
    :return:
    '''
    str_info = '''
批量主机管理工具功能说明:
1、批量文件上传:upload file_path
例如:upload C:\\Users\\YG\\Desktop\\file.txt 

2、批量操作主机:df -h 、ls 、pwd ......
'''
    print(str_info)
    thread_list = []
    while True:
        command = input("请输入操作命令(或者输入q退出):>>>").strip()
        if command.lower() == 'q':
            print('感谢使用批量主机管理工具!再见!')
            break
        elif command:
            for key in host_dic:
                host, port, username, password = host_dic[key]["IP"], host_dic[key]["port"], host_dic[key]["username"], \
                                                 host_dic[key]["password"]
                func = operation_client(host, port, username, password, command)  # 实例化类
                t = Process(target=func.run)  # 起线程
                t.start()
                thread_list.append(t)
            for t in thread_list:
                t.join()  # 主线程等待子线程执行完毕
        else:
            continue


def run():
    host_dic = show_host_list()
    interactive(host_dic)

settings.py

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = "Elijah"
__date__ = "2017/10/8 13:57"


msg_dic = {
           "group1":
               {
                   "client_1": {"IP": "192.168.1.2", "username": "root", "password": "root", "port": 22},
               },
           "group2":
               {
                   "client_1": {"IP": "192.168.1.3", "username": "root", "password": "root", "port": 22},
                   "client_2": {"IP": "192.168.1.4", "username": "root", "password": "root", "port": 22},
               },
          }

main.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_
__author__ = "Elijah"
__date__ = "2017/10/8 13:57"

import sys
sys.path.append('../src')
import core

if __name__ == "__main__":
    core.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值