今天做了一個很簡單的小項目,感受到了paramiko模塊的強大,也深感自己Linux的功力不行~~
一、需求
二、簡單需求分析及流程圖
需求很少,我就簡單地說下:
1. 主機分組可以配置文件實現(我用字典存數據的).
2. 登陸功能不做。選擇分組后可查看組內對應主機的主機名和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 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): """起線程連接遠程主機后調用""" 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: continuedef run(): choose_host_list = show_host_list() interactive(choose_host_list)
新聞熱點
疑難解答