오늘은 아주 간단한 작은 프로젝트를 하면서 파라미코 모듈의 위력을 느꼈고, 제가 리눅스를 잘 못한다는 것도 느꼈습니다~~
요구 사항이 거의 없으므로 간단하게 말씀드리겠습니다.
1. 호스트 그룹화 는 구성 파일 (데이터를 저장하기 위해 사전을 사용합니다.)
2. 로그인 기능이 작동하지 않습니다. 그룹을 선택하면 해당 그룹에 속한 호스트의 이름과 IP 주소를 확인할 수 있습니다.
3.>>>cmd: df (여러 스레드를 시작하려면 명령을 입력하세요. (그룹에 있는 수에 따라 다름) 호스트 시스템에 따라 다름)
출력:
————————————— ———————h1———————————— ——— … (명령어에서 반환된 데이터)
---------------------------------- ------------------ --
……
>>>put test.yy(로컬 파일)
파일이름(put local 테스트. yy 파일은 원격 호스트의 /root 디렉터리로 전송됩니다.) 4. 구성 파일에 작성할 수 있습니다. 원격 호스트 포함: 호스트 이름 IP 사용자 이름 비밀번호 포트
흐름도
3.
디렉터리 구조:
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.py1 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>>>
위 내용은 Python의 간단한 호스트 배치 관리 도구에 대한 자세한 그래픽 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!