Fabric과 유사한 호스트 관리 프로그램 개발에 대한 사례 공유
패브릭형 호스트 관리 프로그램 개발:
1. 프로그램을 실행하여 호스트 그룹 또는 호스트 목록을 나열합니다.
2. 지정된 호스트 또는 호스트 그룹을 선택합니다.
3. 호스트 또는 호스트 그룹이 명령을 실행하거나 파일을 전송할 수 있도록 선택합니다. (업로드/다운로드)
4. 멀티스레딩 또는 멀티프로세스를 최대한 활용하세요.
5. 호스트마다 사용자 이름, 비밀번호, 포트가 다를 수 있습니다
README
类 Fabric 主机管理程序 执行命令(SSH) 向其传输文件(上传/下载) Fabric/#程序目录 |- - -__init__.py |- - -bin/#启动目录 | |- - -__init__.py | |- - -Fabric_start.py#视图启动 | |- - -user_reg.py#主机添加启动 | |- - -cfg/#配置目录 | |- - -__init__.py | |- - -config.py#配置文件 | |- - -core/#下载文件目录 | |- - -__init__.py | |- - -main.py#主要逻辑 类 | |- - -db/#主机列表文件目录 | |- - - | |- - -get_file/#下载文件目录 | | |- - -put_file/#上传文件目录 |- - -REDMAE
Fabric/#程序目录 |- - -__init__.py |- - -bin/#启动目录 | |- - -__init__.py | |- - -Fabric_start.py#视图启动


1 import configparser2 import os ,sys3 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量4 sys.path.append(BASE_DIR)#增加环境变量5 from core.main import loging6 if __name__ == '__main__':7 8 loging()
| |- - -user_reg.py#主机添加启动


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 8 sys.path.append(BASE_DIR)#增加环境变量 9 from cfg import config10 #修改个信息 磁盘大小11 def set_info(gr_name,addse,name,pwd,ports):12 config_info=configparser.ConfigParser()#读数据13 file_dir='%s%s'%(config.AUTH_FILE,gr_name)#主机组用户名密码文件路径14 15 config_info[addse]={}#ip 主机16 config_info.set(addse,config.USER,name)#用户17 config_info.set(addse,config.PWD,pwd)#密码18 config_info.set(addse,config.PORTS,ports)#端口19 with open(file_dir,'a') as f:20 config_info.write(f)#写入文件21 #config_info.write(open(file_dir,'a'))#写入文件22 print('创建完成'.center(60,'='))23 print('组:【%s】\nIP:[%s]\n用户名:[%s]\n密码:[%s]\n端口:[%s]'%(gr_name,addse,name,pwd,ports))24 25 if __name__ == '__main__':26 gr_name=input('组名:')#组27 addse=input('IP地址:')#ip地址28 name=input('用户名:')#用户29 pwd=input('密码:')#密码30 ports=input('端口:')#端口31 32 set_info(gr_name,addse,name,pwd,ports)
|- - -cfg/#配置目录 | |- - -__init__.py |- - -config.py#配置文件


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 8 sys.path.append(BASE_DIR)#增加环境变量 9 10 AUTH_FILE='%s/db/'%BASE_DIR#主机组 信息用户名密码文件路径11 FILE_DIR='%s/put_file'%BASE_DIR#要上传文件所在的目录12 GET_FILE_DIR='%s/get_file'%BASE_DIR#要上传文件所在的目录13 #print(AUTH_FILE)14 PWD='pwd'#密码15 USER='user'16 PORTS='ports'17 INST_LIST=['put','get']#指令列表18 19 PUT='put'20 GET='get'
|- - -core/#下载文件目录 | |- - -__init__.py | |- - -main.py#主要逻辑 类


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 import threading,time 8 import paramiko,queue 9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 10 sys.path.append(BASE_DIR)#增加环境变量 11 from cfg import config 12 13 class Fabric_gr(object): 14 def __init__(self,gr_name):#组名 15 self.gr_name='%s%s'%(config.AUTH_FILE,gr_name)#主机组用户名密码文件路径 16 self.config_info=configparser.ConfigParser()#读数据对象 17 self.name_l=[]#定义一个列表 18 self.attr=[] 19 self.file_dir=''#上传文件路径 20 self.get_file=''#下载传文件路径 21 22 def group_open(self):#打开组文件 23 self.config_info.read(self.gr_name)#读取文件 24 for i in range(len(self.config_info.sections())): 25 self.name_l.append(self.config_info.sections()[i])#信息添加到列表 26 else: 27 print('主机列表:'.center(40,'=')) 28 for i in self.name_l: 29 print(('[%s]'%i).center(40,' ')) 30 31 def inst_attr(self,inst):#获取指令 32 self.instruction=inst 33 self.attr=self.instruction.split() 34 self.inst_a=self.attr[0] 35 36 def inst(self):#指令判断 37 if self.inst_a in config.INST_LIST: 38 return True 39 else: 40 return False 41 42 def open_list(self):#创建 线程 方法 43 if self.inst_a==config.PUT: 44 if self.File_Dir():#查找本地文件 45 pass 46 else: 47 return 48 self.re_lilst=[]#定义一个列表 49 for j in range(len(self.name_l)): 50 sttr=self.config_info.sections()[j]#获取到对象 51 user_dict={}#创建一个空字典 52 for i,v in self.config_info[sttr].items():#可以循环输出 获ip 用户 密码 端口 53 user_dict[i]=v 54 sttr=threading.Thread(target=self.thr_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#创建新线程 55 sttr.start()#启动线程 56 self.re_lilst.append(sttr)#不用JOIN,避免阻塞为串行 57 else: 58 for i in self.re_lilst:#等待线程 完成 59 i.join() 60 61 def open_list2(self):#创建 线程 方法 62 self.re_lilst=[]#定义一个列表 63 for j in range(len(self.name_l)): 64 sttr=self.config_info.sections()[j]#获取到对象 65 user_dict={}#创建一个空字典 66 for i,v in self.config_info[sttr].items():#可以循环输出 获ip 用户 密码 端口 67 user_dict[i]=v 68 sttr=threading.Thread(target=self.ssh_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#创建新线程 69 sttr.start()#启动线程 70 self.re_lilst.append(sttr)#不用JOIN,避免阻塞为串行 71 else: 72 for i in self.re_lilst:#等待线程 完成 73 i.join() 74 75 76 def thr_run(self,addrs,user,paswd,ports):#传输通道 77 try: 78 transport=paramiko.Transport((addrs,ports))#传输模块 Transport 服务器地址 端口 79 transport.connect(username=user,password=paswd)#用户名,,密码 80 sftp=paramiko.SFTPClient.from_transport(transport)#调用传输方法 81 print('[%s]连接成功!'%addrs) 82 self.file_dir='%s/%s'%(config.FILE_DIR,self.attr[1])#上传文件路径 83 if self.inst_a==config.PUT: 84 sftp.put(self.file_dir,self.attr[2])#上传文件 ,本地路径文件 ,服务器的路径文件 85 print('【%s】文件上传完成!'%addrs) 86 elif self.inst_a==config.GET: 87 self.get_file='%s/%s_%s'%(config.GET_FILE_DIR,addrs,self.attr[2])#下载文件路径 88 print(self.get_file) 89 sftp.get(self.attr[1],self.get_file)#下载文件 ,服务器的路径文件 ,本地路径文件 90 print('【%s】文件下载完成!'%addrs) 91 else: 92 print('【%s】文件相关操作失败!'%addrs) 93 pass 94 except Exception as e: 95 print(e) 96 97 def File_Dir(self):#判断文件是否存在 98 file=self.attr[1] 99 100 print(file)101 self.file_dir='%s/%s'%(config.FILE_DIR,file)#文件路径102 if os.path.isfile(self.file_dir):103 print('成功找到文件!')104 return True105 else:106 print('文件不存在!')107 return False108 def ssh_run(self,addrs,user,paswd,ports):#ssh109 ssh =paramiko.SSHClient()#创建一个SSH连接对象110 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#允许连接不在KNOV_HOSTs文件中的主机 自动添加111 try:112 ssh.connect(hostname=addrs,port=ports,username=user,password=paswd)#连接,主机 端口 用户名 密码113 print('[%s]连接成功!'%addrs)114 except Exception as e:115 print(e)116 return117 stdin,stdout,stderr=ssh.exec_command(self.instruction)#.exec_command 为执行命令,返回结果 ,标准输入,标准输出,标准错误,错误与输出只会返回其一118 result=stdout.read()#获取结果119 try:120 if len(result)<1:#如果为空 返回错误信息121 result=stderr.read()122 print(addrs.center(60,'='))123 print(result.decode())124 else:125 print(addrs.center(60,'='))126 print(result.decode())127 except Exception as e:128 print(e)129 130 131 info_l='''--------指令帮助--------132 上传文件: put file /home/tmp/file (指令 本地文件 服务端位置文件)133 下载文件: get /home/tmp/file file (指令 服务端位置文件 本地文件)134 其他指令: ssh相关命令 如 df pwd ifconfig ls等135 查看帮助: helps136 返回上层: quit137 退出程序: exit138 '''139 140 141 def loging():142 print(info_l)143 while True:144 s=os.listdir(config.AUTH_FILE)145 print('主机组'.center(60,'='))146 for i,v in enumerate(s):147 print('编号:%s 组名:%s'%(i,v))148 gr_name=input('选择组:')149 if gr_name=='exit':150 exit()151 if gr_name=='helps':152 print(info_l)153 continue154 try:155 gr_file=s[int(gr_name)]156 157 lst=Fabric_gr(gr_file)#实例连接158 lst.group_open()#打开159 while True:160 #print(info_l)161 inst=input('指令>>>:')162 if inst=='exit':163 exit()164 if inst=='quit':165 continue166 if inst=='helps':167 print(info_l)168 continue169 lst.inst_attr(inst)#获取指令170 if lst.inst():#指令判断171 lst.open_list()#开启线程创建172 else:173 lst.open_list2()174 pass175 except ValueError as e:176 print(e)
위 내용은 Fabric과 유사한 호스트 관리 프로그램 개발에 대한 사례 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

Docker는 Linux 커널 기능을 사용하여 효율적이고 고립 된 응용 프로그램 실행 환경을 제공합니다. 작동 원리는 다음과 같습니다. 1. 거울은 읽기 전용 템플릿으로 사용되며, 여기에는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함합니다. 2. Union 파일 시스템 (Unionfs)은 여러 파일 시스템을 스택하고 차이점 만 저장하고 공간을 절약하고 속도를 높입니다. 3. 데몬은 거울과 컨테이너를 관리하고 클라이언트는 상호 작용을 위해 사용합니다. 4. 네임 스페이스 및 CGroup은 컨테이너 격리 및 자원 제한을 구현합니다. 5. 다중 네트워크 모드는 컨테이너 상호 연결을 지원합니다. 이러한 핵심 개념을 이해 함으로써만 Docker를 더 잘 활용할 수 있습니다.

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.

vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.

VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

파이썬은 자동화, 스크립팅 및 작업 관리가 탁월합니다. 1) 자동화 : 파일 백업은 OS 및 Shutil과 같은 표준 라이브러리를 통해 실현됩니다. 2) 스크립트 쓰기 : PSUTIL 라이브러리를 사용하여 시스템 리소스를 모니터링합니다. 3) 작업 관리 : 일정 라이브러리를 사용하여 작업을 예약하십시오. Python의 사용 편의성과 풍부한 라이브러리 지원으로 인해 이러한 영역에서 선호하는 도구가됩니다.
