標籤:python 運行nmon使用說明
python 運行nmon使用說明
第一步:
安裝:paramiko
window安裝方法:pip install paramiko
參考:http://www.jb51.net/article/97655.htm
第二步:
以下程式碼封裝含發送命令與下載單個檔案與目錄檔案下的所有;
缺點是沒有寫出多進程方式執行;
#coding=utf-8
import paramiko,time,threading
import os, sys,shutil
from stat import *
def get_year_mon_day_hour_min_sec():
time_array = time.localtime()
result= "%s:%s:%s:%s:%s:%s" %(time_array.tm_year,time_array.tm_mon,time_array.tm_mday,time_array.tm_hour,time_array.tm_min,time_array.tm_sec)
return result
def get_year_mon_day():
time_array = time.localtime()
result= u"%s年 %s月%s日" %(time_array.tm_year,time_array.tm_mon,time_array.tm_mday)
return result
def get_hour_min_sec():
time_array = time.localtime()
result= u"%s : %s : %s " %(time_array.tm_hour,time_array.tm_min,time_array.tm_sec)
return result
def get_y_m_d_h_ms():
import datetime
result = datetime.datetime.now().strftime("%Y%m%d%H%M%S_")
return result
定義一個類,表示一台遠端linux主機
class Linux(object):
通過IP, 使用者名稱,密碼,逾時時間初始化一個遠程Linux主機
def __init__(self, ip, username, password, port=22,timeout=30): self.ip = ip self.username = username self.password = password self.port = port self.timeout = timeout # transport和chanel self.t = ‘‘ self.chan = ‘‘ # 連結失敗的重試次數 self.try_times = 3# 調用該方法串連遠程主機def connect(self): transport = paramiko.Transport((self.ip, self.port)) transport.connect(username=self.username, password=self.password) self.__transport = transport# 中斷連線def close(self): self.__transport.close()# 發送要執行的命令def send(self, command): self.connect() ssh = paramiko.SSHClient() ssh._transport = self.__transport # 執行命令 stdin, stdout, stderr = ssh.exec_command(command) # 擷取命令結果 result = stdout.read() print result self.close()# get單個檔案def sftp_get(self, remotefile, localfile): t = paramiko.Transport(sock=(self.ip, self.port)) t.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(t) sftp.get(remotefile, localfile) print ‘下載完成‘ t.close()# put單個檔案def sftp_put(self, localfile, remotefile): t = paramiko.Transport(sock=(self.ip, self.port)) t.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(t) sftp.put(localfile, remotefile) print "上傳成功" t.close()# ------擷取遠端linux主機上指定目錄及其子目錄下的所有檔案------def __get_all_files_in_remote_dir(self, sftp, remote_dir): # 儲存所有檔案的列表 all_files = list() # 去掉路徑字串最後的字元‘/‘,如果有的話 if remote_dir[-1] == ‘/‘: remote_dir = remote_dir[0:-1] # 擷取當前指定目錄下的所有目錄及檔案,包含屬性值 files = sftp.listdir_attr(remote_dir) for x in files: # remote_dir目錄中每一個檔案或目錄的完整路徑 filename = remote_dir + ‘/‘ + x.filename # 如果是目錄,則遞迴處理該目錄,這裡用到了stat庫中的S_ISDIR方法,與linux中的宏的名字完全一致 if S_ISDIR(x.st_mode): all_files.extend(self.__get_all_files_in_remote_dir(sftp, filename)) else: all_files.append(filename) return all_files# ------擷取本地指定目錄及其子目錄下的所有檔案------def __get_all_files_in_local_dir(self, local_dir): # 儲存所有檔案的列表 all_files = list() # 擷取當前指定目錄下的所有目錄及檔案,包含屬性值 files = os.listdir(local_dir) for x in files: # local_dir目錄中每一個檔案或目錄的完整路徑 filename = os.path.join(local_dir, x) # 如果是目錄,則遞迴處理該目錄 if os.path.isdir(x): all_files.extend(self.__get_all_files_in_local_dir(filename)) else: all_files.append(filename) return all_files#擷取本地指定目錄及其子目錄下的所有檔案def sftp_put_dir(self, local_dir, remote_dir): t = paramiko.Transport(sock=(self.ip, self.port)) t.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(t) # 去掉路徑字元穿最後的字元‘/‘,如果有的話 if remote_dir[-1] == ‘/‘: remote_dir = remote_dir[0:-1] # 擷取本地指定目錄及其子目錄下的所有檔案 all_files = self.__get_all_files_in_local_dir(local_dir) # 依次put每一個檔案 for x in all_files: filename = os.path.split(x)[-1] remote_filename = remote_dir + ‘/‘ + filename print u‘Put檔案%s傳輸中...‘ % filename sftp.put(x, remote_filename)# 擷取遠端linux主機上指定目錄及其子目錄下的所有檔案def sftp_get_dir(self, remote_dir, local_dir): t = paramiko.Transport(sock=(self.ip, self.port)) t.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(t) # 擷取遠端linux主機上指定目錄及其子目錄下的所有檔案 all_files = self.__get_all_files_in_remote_dir(sftp, remote_dir) # 依次get每一個檔案 for x in all_files: filename = x.split(‘/‘)[-1] local_filename = os.path.join(local_dir, filename) print u‘Get檔案%s傳輸中...‘ % filename sftp.get(x, local_filename)#檔案分離def copy_file(self, base_file_path): file_list = os.listdir(base_file_path) s = set() for i in file_list: # 取檔案名稱中的年月日,存set去重 data = i.split(‘_‘)[:3] d = ‘‘ for j in data: d = d + j + "_" s.add(d) base_path = os.path.dirname(base_file_path) # 取基礎檔案的父目錄 for i in s: path = os.path.join(base_path, i) # 拼路徑(基礎檔案的父目錄+以年月日命名的檔案名稱) if not os.path.exists(path): os.mkdir(r‘%s\%s‘ % (base_path, i)) # 建立檔案,以年月日命名 for j in file_list: if i in j: new_path = os.path.join(path, j) file_path = os.path.join(base_file_path, j) shutil.copyfile(file_path, new_path) # 複製檔案 print(‘複製完成!!‘)
if name==‘main‘:
try: with open(‘ip.list‘, ‘r‘) as file: for line in file.readlines(): ip = str(line.split(‘:‘)[0]) host_address = ip.replace(‘.‘,‘_‘) username = str(line.split(‘:‘)[1]) password = str(line.split(‘:‘)[2]) cmds = (line.split(‘:‘)[3:-1]) print "########"+ip+"######"+get_year_mon_day()+""+get_hour_min_sec()+"#####" host = Linux(ip, username, password) host.send("cd /home/nmon;./nmon -f -t -r -test_3_19 -s 5 -c 10 -F "+get_y_m_d_h_m_s()+""+host_address+".nmon -m ../nmon_results;cd ../nmon_results;ls -l") #735 #刪除 #host.send("cd sysinfo_nmon;rm -rf *;ls -l") #cd sysinfo_nmon;rm -rf *;ls -l #host.sftp_get_dir(remote_path, local_path) # 將遠端的xxoo.txt get到本地,並儲存為ooxx.txt #host.sftp_get(remote_path, local_path) #host.sftp_get_dir(remote_path, local_path)except: print u"請查看資料是否下載完成!!"end_time = time.time()# 將本地的xxoo.txt put到遠端,並保持為xxoo.txt# host.sftp_put(localfile, remotefile)# 將遠端remote_path目錄中的所有檔案get到本地local_path目錄# host.sftp_get_dir(remote_path, local_path)# 將本地local_path目錄中的所有檔案put到遠端remote_path目錄# host.sftp_put_dir(remote_path, local_path)
ip.list檔案檔案格式:
運行結果:
補充說明
使用者名稱需要有可執行許可權,否則失敗。
python 運行nmon使用說明