Python 은 어떻게 Paramiko 의 2 차 패 키 징 을 실현 합 니까?

Paramiko 는 SSH 명령 을 수행 하 는 Python 제3자 라 이브 러 리 입 니 다.이 라 이브 러 리 를 사용 하면 자동화 운영 을 실현 할 수 있 는 모든 작업 을 수행 할 수 있 습 니 다.다음 과 같은 자주 사용 되 는 코드 의 패 키 징 방식 입 니 다.대부분의 코드 는 반제품 입 니 다.코드 를 두 드 렸 을 때의 백업 복사 본 만 잃 어 버 리 지 않도록 참고 하 십시오.
현재 본인 이 100 대 장 비 를 순찰 하 는 것 은 전혀 스트레스 가 없고,천 대 를 순찰 하려 면 다 중 스 레 드 지원 이 필요 하 며,만 대 를 넘 으 면 스마트 판단 등 이 들 어가 야 한다.
명령 실행 실현:프로 세 스 패 키 징 을 직접 사용 하고 CMD 명령 을 실행 합 니 다.

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def BatchCMD(address,username,password,port,command):
  try:
    ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
    stdin , stdout , stderr = ssh.exec_command(command)
    result = stdout.read()
    if len(result) != 0:
      result = str(result).replace("\
", "
") result = result.replace("b'", "").replace("'", "") return result else: return None except Exception: return None
 디스크 순찰 실현:디스크 공간 을 가 져 오고 사전 형식 을 되 돌려 줍 니 다.

def GetAllDiskSpace(address,username,password,port):
  ref_dict = {}
  cmd_dict = {"Linux
" : "df | grep -v 'Filesystem' | awk '{print $5 \":\" $6}'", "AIX
" : "df | grep -v 'Filesystem' | awk '{print $4 \":\" $7}'" } # os_version = BatchCMD(address,username,password,port,"uname") for version,run_cmd in cmd_dict.items(): if(version == os_version): # os_ref = BatchCMD(address,username,password,port,run_cmd) ref_list= os_ref.split("
") # for each in ref_list: # , if each != "": ref_dict[str(each.split(":")[1])] = str(each.split(":")[0]) return ref_dict # def DiskMain(): with open("db.json", "r", encoding="utf-8") as read_fp: load_json = read_fp.read() js = json.loads(load_json) base = js.get("base") count = len(base) for each in range(0,count): print("\033[37m-\033[0m" * 80) print("\033[35m : {0:10} \t : {1:10} \t : {2:10} \t : {3:4}\033[0m". format(base[each][1],base[each][2],base[each][3],base[each][4])) print("\033[37m-\033[0m" * 80) ref = GetAllDiskSpace(base[each][1],base[each][2],base[each][3],base[each][4]) for k,v in ref.items(): # if( v.split("%")[0] != "-"): # space_ret = int(v.split("%")[0]) if space_ret >= 70: print("\033[31m : {0:30} \t : {1:5} \033[0m".format(k,v)) continue if space_ret >= 50: print("\033[33m : {0:30} \t : {1:5} \033[0m".format(k, v)) continue else: print("\033[34m : {0:30} \t : {1:5} \033[0m".format(k, v)) continue print() # def GroupDiskMain(address,username,password,port): ref = GetAllDiskSpace(address,username,password,port) for k, v in ref.items(): if (v.split("%")[0] != "-"): space_ret = int(v.split("%")[0]) if space_ret >= 70: print(" : {0:30} \t : {1:5} -> [ ]".format(k, v)) continue if space_ret >= 50: print(" : {0:30} \t : {1:5} -> [ ]".format(k, v)) continue else: print(" : {0:30} \t : {1:5} -> [ ]".format(k, v)) continue print()
시스템 메모리 사용량 가 져 오기:시스템 메모리 사용량 가 져 오기

def GetAllMemSpace(address,username,password,port):
  cmd_dict = {"Linux
" : "cat /proc/meminfo | head -n 2 | awk '{print $2}' | xargs | awk '{print $1 \":\" $2}'", "AIX
" : "df | grep -v 'Filesystem' | awk '{print $4 \":\" $7}'" } # os_version = BatchCMD(address,username,password,port,"uname") for version,run_cmd in cmd_dict.items(): if(version == os_version): # os_ref = BatchCMD(address,username,password,port,run_cmd) # KB MB mem_total = math.ceil( int(os_ref.split(":")[0].replace("
","")) / 1024) mem_free = math.ceil(int(os_ref.split(":")[1].replace("
","")) / 1024) mem_used = str( int(mem_total) - int(mem_free)) # percentage = 100 - int(mem_free / int(mem_total / 100)) print(" : {}".format(str(mem_total) + " MB")) print(" : {}".format(str(mem_free) + " MB")) print(" : {}".format(str(mem_used) + " MB")) print(" : {}".format(str(percentage) + " %"))
시스템 프로 세 스 정보 가 져 오기:시스템 프로 세 스 정 보 를 가 져 오고 사전 형식 으로 되 돌려 줍 니 다.

def GetAllProcessSpace(address,username,password,port):
  ref_dict = {}
  cmd_dict = {"Linux
" : "ps aux | grep -v 'USER' | awk '{print $2 \":\" $11}' | uniq", "AIX
" : "ps aux | grep -v 'USER' | awk '{print $2 \":\" $12}' | uniq" } os_version = BatchCMD(address,username,password,port,"uname") for version,run_cmd in cmd_dict.items(): if(version == os_version): os_ref = BatchCMD(address, username, password, port, run_cmd) ref_list = os_ref.split("
") for each in ref_list: if each != "": ref_dict[str(each.split(":")[0])] = str(each.split(":")[1]) return ref_dict # def ProcessMain(): with open("db.json", "r", encoding="utf-8") as read_fp: load_json = read_fp.read() js = json.loads(load_json) process = js.get("process") process_count = len(process) for x in range(0,process_count): # process base base = js.get("base") if( list(process[x].keys())[0] == base[x][0] ): # ID print("\033[37m-\033[0m" * 80) print("\033[35m : {0:10} \t : {1:10} \t : {2:10} \t : {3:4}\033[0m". format(base[x][1], base[x][2], base[x][3], base[x][4])) print("\033[37m-\033[0m" * 80) ref_dic = GetAllProcessSpace(base[x][1],base[x][2],base[x][3],base[x][4]) # ref_val = proc_val = ref_val = list(ref_dic.values()) proc_val = list(process[x].values())[0] # for each in proc_val: flag = each in ref_val if(flag == True): print("\033[34m : {0:50} : √ \033[0m".format(each)) else: print("\033[31m : {0:50} : × \033[0m".format(each))
대본 실행 기능 실현:특정한 호스트 에 대해 대본 기능 을 실행 하고 마음대로 쓴 버 전 은 참고 하 시기 바 랍 니 다.

def RunRule(address,username,password,port,playbook):
  os_version = BatchCMD(address,username,password,port,"uname")
  if(os_version == list(playbook.keys())[0]):
    play = list(playbook.values())[0]
    print()
    print("\033[37m-\033[0m" * 130)
    print("\033[35m     : {0:4} \t   : {1:10} \t    : {2:10} \t   : {3:15} \t   : {4:4}\033[0m"
       .format(os_version.replace("
",""),address,username,password,port)) print("\033[37m-\033[0m" * 130) for each in range(0,len(play)): RunCmd = play[each] + " > /dev/null 2>&1 && echo $?" print("\033[30m [>] : {0:100} \t : {1:5} \033[0m".format( RunCmd.replace(" > /dev/null 2>&1 && echo $?", "")," ")) os_ref = BatchCMD(address, username, password, port, RunCmd) if(os_ref == "0
"): print("\033[34m [√] : {0:100} \t : {1:5} \033[0m".format( RunCmd.replace(" > /dev/null 2>&1 && echo $?","")," ")) else: print("\033[31m [×] : {0:100} \t : {1:5} \033[0m".format( RunCmd.replace(" > /dev/null 2>&1 && echo $?","")," ")) # , , for x in range(each+1,len(play)): print("\033[31m [×] : {0:100} \t : {1:5} \033[0m".format( play[x].replace(" > /dev/null 2>&1 && echo $?", ""), " ")) break else: return 0 # : def RunPlayBook(HostList,PlayBook): count = len(HostList) error = [] success = [] for each in range(0,count): ref = RunRule(HostList[each][0],HostList[each][1],HostList[each][2],HostList[each][3],PlayBook) if ref == 0: error.append(HostList[each][0]) else: success.append(HostList[each][0]) print("

") print("-" * 130) print(" ") print("-" * 130) for each in success: print(" : {}".format(each)) for each in error: print(" : {}".format(each)) # def PlayBookRun(): playbook = \ { "Linux
": [ "ifconfig", "vmstat", "ls", "netstat -an", "ifconfis", "cat /etc/passwd | grep 'root' | awk '{print $2}'" ] } addr_list = \ [ ["192.168.1.127", "root", "1233", "22"], ["192.168.1.126", "root", "1203", "22"] ] # addr_list playbook RunPlayBook(addr_list,playbook)
프로 세 스 구현 파일 업로드 다운로드:파일 전송 기능 PUT 업로드 GET 다운로드

def BatchSFTP(address,username,password,port,soruce,target,flag):
  transport = paramiko.Transport((address, int(port)))
  transport.connect(username=username, password=password)
  sftp = paramiko.SFTPClient.from_transport(transport)
  if flag == "PUT":
    try:
      ret = sftp.put(soruce, target)
      if ret !="":
        transport.close()
        return 1
      else:
        transport.close()
        return 0
      transport.close()
    except Exception:
      transport.close()
      return 0
  elif flag == "GET":
    try:
      target = str(address + "_" + target)
      os.chdir("./recv_file")
      ret = sftp.get(soruce, target)
      if ret != "":
        transport.close()
        return 1
      else:
        transport.close()
        return 0
      transport.close()
    except Exception:
      transport.close()
      return 0

#         source       target  
def PutRemoteFile(source,target):
  with open("db.json", "r", encoding="utf-8") as fp:
    load_json = fp.read()
    js = json.loads(load_json)
    base = js.get("base")

    print("-" * 130)
    print("     \t\t      \t      \t      \t      \t\t     \t\t\t     ")
    print("-" * 130)

    for each in range(0,len(base)):
      #           
      ref = BatchCMD(base[each][1], base[each][2], base[each][3], base[each][4],"uname")
      if ref == None:
        print("\033[31m{0:15} \t {1:6} \t {2:10} \t {3:3} \t {4:10} \t {5:10} \t    \033[0m".format(
          base[each][1],base[each][2],base[each][3],base[each][4],source,target))
        continue

      ref = BatchSFTP(base[each][1],base[each][2],base[each][3],base[each][4],source,target,"PUT")
      if(ref == 1):
        print("\033[34m{0:15} \t {1:6} \t {2:10} \t {3:3} \t {4:10} \t {5:10} \t     \033[0m".format(
          base[each][1],base[each][2],base[each][3],base[each][4],source,target))
      else:
        print("\033[31m{0:15} \t {1:6} \t {2:10} \t {3:3} \t {4:10} \t {5:10} \t     \033[0m".format(
          base[each][1], base[each][2], base[each][3], base[each][4], source, target))

#                 (    )
def GetRemoteFile(source,target):
  with open("db.json", "r", encoding="utf-8") as fp:
    load_json = fp.read()
    js = json.loads(load_json)
    base = js.get("base")

    print("-" * 130)
    print("     \t\t      \t      \t      \t\t      \t\t     \t\t\t     ")
    print("-" * 130)

    for each in range(0,len(base)):
      ref = BatchCMD(base[each][1], base[each][2], base[each][3], base[each][4], "uname")
      if ref == None:
        print("\033[31m{0:15} \t {1:6} \t {2:10} \t {3:3} \t {4:10} \t {5:10} \t    \033[0m".format(
          base[each][1], base[each][2], base[each][3], base[each][4], source, target))
        continue

      ref = BatchSFTP(base[each][1],base[each][2],base[each][3],base[each][4],source,target,"GET")
      if(ref == 1):
        print("\033[34m{0:15} \t {1:6} \t {2:10} \t {3:3} \t {4:10} \t {5:10} \t     \033[0m".format(
          base[each][1],base[each][2],base[each][3],base[each][4],source,target))
      else:
        print("\033[31m{0:15} \t {1:6} \t {2:10} \t {3:3} \t {4:10} \t {5:10} \t     \033[0m".format(
          base[each][1], base[each][2], base[each][3], base[each][4], source, target))
다른 명령 실행 방법:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def BatchCMD(address,username,password,port,command):
  try:
    ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
    stdin , stdout , stderr = ssh.exec_command(command)
    result = stdout.read()
    if len(result) != 0:
      return result
    else:
      return -1
  except Exception:
    return -1

#       Ping  
def GetPing():
  fp = open("unix_base.db", "r", encoding="utf-8")
  count = len(open("unix_base.db", "r", encoding="utf-8").readlines())
  print("-" * 100)
  print("{0:20} \t {1:10} \t {2:13} \t {3:5} \t {4:9} \t {5:40}".format("IP  ","    ","  SN","    ","    ","    "))
  print("-" * 100)
  for each in range(count):
    ref = eval(fp.readline())
    ret = BatchCMD(ref[0],ref[5],ref[6],22,"pwd | echo $?")
    if(int(ret)==0):
      print("{0:20} \t {1:10} \t {2:11} \t {3:5} \t {4:9} \t {5:40}".
         format(ref[0],ref[1],ref[2],ref[3],"  ",ref[4]))
    else:
      print("{0:20} \t {1:10} \t {2:13} \t {3:5} \t {4:9} \t {5:40}".
         format(ref[0],ref[1],ref[2],ref[3],"  ",ref[4]))
  fp.close()

# ps aux | grep "usbCfgDev" | grep -v "grep" | awk {'print $2'}
def GetProcessStatus():
  fp = open("unix_process.db", "r", encoding="utf-8")
  count = len(open("unix_process.db", "r", encoding="utf-8").readlines())
  for each in range(count):
    proc = eval(fp.readline())
    proc_len = len(proc)
    print("-" * 70)
    print("--->     : {0:10} \t     : {1:7} \t     : {2:10}".format(proc[0],proc[1],proc[2]))
    print("-" * 70)
    for process in range(3, proc_len):
      command = "ps aux | grep \'{}\' | grep -v \'grep\' | awk '{}' | head -1".format(proc[process],"{print $2}")
      try:
        ref = BatchCMD(proc[0],proc[1],proc[2],22,command)
        if(int(ref)!=-1):
          print("  : {0:18} \t PID: {1:10} \t   : {2}".format(proc[process], int(ref),"√"))
        else:
          print("  : {0:18} \t PID:{1:10} \t   : {2}".format(proc[process], 0,"×"))
      except Exception:
        print("  : {0:18} \t PID:{1:10} \t   : {2}".format(proc[process], 0,"×"))
    print()
  fp.close()


def GetDiskStatus():
  fp = open("unix_disk.db", "r", encoding="utf-8")
  count = len(open("unix_disk.db", "r", encoding="utf-8").readlines())
  for each in range(count):
    proc = eval(fp.readline())
    proc_len = len(proc)
    print("-" * 100)
    print("--->     : {0:10} \t     : {1:7} \t     : {2:10}     : {3:10}".
       format(proc[0],proc[1],proc[2],proc[3]))
    print("-" * 100)
    try:
      ref = BatchCMD(proc[0], proc[2], proc[3], 22, "df | grep -v 'Filesystem'")
      st = str(ref).replace("\
", "
") print(st.replace("b'", "").replace("'", "")) except Exception: pass print() fp.close() # def RunCmd(command,system): fp = open("unix_disk.db", "r", encoding="utf-8") count = len(open("unix_disk.db", "r", encoding="utf-8").readlines()) for each in range(count): proc = eval(fp.readline()) proc_len = len(proc) if proc[1] == system: print("-" * 100) print("---> : {0:10} \t : {1:7} \t : {2:10} : {3:10}". format(proc[0],proc[1],proc[2],proc[3])) print("-" * 100) try: ref = BatchCMD(proc[0], proc[2], proc[3], 22, command) st = str(ref).replace("\
", "
") print(st.replace("b'", "").replace("'", "")) except Exception: pass fp.close()
대상 을 대상 으로 하 는 패 키 징 방법:대상 을 대상 으로 패 키 징 을 사용 하면 재 활용 성 을 크게 향상 시 킬 수 있 습 니 다.

import paramiko

class MySSH:
  def __init__(self,address,username,password,default_port = 22):
    self.address = address
    self.default_port = default_port
    self.username = username
    self.password = password

    self.obj = paramiko.SSHClient()
    self.obj.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    self.obj.connect(self.address,self.default_port,self.username,self.password)
    self.objsftp = self.obj.open_sftp()

  def BatchCMD(self,command):
    stdin , stdout , stderr = self.obj.exec_command(command)
    result = stdout.read()
    if len(result) != 0:
      result = str(result).replace("\
", "
") result = result.replace("b'", "").replace("'", "") return result else: return None def GetRemoteFile(self,remotepath,localpath): self.objsftp.get(remotepath,localpath) def PutLocalFile(self,localpath,remotepath): self.objsftp.put(localpath,remotepath) def GetFileSize(self,file_path): ref = self.BatchCMD("du -s " + file_path + " | awk '{print $1}'") return ref def CloseSSH(self): self.objsftp.close() self.obj.close() if __name__ == '__main__': ssh = MySSH('192.168.191.3','root','1233',22) ref = ssh.BatchCMD("ifconfig") print(ref) sz = ssh.GetFileSize("/etc/passwd") print(sz) ssh.CloseSSH() 。 import paramiko,os,json,re class MySSH: def __init__(self,address,username,password,default_port = 22): self.address = address self.default_port = default_port self.username = username self.password = password try: self.obj = paramiko.SSHClient() self.obj.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.obj.connect(self.address,self.default_port,self.username,self.password,timeout=3,allow_agent=False,look_for_keys=False) self.objsftp = self.obj.open_sftp() except Exception: pass def BatchCMD(self,command): try: stdin , stdout , stderr = self.obj.exec_command(command,timeout=3) result = stdout.read() if len(result) != 0: result = str(result).replace("\
", "
") result = result.replace("b'", "").replace("'", "") return result else: return None except Exception: return None def GetRemoteFile(self,remote_path,local_path): try: self.objsftp.get(remote_path,local_path) return True except Exception: return False def PutLocalFile(self,localpath,remotepath): try: self.objsftp.put(localpath,remotepath) return True except Exception: return False def CloseSSH(self): self.objsftp.close() self.obj.close() # def GetFileSize(self,file_path): ref = self.BatchCMD("du -s " + file_path + " | awk '{print $1}'") return ref.replace("
","") # def IsFile(self,file_path): return self.BatchCMD("[ -e {} ] && echo 'True' || echo 'False'".format(file_path))
Eval 함수 해석 집행:문법 규칙 과 함 수 를 사용자 정의 하고 Eval 함 수 를 통 해 해석 집행 을 실현 합 니 다.다 쓰 지 못 했 습 니 다.참고 하 시기 바 랍 니 다.

import json,os,sys,math
import argparse,time,re
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def BatchCMD(address,username,password,port,command):
  try:
    ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)
    stdin , stdout , stderr = ssh.exec_command(command)
    result = stdout.read()
    if len(result) != 0:
      result = str(result).replace("\
", "
") result = result.replace("b'", "").replace("'", "") return result else: return None except Exception: return None # ------------------------------------------------------------------------ # def GetDisk(x): return str(x) def GetCPULoad(): return str(10) # , def judge(string): # IF if re.findall(r'IF{ (.*?) }', string, re.M) != []: # ptr = re.compile(r'IF[{] (.*?) [}]',re.S) subject = re.findall(ptr,string)[0] subject_list = subject.split(" ") # sentence = eval(subject_list[0]) + subject_list[1] + subject_list[2] # , if eval(sentence): return "IF" else: return False # put elif re.findall(r'PUT{ (.*?) }', string, re.M) != []: print("put") return False # def GetAllRule(): rootdir = os.getcwd() + "\\rule\\" all_files = [f for f in os.listdir(rootdir)] print("-" * 90) print("{0:15} \t {1:10} \t {2:10} \t {3:5} \t {4:5}".format(" "," "," "," "," ")) print("-" * 90) for switch in all_files: # Json if( switch.endswith(".json") == True): all_switch_dir = rootdir + switch try: # JSON with open(all_switch_dir , "r" ,encoding="utf-8") as read_file: # load = json.loads(read_file.read()) if load.get("framework") != None and load.get("task_sequence") != None: run_addr_count = len(load.get("address_list")) command_count = len(load.get("task_sequence")) print("{0:15} \t {1:10} {2:10} \t\t {3:5} \t\t {4:5}". format(switch,load.get("framework"),load.get("default_port"),run_addr_count,command_count)) except ValueError: pass # def RunPlayBook(rule_name): rootdir = os.getcwd() + "\\rule\\" all_files = [f for f in os.listdir(rootdir)] for switch in all_files: if( switch.endswith(".json") == True): all_switch_dir = rootdir + switch # if( switch == rule_name): with open(all_switch_dir , "r" ,encoding="utf-8") as read_file: data = json.loads(read_file.read()) address_list = data.get("address_list") # for each in address_list: # task_sequence = data.get("task_sequence") default_port = data.get("default_port") print("-" * 90) print(" : {0:15} : {1:10} : {2:10}".format(each[0],each[1],each[2])) print("-" * 90) for task in task_sequence: flag = judge(task[0]) if flag == "IF": ref = BatchCMD(each[0],each[1],each[2],default_port,task[1]) print(ref) elif flag == False: ref = BatchCMD(each[0],each[1],each[2],default_port,task[0]) print(ref) if __name__ == "__main__": RunPlayBook("get_log.json")
극본 의 규범 을 정의 하 는 것 은 다음 과 같다.

{
 "framework": "Centos",
 "version": "7.0",
 "address_list":
 [
  ["192.168.191.3","root","1233"]
 ],
 "default_port": "22",
 "task_sequence":
 [
  ["ifconfig"],
  ["IF{ GetLastCmdFlag() == True }","uname"]
 ]
}
품사 분석:품사 분석 으로 극본 내용 을 해석 하 다.

#             
def GetAllRule():
  rootdir = os.getcwd() + "\\rule\\"
  all_files = [f for f in os.listdir(rootdir)]
  print("-" * 90)
  print("{0:15} \t {1:10} \t {2:10} \t {3:5} \t {4:5}".format("    ","    ","    ","     ","    "))
  print("-" * 90)
  for switch in all_files:
    #            Json
    if( switch.endswith(".json") == True):
      all_switch_dir = rootdir + switch
      try:
        #           JSON  
        with open(all_switch_dir , "r" ,encoding="utf-8") as read_file:
          #                
          load = json.loads(read_file.read())
          if load.get("framework") != None and load.get("task_sequence") != None:
            run_addr_count = len(load.get("address_list"))
            command_count = len(load.get("task_sequence"))
            print("{0:15} \t {1:10} {2:10} \t\t {3:5} \t\t {4:5}".
               format(switch,load.get("framework"),load.get("default_port"),run_addr_count,command_count))
      except ValueError:
        pass

#      ,       
def judge(string):
  #      IF         
  if re.findall(r'IF{ (.*?) }', string, re.M) != []:
    #            
    ptr = re.compile(r'IF[{] (.*?) [}]',re.S)
    subject = re.findall(ptr,string)[0]
    subject_list = subject.split(" ")

    #     ,    
    ssh = MySSH("192.168.191.3","root","1233","22")

    #        
    sentence = str(eval(subject_list[0]) + subject_list[1] + subject_list[2])
    if eval(sentence):
      return "IF",ssh
    else:
      return False

  #      put       
  elif re.findall(r'PUT{ (.*?) }', string, re.M) != []:
    print("put")
  return False

#          
def RunPlayBook(rule_name):
  rootdir = os.getcwd() + "\\rule\\"
  all_files = [f for f in os.listdir(rootdir)]
  for switch in all_files:
    if( switch.endswith(".json") == True):
      all_switch_dir = rootdir + switch
      #             
      if( switch == rule_name):
        with open(all_switch_dir , "r" ,encoding="utf-8") as read_file:
          data = json.loads(read_file.read())
          address_list = data.get("address_list")
          #         
          for each in address_list:
            #       
            task_sequence = data.get("task_sequence")
            default_port = data.get("default_port")
            print("-" * 90)
            print("  : {0:15}    : {1:10}   : {2:10}".format(each[0],each[1],each[2]))
            print("-" * 90)
            for task in task_sequence:

              flag,obj = judge(task[0])

              if flag == "IF":
                ret = obj.BatchCMD(task[1])
                print(ret)
if __name__ == '__main__':
  ret = judge("IF{ ssh.GetFileSize('/etc/passwd') >= 4 }")
  print(ret)
MySSH 클래스 최종 패 키 징:대상 을 대상 으로 패 키 징 을 통 해 CPU,부하,메모리 이 용 률,디스크 용량 등 유 니 버 설 데 이 터 를 조회 할 수 있 습 니 다.

import paramiko, math,json

class MySSH:
  def __init__(self, address, username, password, default_port):
    self.address = address
    self.default_port = default_port
    self.username = username
    self.password = password
  #    ,    
  def Init(self):
    try:
      self.ssh_obj = paramiko.SSHClient()
      self.ssh_obj.set_missing_host_key_policy(paramiko.AutoAddPolicy())
      self.ssh_obj.connect(self.address, self.default_port, self.username, self.password, timeout=3,
                 allow_agent=False, look_for_keys=False)
      self.sftp_obj = self.ssh_obj.open_sftp()
    except Exception:
      return False
  #        
  def BatchCMD(self, command):
    try:
      stdin, stdout, stderr = self.ssh_obj.exec_command(command, timeout=3)
      result = stdout.read()
      if len(result) != 0:
        result = str(result).replace("\
", "
") result = result.replace("b'", "").replace("'", "") return result else: return None except Exception: return None # def GetRemoteFile(self, remote_path, local_path): try: self.sftp_obj.get(remote_path, local_path) return True except Exception: return False # def PutLocalFile(self, localpath, remotepath): try: self.sftp_obj.put(localpath, remotepath) return True except Exception: return False # def CloseSSH(self): try: self.sftp_obj.close() self.ssh_obj.close() except Exception: pass # def GetFileSize(self, file_path): ref = self.BatchCMD("du -s " + file_path + " | awk '{print $1}'") return ref.replace("
", "") # def IsFile(self, file_path): return self.BatchCMD("[ -e {} ] && echo 'True' || echo 'False'".format(file_path)) # def GetSystemVersion(self): return self.BatchCMD("uname") # def GetPing(self): try: if self.GetSystemVersion() != None: return True else: return False except Exception: return False # , def GetFileList(self, path): try: ref_list = [] self.sftp_obj.chdir(path) file_list = self.sftp_obj.listdir("./") for sub_path in file_list: dict = {} file_size = self.GetFileSize(path + sub_path) dict[path + sub_path] = file_size ref_list.append(dict) return ref_list except Exception: return False # def GetTarPackageAll(self, path): try: file_list = self.sftp_obj.listdir(path) self.sftp_obj.chdir(path) for packageName in file_list: self.ssh_obj.exec_command("tar -czf /tmp/{0}.tar.gz {0}".format(packageName)) self.sftp_obj.get("/tmp/{}.tar.gz".format(packageName), "./file/{}.tar.gz".format(packageName)) self.sftp_obj.remove("/tmp/{}.tar.gz".format(packageName)) return True except Exception: return True # def GetAllDiskSpace(self): ref_dict = {} cmd_dict = {"Linux
": "df | grep -v 'Filesystem' | awk '{print $5 \":\" $6}'", "AIX
": "df | grep -v 'Filesystem' | awk '{print $4 \":\" $7}'" } try: os_version = self.GetSystemVersion() for version, run_cmd in cmd_dict.items(): if (version == os_version): # os_ref = self.BatchCMD(run_cmd) ref_list = os_ref.split("
") # for each in ref_list: # , if each != "": ref_dict[str(each.split(":")[1])] = str(each.split(":")[0]) return ref_dict except Exception: return False # def GetAllMemSpace(self): cmd_dict = {"Linux
": "cat /proc/meminfo | head -n 2 | awk '{print $2}' | xargs | awk '{print $1 \":\" $2}'", "AIX
": "svmon -G | grep -v 'virtual' | head -n 1 | awk '{print $2 \":\" $4}'" } try: os_version = self.GetSystemVersion() for version, run_cmd in cmd_dict.items(): if (version == os_version): # os_ref = self.BatchCMD(run_cmd) # KB MB mem_total = math.ceil(int(os_ref.split(":")[0].replace("
", "")) / 1024) mem_free = math.ceil(int(os_ref.split(":")[1].replace("
", "")) / 1024) # percentage = 100 - int(mem_free / int(mem_total / 100)) # return {"Total": str(mem_total), "Free": str(mem_free), "Percentage": str(percentage)} except Exception: return False # , def GetAllProcessSpace(self): ref_dict = {} cmd_dict = {"Linux
": "ps aux | grep -v 'USER' | awk '{print $2 \":\" $11}' | uniq", "AIX
": "ps aux | grep -v 'USER' | awk '{print $2 \":\" $12}' | uniq" } try: os_version = self.GetSystemVersion() for version, run_cmd in cmd_dict.items(): if (version == os_version): os_ref = self.BatchCMD(run_cmd) ref_list = os_ref.split("
") for each in ref_list: if each != "": ref_dict[str(each.split(":")[0])] = str(each.split(":")[1]) return ref_dict except Exception: return False # CPU def GetCPUPercentage(self): ref_dict = {} cmd_dict = {"Linux
": "vmstat | tail -n 1 | awk '{print $13 \":\" $14 \":\" $15}'", "AIX
": "vmstat | tail -n 1 | awk '{print $14 \":\" $15 \":\" $16}'" } try: os_version = self.GetSystemVersion() for version, run_cmd in cmd_dict.items(): if (version == os_version): os_ref = self.BatchCMD(run_cmd) ref_list = os_ref.split("
") for each in ref_list: if each != "": each = each.split(":") ref_dict = {"us": each[0],"sys":each[1],"idea":each[2]} return ref_dict except Exception: return False # def GetLoadAVG(self): ref_dict = {} cmd_dict = {"Linux
": "uptime | awk '{print $10 \":\" $11 \":\" $12}'", "AIX
": "uptime | awk '{print $10 \":\" $11 \":\" $12}'" } try: os_version = self.GetSystemVersion() for version, run_cmd in cmd_dict.items(): if (version == os_version): os_ref = self.BatchCMD(run_cmd) ref_list = os_ref.split("
") for each in ref_list: if each != "": each = each.replace(",","").split(":") ref_dict = {"1avg": each[0],"5avg": each[1],"15avg": each[2]} return ref_dict return False except Exception: return False # def SetPasswd(self,username,password): try: os_id = self.BatchCMD("id | awk {'print $1'}") print(os_id) if(os_id == "uid=0(root)
"): self.BatchCMD("echo '{}' | passwd --stdin '{}' > /dev/null".format(password,username)) return True except Exception: return False # , MySSH class SuperSSH(MySSH): def __init__(self,address, username, password, default_port): super(SuperSSH, self).__init__(address, username, password, default_port)
저 희 는 위의 코드 에 명령 행 을 추가 하여 직접 사용 할 수 있 도록 합 니 다.여 기 는 일정한 형식 규범 에 따라 JSON 으로 데 이 터 를 분석 해 야 합 니 다.JSON 형식 은 다음 과 같 습 니 다.

{
 "aix":
 [
  ["192.168.1.1","root","123123"],
  ["192.168.1.1","root","2019"],
 ],
 "suse":
 [
  ["192.168.1.1","root","123123"],
 ],
 "centos":
  [
  ["192.168.1.1","root","123123"],
  ]
}
다음은 메 인 프로그램 코드 입 니 다.다음 과 같 습 니 다.

# -*- coding: utf-8 -*-
from MySSH import MySSH
import json,os,sys,argparse

class InitJson():
  def __init__(self,db):
    self.db_name = db
  def GetPlatform(self,plat):
    with open(self.db_name, "r", encoding="utf-8") as Read_Pointer:
      load_json = json.loads(Read_Pointer.read())
      for k,v in load_json.items():
        try:
          if k == plat:
            return v
        except Exception:
          return None
    return None

if __name__ == "__main__":
  ptr = InitJson("database.json")
  parser = argparse.ArgumentParser()

  parser.add_argument("-G","--group",dest="group",help="     ")
  parser.add_argument("-C","--cmd",dest="cmd",help="  CMD  ")
  parser.add_argument("--get",dest="get",help="        <ping>")
  parser.add_argument("--dst", dest="dst_file",help="    ")
  parser.add_argument("--src",dest="src_file",help="     ")
  args = parser.parse_args()

  #   CMD --group=aix --cmd=ls
  if args.group and args.cmd:
    platform = ptr.GetPlatform(args.group)
    success,error = [],[]
    for each in platform:
      ssh = MySSH(each[0], each[1], each[2], 22)
      if ssh.Init() != False:
        print("-" * 140)
        print("  : {0:15} \t   : {1:10} \t   : {2:10} \t   : {3:30}".
           format(each[0], each[1], each[2], args.cmd))
        print("-" * 140)
        print(ssh.BatchCMD(args.cmd))
        ssh.CloseSSH()
        success.append(each[0])
      else:
        error.append(each[0])
        ssh.CloseSSH()
    print("

","-" * 140, "

", "-" * 140, "
: {}
".format(error), "-" * 140) # --group=centos --get=ping if args.group and args.get: platform = ptr.GetPlatform(args.group) success, error = [], [] for each in platform: ssh = MySSH(each[0], each[1], each[2], 22) # ping if ssh.Init() != False: if args.get == "ping": ret = ssh.GetPing() if ret == True: print("[*] : {} .".format(each[0])) # elif args.get == "disk": print("-" * 140) print(" : {0:15} \t : {1:10} \t : {2:10}". format(each[0], each[1], each[2])) print("-" * 140) ret = ssh.GetAllDiskSpace() for k, v in ret.items(): if (v.split("%")[0] != "-"): space_ret = int(v.split("%")[0]) if space_ret >= 70: print(" : {0:30} \t : {1:5} -> [ ]".format(k, v)) continue if space_ret >= 50: print(" : {0:30} \t : {1:5} -> [ ]".format(k, v)) continue else: print(" : {0:30} \t : {1:5}".format(k, v)) continue print() else: error.append(each[0]) ssh.CloseSSH() print("

", "-" * 140, "

", "-" * 140, "
: {}
".format(error), "-" * 140) # --group=centos --src=./a.txt --dst=/tmp/test.txt if args.group and args.src_file and args.dst_file: platform = ptr.GetPlatform(args.group) success, error = [], [] for each in platform: ssh = MySSH(each[0], each[1], each[2], 22) if ssh.Init() != False: ret = ssh.PutLocalFile(args.src_file,args.dst_file) if ret == True: print(" : {} \t : {} \t ---> : {}".format(each[0], args.src_file,args.dst_file)) else: error.append(each[0]) ssh.CloseSSH() print("

", "-" * 140, "

", "-" * 140, "
: {}
".format(error), "-" * 140)
간단 한 사용 명령:
원 격 CMD:python main.py--group=centos--cmd="free-h|grep-v'total'"

생존 판단:python main.py--group=centos--get="ping"

디스크 끌 어 오기:python main.py--group=suse--get="disk"

일괄 업로드 파일:python main.py--group=suse--src="./aaa"--dst="/tmp/bbb.txt"

나의 설비 가 적기 때문에 다 중 스 레 드 를 켜 지 않 았 기 때문에 다 중 스 레 드 를 켜 는 것 이 목표 에 너무 큰 압력 을 줄 까 봐 걱정 하고 필요 도 없다.
번 외:그리고 저 는 호스트 그룹 을 나 누 는 작은 도 구 를 연 구 했 습 니 다.명령 실행 코드 의 양 이 800 줄 밖 에 되 지 않 아서 그룹 데이터 베 이 스 를 실 현 했 습 니 다.여기 서 사용 방법 을 기록 하 십시오.
기본 실행 은 대화 식 셸 환경 에 들 어 갑 니 다.
Init=json 파일 초기 화,ShowHostList=모든 호스트 표시,ShowGroup=모든 그룹 표시,ShowAllGroup=모든 호스트 포함 그룹 표시.

수정 및 삭제 기록 을 추가 합 니 다.명령 은 다음 과 같 습 니 다.

호스트 그룹 삭제 추가.

UUID 를 통 해 호스트 그룹 에 호스트 기록 을 추가 하거나 삭제 합 니 다.

호스트 그룹의 연결 성 을 테스트 합 니 다.

이상 은 Python 이 Paramiko 의 2 차 패 키 징 을 어떻게 실현 하 는 지 에 대한 상세 한 내용 입 니 다.Python 이 Paramiko 의 2 차 패 키 징 을 실현 하 는 지 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기