最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python之簡(jiǎn)單主機(jī)批量管理工具

 更新時(shí)間:2017年01月27日 11:47:12   作者:前程明亮  
這篇文章主要介紹了詳解python之簡(jiǎn)單主機(jī)批量管理工具,具有一定的參考價(jià)值,有興趣的可以了解一下。

今天做了一個(gè)很簡(jiǎn)單的小項(xiàng)目,感受到了paramiko模塊的強(qiáng)大,也深感自己Linux的功力不行~~

一、需求

二、簡(jiǎn)單需求分析及流程圖

需求很少,我就簡(jiǎn)單地說(shuō)下:

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

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

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

輸出:

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

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

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

……

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

4.可寫在配置文件中。包括遠(yuǎn)程主機(jī)的: 主機(jī)名 IP 用戶名 密碼 端口

流程圖

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

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

from_windows.py(待上傳的文件)

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

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

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

"""核心代碼"""
import settings
import paramiko
import threading
import os


class REMOTE_HOST(object):
  #遠(yuǎn)程操作主機(jī)
  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):
    """起線程連接遠(yuǎn)程主機(jī)后調(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對(duì)象
    #允許連接不在know_hosts文件中的主機(jī)
    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():
  """通過(guò)選擇分組顯示主機(jī)名與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ù)選擇的分組主機(jī)起多個(gè)線程進(jìn)行批量交互"""
  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) # 實(shí)例化類
        t = threading.Thread(target=func.run) # 起線程
        t.start()
        thread_list.append(t)
      for t in thread_list:
        t.join() # 主線程等待子線程執(zhí)行完畢
    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è)試:

硬件限制,我只用連接一臺(tái)虛擬機(jī)測(cè)試~

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

>>> 

上傳前沒(méi)有from_windows.py文件,上傳后就有了!

 以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python的re正則表達(dá)式實(shí)例代碼

    python的re正則表達(dá)式實(shí)例代碼

    這篇文章主要介紹了python的re正則表達(dá)式,分享了一則re模塊實(shí)現(xiàn)的正則表達(dá)式實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python pygame繪制文字制作滾動(dòng)文字過(guò)程解析

    Python pygame繪制文字制作滾動(dòng)文字過(guò)程解析

    這篇文章主要介紹了Python pygame繪制文字制作滾動(dòng)文字過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • pybind11和numpy進(jìn)行交互的方法

    pybind11和numpy進(jìn)行交互的方法

    這篇文章主要介紹了pybind11和numpy進(jìn)行交互的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • Python 處理日期時(shí)間的Arrow庫(kù)使用

    Python 處理日期時(shí)間的Arrow庫(kù)使用

    這篇文章主要介紹了Python 處理日期時(shí)間的Arrow庫(kù)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Django用戶認(rèn)證系統(tǒng) Web請(qǐng)求中的認(rèn)證解析

    Django用戶認(rèn)證系統(tǒng) Web請(qǐng)求中的認(rèn)證解析

    這篇文章主要介紹了Django用戶認(rèn)證系統(tǒng) Web請(qǐng)求中的認(rèn)證解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python中列表list切分的實(shí)現(xiàn)

    python中列表list切分的實(shí)現(xiàn)

    列表是Python中最常用的數(shù)據(jù)結(jié)構(gòu)之一,經(jīng)常需要對(duì)列表進(jìn)行切分操作,本文主要介紹了python中列表list切分的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • python中sample函數(shù)的介紹與使用

    python中sample函數(shù)的介紹與使用

    sample()函數(shù)常用來(lái)隨機(jī)獲取dataFrame中數(shù)據(jù),可以用于快速查看,下面這篇文章主要給大家介紹了關(guān)于python中sample函數(shù)的介紹與使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 詳解python如何調(diào)用C/C++底層庫(kù)與互相傳值

    詳解python如何調(diào)用C/C++底層庫(kù)與互相傳值

    Python作為一門腳本解釋語(yǔ)言,本身又很好的結(jié)合C++,所以使用Python開發(fā),在性能要求的地方調(diào)用C/C++底層庫(kù),這簡(jiǎn)直是神器。本文詳細(xì)介紹了Python調(diào)用C/C++底層庫(kù),互相傳值問(wèn)題,下面一起來(lái)看看。
    2016-08-08
  • python中的getattribute 、getattr、setattr方法詳解

    python中的getattribute 、getattr、setattr方法詳解

    這篇文章主要介紹了python中的getattribute 、getattr、setattr方法詳解,python類中默認(rèn)有一些特殊方法,這篇文章記錄一下特殊方法的功能及用法,需要的朋友可以參考下
    2023-11-11
  • 關(guān)于pip安裝opencv-python遇到的問(wèn)題

    關(guān)于pip安裝opencv-python遇到的問(wèn)題

    這篇文章主要介紹了關(guān)于pip安裝opencv-python遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

铁力市| 连山| 灵石县| 土默特左旗| 新密市| 温泉县| 鱼台县| 武安市| 山阳县| 辽宁省| 桃园县| 庄河市| 衡水市| 平山县| 班玛县| 冕宁县| 佛冈县| 兴和县| 阿勒泰市| 颍上县| 新晃| 宕昌县| 灵寿县| 隆安县| 嘉定区| 阿荣旗| 始兴县| 大名县| 汉寿县| 和田县| 滁州市| 刚察县| 鄂州市| 云阳县| 滦平县| 武汉市| 江孜县| 中西区| 阜新市| 昌邑市| 册亨县|