• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

详解python之简单主机批量管理工具

python 搞代码 4年前 (2022-01-09) 65次浏览 已收录 0个评论

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

一、需求

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

需求很少,我就简单地说下:

1. 主机分组可以配置文件实现(我用字典存数据的).

2. 登陆功能不做。选择分组后可本文来源gao.dai.ma.com搞@代*码#网查看组内对应主机的主机名和IP地址.

3. >>>cmd: df(输入命令则起多个线程(视组内有多少个主机而定)同时执行)

输出:

-------------h1------------

……(命令返回的数据)

-------------h2------------

……

>>>put test.yy(本地文件) filename (把本地的test.yy文件传到远程主机的/root目录下)

4.可写在配置文件中。包括远程主机的: 主机名 IP 用户名 密码 端口

流程图

三、目录结构及源代码

目录结构:

from_windows.py(待上传的文件)

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

"""批量主机管理接口""" import core if __name__ == "__main__":  core.run()

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

"""核心代码"""import settingsimport paramikoimport threadingimport 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":"11", "password":"aa", "port":22},    "h2":{"IP":"192.168.1.2", "username":"22", "password":"bb", "port":22},    "h3":{"IP":"192.168.1.3", "username":"33", "password":"cc", "port":22},    "h4":{"IP":"192.168.1.4", "username":"44", "password":"dd", "port":22},    "h5":{"IP":"192.168.1.5", "username":"55", "password":"ee", "port":22},    "h6":{"IP":"192.168.1.6", "username":"66", "password":"ff", "port":22},  },   "group2":{  #分组2    "h1":{"IP":"192.168.2.1", "username":"111", "password":"aaa", "port":22},    "h2":{"IP":"192.168.2.2", "username":"222", "password":"bbb", "port":22},    "h3":{"IP":"192.168.2.3", "username":"333", "password":"ccc", "port":22},    "h4":{"IP":"192.168.2.4", "username":"444", "password":"ddd", "port":22},    "h5":{"IP":"192.168.2.5", "username":"555", "password":"eee", "port":22},    "h6":{"IP":"192.168.2.6", "username":"666", "password":"fff", "port":22},    "h7":{"IP":"192.168.2.7", "username":"777", "password":"ggg", "port":22},    "h8":{"IP":"192.168.2.8", "username":"888", "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.py1 group1 62 group3 13 group2 8>>>(eg:group1)group3h1 192.168.179.133>>>put from_windows.pyput sucesss>>>>>>ls------------------------192.168.179.133------------------------anaconda-ks.cfgdatabase_testfrom_windows.pyinstall.loginstall.log.syslogmoot\roottmp\from_windows.py >>>

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持搞代码

更多详解python之简单主机批量管理工具相关文章请关注搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:详解python之简单主机批量管理工具

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址