黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術(shù)文章
文章詳情頁

Python如何實(shí)現(xiàn)Paramiko的二次封裝

瀏覽:73日期:2022-06-28 17:04:09

Paramiko是一個(gè)用于執(zhí)行SSH命令的Python第三方庫,使用該庫可實(shí)現(xiàn)自動(dòng)化運(yùn)維的所有任務(wù),如下是一些常用代碼的封裝方式,多數(shù)代碼為半成品,只是敲代碼時(shí)的備份副本防止丟失,僅供參考。

目前本人巡檢百臺(tái)設(shè)備完全無壓力,如果要巡檢過千臺(tái)則需要多線程的支持,過萬臺(tái)則需要加入智能判斷等。

實(shí)現(xiàn)命令執(zhí)行: 直接使用過程化封裝,執(zhí)行CMD命令.

import paramikossh = 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('n', 'n') result = result.replace('b’', '').replace('’', '') return result else: return None except Exception: return None

實(shí)現(xiàn)磁盤巡檢: 獲取磁盤空間并返回字典格式

def GetAllDiskSpace(address,username,password,port): ref_dict = {} cmd_dict = {'Linuxn' : 'df | grep -v ’Filesystem’ | awk ’{print $5 ':' $6}’','AIXn' : 'df | grep -v ’Filesystem’ | awk ’{print $4 ':' $7}’'} # 首先檢測系統(tǒng)版本 os_version = BatchCMD(address,username,password,port,'uname') for version,run_cmd in cmd_dict.items(): if(version == os_version): # 根據(jù)不同版本選擇不同的命令 os_ref = BatchCMD(address,username,password,port,run_cmd) ref_list= os_ref.split('n') # 循環(huán)將其轉(zhuǎn)換為字典 for each in ref_list:# 判斷最后是否為空,過濾最后一項(xiàng)if each != '': ref_dict[str(each.split(':')[1])] = str(each.split(':')[0]) return ref_dict# 磁盤巡檢總函數(shù)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] != '-'): # 將占用百分比轉(zhuǎn)換為整數(shù) space_ret = int(v.split('%')[0]) if space_ret >= 70: print('033[31m 磁盤分區(qū): {0:30} t 磁盤占用: {1:5} 033[0m'.format(k,v)) continue if space_ret >= 50: print('033[33m 磁盤分區(qū): {0:30} t 磁盤占用: {1:5} 033[0m'.format(k, v)) continue else: print('033[34m 磁盤分區(qū): {0:30} t 磁盤占用: {1:5} 033[0m'.format(k, v)) continue print()# 組內(nèi)傳遞用戶名密碼時(shí)調(diào)用此方法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('磁盤分區(qū): {0:30} t 磁盤占用: {1:5} -> [警告]'.format(k, v))continue if space_ret >= 50:print('磁盤分區(qū): {0:30} t 磁盤占用: {1:5} -> [警惕]'.format(k, v))continue else:print('磁盤分區(qū): {0:30} t 磁盤占用: {1:5} -> [正常]'.format(k, v))continue print()

獲取系統(tǒng)內(nèi)存利用率: 獲取系統(tǒng)內(nèi)存利用率

def GetAllMemSpace(address,username,password,port): cmd_dict = {'Linuxn' : 'cat /proc/meminfo | head -n 2 | awk ’{print $2}’ | xargs | awk ’{print $1 ':' $2}’','AIXn' : 'df | grep -v ’Filesystem’ | awk ’{print $4 ':' $7}’'} # 首先檢測系統(tǒng)版本 os_version = BatchCMD(address,username,password,port,'uname') for version,run_cmd in cmd_dict.items(): if(version == os_version): # 根據(jù)不同版本選擇不同的命令 os_ref = BatchCMD(address,username,password,port,run_cmd) # 首先現(xiàn)將KB轉(zhuǎn)化為MB mem_total = math.ceil( int(os_ref.split(':')[0].replace('n','')) / 1024) mem_free = math.ceil(int(os_ref.split(':')[1].replace('n','')) / 1024) mem_used = str( int(mem_total) - int(mem_free)) # 計(jì)算占用空間百分比 percentage = 100 - int(mem_free / int(mem_total / 100)) print('內(nèi)存總計(jì)空間: {}'.format(str(mem_total) + ' MB')) print('內(nèi)存剩余空間: {}'.format(str(mem_free) + ' MB')) print('內(nèi)存已用空間: {}'.format(str(mem_used) + ' MB')) print('計(jì)算百分比: {}'.format(str(percentage) + ' %'))

獲取系統(tǒng)進(jìn)程信息: 獲取系統(tǒng)進(jìn)程信息,并返回字典格式

def GetAllProcessSpace(address,username,password,port): ref_dict = {} cmd_dict = {'Linuxn' : 'ps aux | grep -v ’USER’ | awk ’{print $2 ':' $11}’ | uniq','AIXn' : '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('n') for each in ref_list:if each != '': ref_dict[str(each.split(':')[0])] = str(each.split(':')[1]) return ref_dict# 巡檢進(jìn)程是否存在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): # 根據(jù)process中的值查詢base中的賬號密碼 base = js.get('base') if( list(process[x].keys())[0] == base[x][0] ):# 拿到賬號密碼之后再提取出他們的進(jìn)程ID于進(jìn)程名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 = 全部進(jìn)程列表 proc_val = 需要檢測的進(jìn)程列表ref_val = list(ref_dic.values())proc_val = list(process[x].values())[0]# 循環(huán)比較是否在列表中for each in proc_val: flag = each in ref_val if(flag == True): print('033[34m 進(jìn)程: {0:50} 狀態(tài): √ 033[0m'.format(each)) else: print('033[31m 進(jìn)程: {0:50} 狀態(tài): × 033[0m'.format(each))

實(shí)現(xiàn)劇本運(yùn)行功能: 針對特定一臺(tái)主機(jī)運(yùn)行劇本功能,隨便寫的一個(gè)版本,僅供參考

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 系統(tǒng)類型: {0:4} t 地址: {1:10} t 用戶名: {2:10} t 密碼: {3:15} t 端口: {4:4}033[0m' .format(os_version.replace('n',''),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 [>] 派發(fā)命令: {0:100} t 狀態(tài): {1:5} 033[0m'.format(RunCmd.replace(' > /dev/null 2>&1 && echo $?', ''),'正在派發(fā)')) os_ref = BatchCMD(address, username, password, port, RunCmd) if(os_ref == '0n'):print('033[34m [√] 運(yùn)行命令: {0:100} t 狀態(tài): {1:5} 033[0m'.format( RunCmd.replace(' > /dev/null 2>&1 && echo $?',''),'派發(fā)完成')) else:print('033[31m [×] 運(yùn)行命令: {0:100} t 狀態(tài): {1:5} 033[0m'.format( RunCmd.replace(' > /dev/null 2>&1 && echo $?',''),'派發(fā)失敗'))# 既然失敗了,就把剩下的也打出來吧,按照失敗處理for x in range(each+1,len(play)): print('033[31m [×] 運(yùn)行命令: {0:100} t 狀態(tài): {1:5} 033[0m'.format( play[x].replace(' > /dev/null 2>&1 && echo $?', ''), '終止執(zhí)行'))break else: return 0# 批量: 傳入主機(jī)組不同主機(jī)執(zhí)行不同劇本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('nn') print('-' * 130) print('執(zhí)行清單') print('-' * 130) for each in success: print('成功主機(jī): {}'.format(each)) for each in error: print('失敗主機(jī): {}'.format(each))# 運(yùn)行測試def PlayBookRun(): playbook = { 'Linuxn':[ '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這幾臺(tái)機(jī)器執(zhí)行playbook劇本 RunPlayBook(addr_list,playbook)

過程化實(shí)現(xiàn)文件上傳下載: 文件傳輸功能 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 上傳到目標(biāo) 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('接收主機(jī) tt 登錄用戶 t 登錄密碼 t 登錄端口 t 本地文件 tt 傳輸?shù)?ttt 傳輸狀態(tài)') print('-' * 130) for each in range(0,len(base)): # 先判斷主機(jī)是否可通信 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))# 批量將目標(biāo)文件拉取到本地特定目錄(存在缺陷)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('發(fā)送主機(jī) tt 登錄用戶 t 登錄密碼 t 登錄端口 tt 遠(yuǎn)程文件 tt 拉取到 ttt 傳輸狀態(tài)') 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))

另一種命令執(zhí)行方法:

import paramikossh = 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# 通過獲取主機(jī)Ping狀態(tài)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地址','機(jī)器系統(tǒng)','設(shè)備SN','機(jī)房位置','存活狀態(tài)','主機(jī)作用')) 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('進(jìn)程: {0:18} t PID: {1:10} t 狀態(tài): {2}'.format(proc[process], int(ref),'√'))else: print('進(jìn)程: {0:18} t PID:{1:10} t 狀態(tài): {2}'.format(proc[process], 0,'×')) except Exception:print('進(jìn)程: {0:18} t PID:{1:10} t 狀態(tài): {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 登錄系統(tǒng): {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('n', 'n') print(st.replace('b’', '').replace('’', '')) except Exception: pass print() fp.close()# 運(yùn)行命令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 登錄系統(tǒng): {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('n', 'n')print(st.replace('b’', '').replace('’', '')) except Exception:pass fp.close()

面向?qū)ο蟮姆庋b方法: 使用面向?qū)ο蠓庋b,可極大的提高復(fù)用性。

import paramikoclass 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('n', 'n') 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,reclass 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('n', 'n')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('n','') # 判斷文件是否存在 def IsFile(self,file_path): return self.BatchCMD('[ -e {} ] && echo ’True’ || echo ’False’'.format(file_path))

通過Eval函數(shù)解析執(zhí)行: 自定義語法規(guī)則與函數(shù),通過Eval函數(shù)實(shí)現(xiàn)解析執(zhí)行. 沒寫完,僅供參考。

import json,os,sys,mathimport argparse,time,reimport paramikossh = 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('n', 'n') result = result.replace('b’', '').replace('’', '') return result else: return None except Exception: return None# ------------------------------------------------------------------------# 內(nèi)置解析方法def GetDisk(x): return str(x)def GetCPULoad(): return str(10)# 句式解析器,解析句子并執(zhí)行def judge(string): # 如果匹配到IF則執(zhí)行判斷條件解析 if re.findall(r’IF{ (.*?) }’, string, re.M) != []: # 則繼續(xù)提取出他的表達(dá)式 ptr = re.compile(r’IF[{] (.*?) [}]’,re.S) subject = re.findall(ptr,string)[0] subject_list = subject.split(' ') # 拼接語句并執(zhí)行 sentence = eval(subject_list[0]) + subject_list[1] + subject_list[2] # 組合后執(zhí)行,返回結(jié)果 if eval(sentence): return 'IF' else: return False # 如果匹配到put則執(zhí)行上傳解析 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('劇本名稱','應(yīng)用平臺(tái)','應(yīng)用端口','執(zhí)行主機(jī)數(shù)','命令條數(shù)')) print('-' * 90) for switch in all_files: # 首先判斷文件結(jié)尾是否為Json if( switch.endswith('.json') == True): all_switch_dir = rootdir + switch try:# 判斷文件內(nèi)部是否符合JSON規(guī)范with open(all_switch_dir , 'r' ,encoding='utf-8') as read_file: # 判斷是否存在指定字段來識別規(guī)范 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} tt {3:5} tt {4:5}'. format(switch,load.get('framework'),load.get('default_port'),run_addr_count,command_count)) except ValueError:pass# 指定一個(gè)劇本并運(yùn)行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') # 循環(huán)每個(gè)主機(jī)任務(wù) for each in address_list: # 得到劇本內(nèi)容 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')

定義劇本規(guī)范如下。

{ 'framework': 'Centos', 'version': '7.0', 'address_list': [ ['192.168.191.3','root','1233'] ], 'default_port': '22', 'task_sequence': [ ['ifconfig'], ['IF{ GetLastCmdFlag() == True }','uname'] ]}

詞法分析: 詞法分析解析劇本內(nèi)容。

# 獲取特定目錄下所有的劇本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('劇本名稱','應(yīng)用平臺(tái)','應(yīng)用端口','執(zhí)行主機(jī)數(shù)','命令條數(shù)')) print('-' * 90) for switch in all_files: # 首先判斷文件結(jié)尾是否為Json if( switch.endswith('.json') == True): all_switch_dir = rootdir + switch try:# 判斷文件內(nèi)部是否符合JSON規(guī)范with open(all_switch_dir , 'r' ,encoding='utf-8') as read_file: # 判斷是否存在指定字段來識別規(guī)范 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} tt {3:5} tt {4:5}'. format(switch,load.get('framework'),load.get('default_port'),run_addr_count,command_count)) except ValueError:pass# 句式解析器,解析句子并執(zhí)行def judge(string): # 如果匹配到IF則執(zhí)行判斷條件解析 if re.findall(r’IF{ (.*?) }’, string, re.M) != []: # 則繼續(xù)提取出他的表達(dá)式 ptr = re.compile(r’IF[{] (.*?) [}]’,re.S) subject = re.findall(ptr,string)[0] subject_list = subject.split(' ') # 公開接口,執(zhí)行命令 ssh = MySSH('192.168.191.3','root','1233','22') # 組合命令并執(zhí)行 sentence = str(eval(subject_list[0]) + subject_list[1] + subject_list[2]) if eval(sentence): return 'IF',ssh else: return False # 如果匹配到put則執(zhí)行上傳解析 elif re.findall(r’PUT{ (.*?) }’, string, re.M) != []: print('put') return False# 指定一個(gè)劇本并運(yùn)行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') # 循環(huán)每個(gè)主機(jī)任務(wù) for each in address_list: # 得到劇本內(nèi)容 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類最終封裝: 通過面向?qū)ο髮ζ溥M(jìn)行封裝,實(shí)現(xiàn)了查詢CPU,負(fù)載,內(nèi)存利用率,磁盤容量,等通用數(shù)據(jù)的獲取。

import paramiko, math,jsonclass MySSH: def __init__(self, address, username, password, default_port): self.address = address self.default_port = default_port self.username = username self.password = password # 初始化,遠(yuǎn)程模塊 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 # 執(zhí)行非交互命令 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('n', 'n')result = result.replace('b’', '').replace('’', '')return result else:return None except Exception: return None # 將遠(yuǎn)程文件下載到本地 def GetRemoteFile(self, remote_path, local_path): try: self.sftp_obj.get(remote_path, local_path) return True except Exception: return False # 將本地文件上傳到遠(yuǎn)程 def PutLocalFile(self, localpath, remotepath): try: self.sftp_obj.put(localpath, remotepath) return True except Exception: return False # 關(guān)閉接口 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('n', '') # 判斷文件是否存在 def IsFile(self, file_path): return self.BatchCMD('[ -e {} ] && echo ’True’ || echo ’False’'.format(file_path)) # 獲取系統(tǒng)型號 def GetSystemVersion(self): return self.BatchCMD('uname') # 檢測目標(biāo)主機(jī)存活狀態(tài) 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_sizeref_list.append(dict) return ref_list except Exception: return False # 將遠(yuǎn)程文件全部打包后拉取到本地 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 = {'Linuxn': 'df | grep -v ’Filesystem’ | awk ’{print $5 ':' $6}’', 'AIXn': '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): # 根據(jù)不同版本選擇不同的命令 os_ref = self.BatchCMD(run_cmd) ref_list = os_ref.split('n') # 循環(huán)將其轉(zhuǎn)換為字典 for each in ref_list: # 判斷最后是否為空,過濾最后一項(xiàng) if each != '': ref_dict[str(each.split(':')[1])] = str(each.split(':')[0]) return ref_dict except Exception: return False # 獲取系統(tǒng)內(nèi)存利用率 def GetAllMemSpace(self): cmd_dict = {'Linuxn': 'cat /proc/meminfo | head -n 2 | awk ’{print $2}’ | xargs | awk ’{print $1 ':' $2}’', 'AIXn': '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): # 根據(jù)不同版本選擇不同的命令 os_ref = self.BatchCMD(run_cmd) # 首先現(xiàn)將KB轉(zhuǎn)化為MB mem_total = math.ceil(int(os_ref.split(':')[0].replace('n', '')) / 1024) mem_free = math.ceil(int(os_ref.split(':')[1].replace('n', '')) / 1024) # 計(jì)算占用空間百分比 percentage = 100 - int(mem_free / int(mem_total / 100)) # 拼接字典數(shù)據(jù) return {'Total': str(mem_total), 'Free': str(mem_free), 'Percentage': str(percentage)} except Exception: return False # 獲取系統(tǒng)進(jìn)程信息,并返回字典格式 def GetAllProcessSpace(self): ref_dict = {} cmd_dict = {'Linuxn': 'ps aux | grep -v ’USER’ | awk ’{print $2 ':' $11}’ | uniq', 'AIXn': '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('n') 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 = {'Linuxn': 'vmstat | tail -n 1 | awk ’{print $13 ':' $14 ':' $15}’', 'AIXn': '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('n') 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 # 獲取機(jī)器的負(fù)載情況 def GetLoadAVG(self): ref_dict = {} cmd_dict = {'Linuxn': 'uptime | awk ’{print $10 ':' $11 ':' $12}’', 'AIXn': '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('n') 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 # 修改當(dāng)前用戶密碼 def SetPasswd(self,username,password): try: os_id = self.BatchCMD('id | awk {’print $1’}') print(os_id) if(os_id == 'uid=0(root)n'):self.BatchCMD('echo ’{}’ | passwd --stdin ’{}’ > /dev/null'.format(password,username))return True except Exception: return False# 定義超類,集成基類MySSHclass SuperSSH(MySSH): def __init__(self,address, username, password, default_port): super(SuperSSH, self).__init__(address, username, password, default_port)

我們繼續(xù)為上面的代碼加上命令行,讓其可以直接使用,這里需要遵循一定的格式規(guī)范,我們使用JSON解析數(shù)據(jù),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 MySSHimport json,os,sys,argparseclass 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 vexcept Exception: return None return Noneif __name__ == '__main__': ptr = InitJson('database.json') parser = argparse.ArgumentParser() parser.add_argument('-G','--group',dest='group',help='指定主機(jī)組') parser.add_argument('-C','--cmd',dest='cmd',help='指定CMD命令') parser.add_argument('--get',dest='get',help='指定獲取數(shù)據(jù)類型<ping>') parser.add_argument('--dst', dest='dst_file',help='目標(biāo)位置') 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('主機(jī): {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('nn','-' * 140, 'n 執(zhí)行報(bào)告 n', '-' * 140, 'n失敗主機(jī): {}n'.format(error), '-' * 140) # 批量獲取主機(jī)其他數(shù)據(jù) --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)# 判斷是否為pingif ssh.Init() != False: if args.get == 'ping': ret = ssh.GetPing() if ret == True: print('[*] 主機(jī): {} 存活中.'.format(each[0])) # 收集磁盤數(shù)據(jù) elif args.get == 'disk': print('-' * 140) print('主機(jī): {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('磁盤分區(qū): {0:30} t 磁盤占用: {1:5} -> [警告]'.format(k, v)) continueif space_ret >= 50: print('磁盤分區(qū): {0:30} t 磁盤占用: {1:5} -> [警惕]'.format(k, v)) continueelse: print('磁盤分區(qū): {0:30} t 磁盤占用: {1:5}'.format(k, v)) continue print()else: error.append(each[0]) ssh.CloseSSH() print('nn', '-' * 140, 'n 執(zhí)行報(bào)告 n', '-' * 140, 'n失敗主機(jī): {}n'.format(error), '-' * 140) # 實(shí)現(xiàn)文件上傳過程 --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('主機(jī): {} t 本地文件: {} t ---> 傳到: {}'.format(each[0], args.src_file,args.dst_file)) else:error.append(each[0])ssh.CloseSSH() print('nn', '-' * 140, 'n 執(zhí)行報(bào)告 n', '-' * 140, 'n失敗主機(jī): {}n'.format(error), '-' * 140)

簡單的使用命令:

遠(yuǎn)程CMD: python main.py --group=centos --cmd='free -h | grep -v ’total’'

Python如何實(shí)現(xiàn)Paramiko的二次封裝

判斷存活: python main.py --group=centos --get='ping'

Python如何實(shí)現(xiàn)Paramiko的二次封裝

拉取磁盤:python main.py --group=suse --get='disk'

Python如何實(shí)現(xiàn)Paramiko的二次封裝

批量上傳文件: python main.py --group=suse --src='http://m.propowerdrill.cn/bcjs/aaa' --dst='/tmp/bbb.txt'

Python如何實(shí)現(xiàn)Paramiko的二次封裝

由于我的設(shè)備少,所以沒開多線程,擔(dān)心開多線程對目標(biāo)造成過大壓力,也沒啥必要。

番外: 另外我研究了一個(gè)主機(jī)分組的小工具,加上命令執(zhí)行代碼量才800行,實(shí)現(xiàn)了一個(gè)分組數(shù)據(jù)庫,在這里記下使用方法。

默認(rèn)運(yùn)行進(jìn)入一個(gè)交互式shell環(huán)境。

Init = 初始化json文件,ShowHostList=顯示所有主機(jī),ShowGroup=顯示所有組,ShowAllGroup=顯示所有主機(jī)包括組。

Python如何實(shí)現(xiàn)Paramiko的二次封裝

添加修改與刪除記錄,命令如下。

Python如何實(shí)現(xiàn)Paramiko的二次封裝

添加刪除主機(jī)組。

Python如何實(shí)現(xiàn)Paramiko的二次封裝

通過UUID向主機(jī)組中添加或刪除主機(jī)記錄。

Python如何實(shí)現(xiàn)Paramiko的二次封裝

測試主機(jī)組連通性。

Python如何實(shí)現(xiàn)Paramiko的二次封裝

以上就是Python如何實(shí)現(xiàn)Paramiko的二次封裝的詳細(xì)內(nèi)容,更多關(guān)于Python實(shí)現(xiàn)Paramiko的二次封裝的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲精品观看 | 精品一区二区三区在线视频 | 成人影| 中文字幕无码日韩欧毛 | 亚洲自拍色图 | 欧美tv| 欧美交受高潮1 | 一级特黄aaaaaa大片 | 911久久| 天天射天天射 | 久久久久久久久嫩草精品乱码 | 不卡av在线免费观看 | 精品国产一 | 秋霞一级视频 | 秋霞网一区二区 | 91亚洲成a人片在线观看www | 亚洲裸体大白屁股xxx | 熟妇人妻无乱码中文字幕真矢织江 | 久久久这里有精品 | 日日夜夜亚洲 | 美腿丝袜亚洲色图 | 日韩区在线 | jizz亚洲女人高潮大叫 | 亚洲欧洲自拍 | 欧美刺激性大交 | 韩国三级hd中文字幕叫床 | 久久99国产精品久久 | 丁香婷婷六月天 | 天天躁日日躁狠狠的躁天龙影院 | 上原瑞穗av在线播放 | 又色又爽又高潮免费视频观看酒店 | 亚洲一区二区国产 | 新婚若妻侵犯中文字幕 | 麻豆久久久久久久 | 日韩在线永久免费播放 | 国产精品白浆无码流出 | 日韩视频欧美视频 | 免费美女毛片 | 欧美日韩国产码高清 | 天天综合日日夜夜 | 五月婷六月丁香狠狠躁狠狠爱 | 中文字幕一级二级三级 | 午夜视频福利 | 午夜肉伦伦影院九七影网 | 婷色| 婷婷亚洲视频 | 97久久精品人人澡人人爽缅北 | 精品日韩一区二区三区免费视频 | 俄罗斯毛片 | 欲妇荡岳丰满少妇岳91在线 | 日韩免费观看视频 | 制服丝袜手机在线 | 色综合狠狠 | 国产情侣主伺候绿帽男m | 国产女无套免费网在线观看 | 五月激情六月丁香激情天堂 | 国产精品亚洲а∨天堂123bt | 亚洲久久一区 | 亚洲最大成人网4388xx | 精品国产av 无码一区二区三区 | 欧美日韩不卡视频 | 亚洲国产成人一区二区精品区 | 成年人黄色大片大全 | 中文字幕在线无码一区二区三区 | 日韩一级免费观看 | 国产人伦精品一区二区三区 | 久久久久91| 亚洲精品成人无码中文毛片 | 国产一区二区三区四区在线观看 | 国产a√精品区二区三区四区 | 久在线精品视频线观看 | а天堂8中文最新版在线官网 | 又爽又黄又无遮挡网站 | 国产精品处女 | 国产精品亚洲专区无码牛牛 | 肉丝美足丝袜一区二区三区四 | 国产精品区在线观看 | 国产av一区最新精品 | 欲色网站 | www.黄色大片 | 日本肉体xxxx裸体784大胆 | 无码av中文字幕久久专区 | 日本理论中文字幕 | 国产成人无码a区在线观看导航 | 97久久精品人妻人人搡人人玩 | 天天躁夜夜躁狠狠躁2020色戒 | 潮喷失禁大喷水无码 | 懂色av蜜臂av粉嫩av | 亚洲欧洲在线视频 | 18视频在线观看网站 | 激情三级在线 | 国产一区二区三区四区hd | 人妻aⅴ无码一区二区三区 日本一卡2卡3卡四卡精品网站 | 少妇又色又紧又大爽又刺激 | 尤物久久| 国产亚洲中字幕欧 | 色狠狠av一区二区三区香蕉蜜桃 | 怡红院成永久免费人全部视频 | 毛片88 | 欧美最猛黑人xxxx黑人猛交98 | a在线视频| 亚洲精品五月天 | 午夜成人在线视频 | 亚洲天堂2016| 老牛影视av老牛影视av | 亚洲色综合 | 波多一区 | 另类av在线 | 国产福利一区二区三区在线观看 | 天天操天天撸 | 噜噜噜亚洲色成人网站 | 4444亚洲人成无码网在线观看 | 国产精品久久久久9999小说 | 搞黄视频在线免费观看 | 日韩av手机在线免费观看 | 九九热这里只有精品6 | 亚洲综合网址 | 日本bbwbbw| 亚洲精品日日夜夜 | 国产一区二区三区在线观看免费 | 手机看片福利视频 | 久久精品欧美视频 | 成人午夜福利视频 | 国产一区中文 | 熟女丰满老熟女熟妇 | 国产成人啪精品视频免费软件 | 亚洲第99页| 国产69精品久久久久9999不卡免费 | 欧美激情性生活 | 中文字幕乱码亚洲无线码小说 | 天天躁日日躁狠狠躁欧美老牛 | 久久综合a∨色老头免费观看 | 男女啪啪永久免费观看网站 | 欧美视频在线观看一区二区 | 一本一道久久综合久久 | xxxxx日韩| 婷婷激情在线 | 欧日韩一区二区三区 | 日韩精品一区二区视频 | 天天插插插| 国产女人高潮叫床视频 | 国产第一网站 | 国产四区视频 | 天天天欲色欲色www免费 | 亚洲国产精彩中文乱码av | 久久黄色视 | 九九综合九九综合 | 无码免费一区二区三区免费播放 | jzjzjz欧美丰满少妇 | 国产精品毛片va一区二区三区 | 国产在线精品一区二区在线看 | 色网在线免费观看 | 狠狠躁夜夜躁人人躁婷婷视频 | 在线看中文字幕 | 精品久久久久久久久中文字幕 | 成人精品区 | 日韩欧美小视频 | 国产精品毛片视频 | 国产成人a在线观看视频 | 成人免费视频视频 | 日本精品在线视频 | 美女的屁股眼网站 | 精品国产大片大片大片 | 亚洲精品国产综合99久久夜夜嗨 | 四虎精品一区二区免费 | 官场艳妇疯狂性关系 | 福利资源在线观看 | 亚洲高潮 | 欧美片在线观看 | 久久久午夜爽爽一区二区三区三州 | 狼人综合网| 色在线免费观看 | 天天看片天天爽 | 99国产精品丝袜久久久久久 | 日日摸夜夜骑 | 男ji大巴进入女人的视频 | 欧美乱大交xxxxx疯狂俱乐部 | 精品无码国产污污污免费网站 | 欧美饥渴熟妇高潮喷水水 | 一区二区在线观看免费 | 国产精品短视频 | 天天躁日日躁mmmmxxxx | 成人网6969conwww| 大战肉丝少妇在线观看 | 久久婷婷国产麻豆91天堂 | 黄视频在线免费看 | 九九热久久久99国产盗摄蜜臀 | 日本又色又爽又黄的a片18禁 | 成人黄色网 | 亚洲第一色播 | 国产精品福利在线 | 国产精品久久久一区二区三区网站 | 尤物在线观看视频 | 国产精品原创巨作av | 久久影音先锋 | 日本猛少妇色xxxxx猛叫 | 久草不卡 | 性高朝久久久久久久3小时 av片在线观看 | 一本色道久久综合亚洲精品 | 日韩成人精品 | 国产精品视频一区二区三区不卡 | 久久免费少妇高潮99精品 | 玖玖在线 | 免费国产在线精品一区二区三区 | 在线看片免费人成视频播 | 中文字幕无码视频专区 | 一本一道人人妻人人妻αv 自拍日韩亚洲一区在线 | 宅女午夜福利免费视频 | 国产精品a久久 | 宅男噜噜噜66一区二区 | 妺妺窝人体色www看人体 | 无码精品国产一区二区三区免费 | 国产亚洲欧美在线观看 | 久久女同互慰一区二区三区 | 激情视频一区二区三区 | 噼里啪啦国语版在线观看 | 久久三级网站 | 国产一区二区三区精品久久久 | 色哥网| 国产午夜福利精品一区二区三区 | 亚洲国产精品久久久久久 | 狠狠色先锋资源网 | 日本免费精品一区二区三区 | 一 级做人爱全视频在线看 亚洲成a∨人片在线观看不卡 | 日韩a级片在线观看 | 综合久久激情 | 中文字幕在线人 | www欧美色| mm131在线| 99热在线免费观看 | 国产精品国产三级国产普通话对白 | www.在线观看麻豆 | 久久久久久久蜜桃 | 日本在线观看黄色 | 久久99久久99精品蜜柚传媒 | 国产乱人伦无无码视频试看 | 成年人国产 | jzz国产| 中文字幕一区2区3区 | 无码专区aaaaaa免费视频 | 亚洲人成亚洲精品 | 国产69精品久久久久孕妇大杂乱 | 久久中文字幕人妻熟av女蜜柚m | 天堂mv在线mv免费mv香蕉 | 黄色片在线免费观看视频 | 久久久亚洲精品视频 | 国外成人在线视频 | 黑人干日本少妇 | 激情五月婷婷丁香 | 精品无码一区二区三区水蜜桃 | 九九影院最新理论片 | 久久免费的精品国产v∧ | 欧美日韩午夜群交多人轮换 | 免费观看久久久 | 夜夜躁人人爽天天天天大学生 | 欧美日韩精品人妻狠狠躁免费视频 | 中文字幕 人妻熟女 | 国产成人精品一区二区仙踪林 | 欧美在线 | 亚洲 | 国产精品特级毛片一区二区三区 | 成人涩涩| 经典国产乱子伦精品视频 | 国产精品久久久久9999高清 | 影音先锋亚洲资源 | av一二三区 | 免费羞羞午夜爽爽爽视频 | 国产精品久久久久久久久久免费 | 香蕉在线网 | 日本一区二区三区视频在线播放 | 国产伦精品一区二区 | 国精品无码一区二区三区左线 | 亚洲熟区| 欧美激情视频一区二区三区 | 亚洲精品乱码久久久久久蜜桃欧美 | 欧美日韩成人一区二区在线观看 | 日韩国产综合 | 国产一二区视频 | 黄色免费视频在线观看 | 超碰人人澡 | 亚洲欧美日韩愉拍自拍 | 国产三级网 | 国产农村妇女毛片精品 | 少妇性xxxxxxxxx色野 | 国产视频二区 | 丁香婷婷激情五月 | 蜜桃香蕉视频 | 天堂8在线新版官网 | 日本丰满熟妇videos | 国产精品偷伦视频免费还看的 | 色诱久久久久综合网ywww | 92av视频| 二个男人躁我一个视频 | 黄一区二区三区 | 国产人19毛片水真多19精品 | 99色热| xxx一区 | 青少年xxxxx性开放hg | 成人少妇影院yyyy | 日本国产在线视频 | 久久精品国产精品国产精品污 | 91视频观看| 狠狠综合 | 天天干夜夜玩 | 国产精品婷婷午夜在线观看 | 国产无套粉嫩白浆内谢的出处 | 东京道一本热中文字幕 | 亚洲欧美中文日韩v在线观看 | 一本无码人妻在中文字幕免费 | 97人人澡人人深人人添 | 热久久免费视频 | 拧花蒂尿用力按凸起喷水尿一区 | 中文视频在线 | 谁有免费的黄色网址 | 欧美一区二区三区在线观看视频 | 国产一区二区亚洲精品 | 97久久超碰国产精品2021 | 性色av无码久久一区二区三区 | 国产欧美日韩综合精品二区 | 成人亚洲性情网站www在线观看 | 中文字幕有码无码av | 人人揉人人捏人人添 | 亚洲少妇激情 | 欧美一区二区三区免费播放视频了 | 五月天堂色 | 爱爱视频网址 | 色狠狠一区二区三区香蕉 | 精品探花 | 亚洲成色在线综合网站 | 91极品美女| 99久久无色码中文字幕人妻 | 国产a在亚洲线播放 | а√天堂资源中文在线官网九色 | 成人在线高清 | 成人性生交大片免费看4 | 寂寞人妻瑜伽被教练日 | 蝌蚪自拍网站 | 久久精品噜噜噜成人 | 欧美成人自拍视频 | 国产中文区4幕区2022 | 欧美一区二区视频在线观看 | 91亚洲欧美 | 麻豆做爰免费观看 | 91麻豆vodafone精品 | 激情亚洲视频 | 亚洲视频在线观看网址 | 中文字幕第49页 | 好男人社区www在线官网 | 免费一级特黄3大片视频 | 伊人国产在线视频 | 天天干天天弄 | 欧美成人一区二免费视频小说 | 国产精品一区二区羞羞答答 | 人妻丰满熟妇岳av无码区hd | 插插操操 | 奇米影视四色7777 | 国产精品51麻豆cm传媒 | 美女极度色诱视频国产 | 超鹏在线视频 | 久久精品无码精品免费专区 | 男人用嘴添女人下身免费视频 | 97在线公开视频 | 欧美裸体xxxx极品少妇 | 亚洲综合无码无在线观看 | 亚洲精品久久久中文字幕痴女 | 少妇乳大丰满诱人2 | 色资源网站 | 蘑菇av| 国内精品久久久久久久97牛牛 | 久久精品探花 | 51国偷自产一区二区三区的 | 免费高清a级南片在线观看 免费高清成人 | 麻豆天天躁天天揉揉av | 久久久久久久久久免费 | 激情五月色综合国产精品 | 华人永久免费 | 免费欧美黄色 | 亚洲精品成 | 欧美真人性野外做爰 | 久久精品一区二区三区不卡牛牛 | 91亚洲乱码卡一卡二卡新区豆 | 日韩视频一区二区三区在线播放免费观看 | 色综合福利 | 狠狠干狠狠爱 | 91在线网址 | 国产精品99久久免费黑人人妻 | 国产精品一二三四五 | 久操视频在线观看 | 中文字幕av无码不卡免费 | 美女露出奶头扒开尿口免费网站 | 性猛交╳xxx乱大交 性猛交ⅹxxx富婆video | 成人在线观看小视频 | 国产91免费 | 亚洲欧美日韩国产精品一区午夜 | 91午夜少妇三级全黄 | 欧美城天堂网址 | 色吊丝永久性观看网站免费 | 成人av一区二区亚洲精 | 熟妇高潮精品一区二区三区 | 天堂网av在线 | 中文在线一区二区三区 | 精品一区二区三区在线观看视频 | 成人啪啪18免费网站看 | 欧美性xxxx极品少妇 | 爆爽久久久一区二区又大又黄又嫩 | 粉嫩一区二区三区 | 麻豆精品国产传媒av | 黄色一级片国产 | 女主和前任各种做高h | 国产极品美女到高潮 | 五月婷婷丁香在线 | 97免费视频在线 | 国产九九av | 亚洲乱轮视频 | 欧美日韩精品一区二区三区不卡 | 麻豆视频在线免费看 | 里番本子纯肉侵犯肉全彩无码 | 午夜激情视频免费观看 | 国色综合 | 精二青青河边草解释正确的是 | 国产在线观看免费麻豆 | 亚洲色一区二区三区四区 | 精品少妇久久 | 伊人夜夜躁av伊人久久 | 欧美乱插 | 凉森玲梦一区二区三区av免费 | 无码中文字幕在线播放2 | 极品色av| 亚洲第三区 | 无码福利日韩神码福利片 | 粉嫩av一区二区老牛影视 | 拨开少妇两片肥嫩的肉 | 99re8在线精品视频免费播放 | 欧美成年人视频 | aa黄色毛片 | 欧美va天堂在线电影 | 久久综合精品国产一区二区三区无码 | 综合久久久 | 天天操综合网 | 日韩欧美亚洲一区二区 | 夜夜骑夜夜操 | 中国极品少妇videossexhd 久久久久成人精品 | 怡红院成永久免费人全部视频 | 国产农村一国产农村无码毛片 | 欧美三级在线 | 成人网站免费看黄a站视频 欧美性猛交xxxx黑人 | 久久网站av| 麻豆一区二区三区 | 最新中文无码字字幕在线 | 少妇又紧又爽又黄的视频 | 成人美女黄网站色大免费的88 | 国产视频色 | 五月婷婷色丁香 | xxxx性xx另类ⅹ亚洲hd | 日日夜夜伊人 | 国产精品一国产精品 | 2020精品国产自在现线看 | 国产成人涩涩涩视频在线观看 | 偷窥自拍五月天 | 欧美8888| 久久123| 久久久夜夜 | 久久精品国产精品亚洲毛片 | 一级特黄aaa| 狠狠色综合网站久久久久久久 | 无码国产一区二区三区四区 | 人妻丰满熟妇av无码区不卡 | 色激情五月 | 精品久久久无码中字 | 久久伊人影视 | 妺妺窝人体色www看人体 | 精品入口麻豆88视频 | 黑人巨大精品欧美一区二区小视频 | 国语对白久久 | 欧美激情一区二区三区成人 | 中日韩乱码一二新区 | 欧美饥渴熟妇高潮喷水水 | 国产乱子伦视频一区二区三区 | 中文字幕无码日韩专区免费 | 欧美一级免费在线观看 | 91影院在线播放 | 超碰在线一区 | 国产成人一区二区啪在线观看 | 午夜私人福利 | 秋霞视频在线观看 | 肉色丝袜一区二区 | 狠狠老司机 | 成人性生交大片免费卡看 | ass色喜ass国模人体 | 白晶晶果冻传媒国产今日推荐 | 久久久成人av | 丰满熟女人妻中文字幕免费 | 欧美日韩一区二区综合 | 97超碰人人干 | 欧洲成人午夜免费大片 | 亚洲国产精品一区二区尤物区 | 污视频网站在线看 | 色诱久久久久综合网ywww | 香蕉视频网页版 | 日韩一区二区中文字幕 | 久久婷婷网 | 婚后日日高h文孕 | 裸身美女无遮挡永久免费视频 | www黄色在线| 色一情一乱一伦 | 精品国产乱码久久久久久蜜臀网站 | 宅女午夜福利免费视频 | 天堂伊人久久 | 亚洲日韩中文第一精品 | 欧美猛交xxx | 欧美日韩国语 | 一本大道久久久久精品嫩草 | 国产不卡一 | 成人影院免费 | 影音先锋中文字幕在线播放 | 免费看av大片| 日韩美一级片 | 久久久精品中文字幕麻豆发布 | 精品九九九九九 | 在线成人日韩 | 亚洲 欧美 日韩 在线 | 1204人成网站色www | 妖精视频一区二区 | 嫩草视频国产 | 青草内射中出高潮 | 怡红院毛片 | 德国艳星videos极品hd | 日本中文字幕在线不卡 | 精品久久久久久乱码天堂 | 天堂√8在线中文 | 欧美午夜精品理论片a级按摩 | 欧美午夜精品久久久久久蜜 | 爱情岛亚洲论坛入口 | 欧美精品免费在线 | 九一国产精品 | 国产精品爽爽爽 | 亚洲网视频 | 国产精品国产自线拍免费软件 | 美女露隐私免费网站 | 日韩欧美三级在线 | 苍井空亚洲精品aa片在线播放 | 国产97色在线 | 免费 | 99热99re6国产在线播放 | 青春草av | 久色精品视频 | 国产痴汉av久久精品 | 夜夜爽爽爽久久久久久魔女 | 国产乱了真实在线观看 | 免费午夜激情 | 天天狠天天操 | 最近中文字幕第一页 | 一级黄色av| 激情小说五月天 | 精品不卡一区二区 | 成人羞羞视频播放网站 | 四虎最新站名点击进入 | 日本精品人妻无码免费大全 | 国产成人亚洲在线观看 | 国产无遮挡猛进猛出免费软件 | 久久亚洲国产精品成人av秋霞 | 上原亚衣加勒比在线播放 | 天天干视频网站 | 久久国产精品波多野结衣 | 国产aⅴ精品一区二区三区久久 | 成人免费网站www网站高清 | 韩产日产国产欧产 | 少妇高潮av | 中文字幕丰满孑伦无码精品 | 一级二级毛片 | 亚洲人成亚洲人成在线观看 | 91精品国产一区二区 | 99免费在线| 欧美牲交a欧美牲交aⅴ久久 | wwwjizz欧美| 国产精品国产精品国产专区不片 | 无码av免费一区二区三区试看 | 五月婷婷综合激情网 | 97伦伦午夜电影理伦片 | 美女网站免费视频 | 一区二区在线播放视频 | 久久免费看少妇a高潮一片黄特 | 欧美一级黄色片视频 | 免费色视频网站 | 韩国v欧美v亚洲v日本v | 亚洲阿v天堂 | 国产一区精品在线观看 | 日本少妇又色又爽又高潮看你 | 一本色道久久综合亚洲精品按摩 | 国产麻豆一级片 | 日韩影视在线 | 青青草免费视频在线观 | 欧美激情xxx | 正在播放重口老熟女露脸 | 日韩久久激情综合啪啪 | 国产亚洲99天堂一区 | 无码h黄肉3d动漫在线观看 | 97超碰人人模人人人爽人人爱 | 国产精品久久高潮呻吟声 | 桃色一区二区三区 | 福利视频在线播放 | 日日日日日日 | 国产精品久久久久久av免费看 | 成人三级无码视频在线观看 | 久久久久久美女 | 久久精品区 | 国产三区二区 | 真人bbbbbbbbb毛片| 久久毛片基地 | 波多野结衣久久久久 | 欧美成人免费全部网站 | 麻豆国产尤物av尤物在线观看 | 日韩av在线免费看 | 91嫩草私人成人亚洲影院 | 欧美精品色婷婷五月综合 | 国产精品白嫩白嫩大学美女 | 日本久久久久久久做爰片日本 |