오늘 아주 간단한 작은 프로젝트를 했는데 파라미코 모듈의 위력을 느꼈고, 리눅스 실력도 부족하다는 걸 느꼈습니다~~
1. >
2. 간단한 수요 분석 및 흐름도
수요가 매우 적으므로 간단히 말씀드리겠습니다.
1. 그룹화를 구성할 수 있습니다.(저는 사전을 사용하여 데이터를 저장합니다.)
2. 로그인 기능이 작동하지 않습니다. 그룹을 선택하면 해당 그룹에 속한 호스트의 이름과 IP 주소를 확인할 수 있습니다.
3. >>>cmd: df (여러 스레드를 시작하려면 명령을 입력하세요. (그룹에 있는 스레드 수에 따라 다름) 호스트에 따라 다름) 동시에 실행)
출력:
------------ --h1---------- ---
......(명령에서 반환된 데이터)
--- --------h2------ ----------
......
>> >test.yy(로컬 파일) 파일명 입력(로컬 test.yy 파일을 원격 호스트의 /root 디렉터리로 전송)
4. 구성 파일에 작성할 수 있습니다. 원격 호스트 포함: 호스트 이름 IP 사용자 이름 비밀번호 포트
흐름도
디렉터리 구조 및 소스 코드
디렉토리 구조:
from_windows.py(업로드할 파일)
main.py(일괄 호스트 관리 인터페이스)
"""批量主机管理接口""" import core if __name__ == "__main__": core.run()
core.py(인터페이스에서 호출되는 핵심 코드)
"""核心代码""" import settings import paramiko import threading import 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.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 >>>
업로드 전에는 from_windows.py 파일이 없는데, 업로드 후에는 있어요!
그게 다입니다. 이 기사의 전체 내용이 모든 사람의 학습에 도움이 되기를 바라며, 또한 모든 사람이 PHP 중국어 웹사이트를 지지해 주기를 바랍니다.
파이썬의 간단한 호스트 배치 관리 도구에 대한 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!