国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解python之簡單主機批量管理工具

2019-11-25 16:22:51
字體:
供稿:網(wǎng)友

今天做了一個很簡單的小項目,感受到了paramiko模塊的強大,也深感自己Linux的功力不行~~

一、需求

二、簡單需求分析及流程圖

需求很少,我就簡單地說下:

1. 主機分組可以配置文件實現(xiàn)(我用字典存數(shù)據(jù)的).

2. 登陸功能不做。選擇分組后可查看組內(nèi)對應(yīng)主機的主機名和IP地址.

3. >>>cmd: df(輸入命令則起多個線程(視組內(nèi)有多少個主機而定)同時執(zhí)行)

輸出:

-------------h(huán)1------------

……(命令返回的數(shù)據(jù))

-------------h(huán)2------------

……

>>>put  test.yy(本地文件)   filename (把本地的test.yy文件傳到遠程主機的/root目錄下)

4.可寫在配置文件中。包括遠程主機的: 主機名 IP 用戶名 密碼 端口

流程圖

三、目錄結(jié)構(gòu)及源代碼

目錄結(jié)構(gòu):

from_windows.py(待上傳的文件)

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

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

core.py(核心代碼,被接口調(diào)用)

"""核心代碼"""import settingsimport paramikoimport threadingimport osclass 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):    """起線程連接遠程主機后調(diào)用"""    cmd_str = self.cmd.split()[0]    if hasattr(self, cmd_str):   #反射 eg:調(diào)用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)() #調(diào)用command方法,執(zhí)行批量命令處理  def command(self):    """批量命令處理"""    ssh = paramiko.SSHClient() #創(chuàng)建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):  """根據(jù)選擇的分組主機起多個線程進行批量交互"""  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() # 主線程等待子線程執(zhí)行完畢    else:      continuedef 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文件,上傳后就有了!

 以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 西青区| 宝丰县| 通辽市| 新巴尔虎左旗| 邛崃市| 东安县| 达日县| 海丰县| 西城区| 牟定县| 丹巴县| 华阴市| 梓潼县| 繁昌县| 海林市| 长治县| 鄂托克前旗| 津市市| 巴林左旗| 佛学| 大埔县| 镇坪县| 达拉特旗| 汉川市| 平安县| 庆安县| 灵石县| 泗阳县| 龙胜| 长丰县| 彭水| 淮北市| 乌拉特后旗| 灌南县| 怀远县| 纳雍县| SHOW| 于田县| 常山县| 井研县| 德钦县|