通過paramiko模塊遠(yuǎn)程抓取日志
最近一直在學(xué)習(xí)Python,可是工作中一直缺少機(jī)會用到這塊功能.最近接到一個需求需要拉取6臺客戶端的某一天jetty日志.因為jetty的日志是保存在jetty的log目錄下,以yyyy_mm_dd.stderrout.log的形式保存,所以我們只要創(chuàng)建一個腳本,傳入需要查詢?nèi)罩镜娜掌诤托枰樵內(nèi)罩镜闹鳈C(jī)IP及用戶密碼,就可以將制定主機(jī)的指定日期的日志抓取到本地.
腳本的邏輯并不是很難,先模擬ssh訪問指定主機(jī),在指定目錄下通過find找到指定文件,將該文件通過sftp或scp將文件傳輸至本地.通過shell腳本會非常輕松.為了考驗自己的Python水平,這次我們通過Python的方式進(jìn)行實(shí)現(xiàn).主要用到的就是paramiko模塊.
paramiko是一個可以連接遠(yuǎn)程主機(jī)及上傳下載文件的一個第三方模塊,他基于ssh2協(xié)議.官網(wǎng)地址是http://www.paramiko.org/,安裝的方式非常簡單,通過easy_install paramiko或者在pypi中下載安裝包安裝都可以.
安裝完以后,我們通過之前我的那個實(shí)際案例來初步了解paramiko的遠(yuǎn)程連接和文件下載.
[root@Manatee ~]# cat pytest/paramiko #!/usr/bin/env Python import paramiko import sys import os loglist = []
#設(shè)定一個空列表用于存放日志文件名,因為一臺主機(jī)中有多個jetty項目,可能同一天會有多個日志. date = '2016_01_03' #傳入需要查詢的日期,這步可以通過參數(shù)傳入,或者讀取配置文件實(shí)現(xiàn) ip = '192.168.0.1' #傳入需要查詢的主機(jī)IP,這步可以通過參數(shù)傳入,或者讀取配置文件實(shí)現(xiàn) remoteuser = 'xxx' #傳入需要查詢的主機(jī)用戶,這步可以通過參數(shù)傳入,或者讀取配置文件實(shí)現(xiàn) remotepwd = 'xxx' #傳入需要查詢的主機(jī)密碼,這步可以通過參數(shù)傳入,或者讀取配置文件實(shí)現(xiàn) client = paramiko.client.SSHClient() #創(chuàng)建一個對象,建立一個ssh連接 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允許連接不在know_hosts文件中的主機(jī) client.connect(hostname=ip,username=remoteuser,password=remotepwd) #連接遠(yuǎn)程主機(jī) #connect(self, hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None) #connect可以傳入很多參數(shù),我們主要用到的是IP,端口(默認(rèn)22),用戶名,密碼 i,o,e = client.exec_command('find /hsdata/ljetty/ -name %s*'%(date)) #在遠(yuǎn)程執(zhí)行shell腳本,通過輸出流的方式輸出stdin,stdout,stderr,本例中通過find命令在指定目錄下找到以指定日期開頭的文件 loglist = o.readlines() #[u'/var/log/jettyMYSQL/logs/2016_01_03.stderrout.log\n'] #將標(biāo)準(zhǔn)輸出的文件讀取,賦值給loglist,輸出的的每個內(nèi)容其實(shí)是個unicode格式文本,之后使用的過程中需要轉(zhuǎn)換成utf8格式 client.close() #關(guān)閉連接 t = paramiko.Transport((ip,22)) #創(chuàng)建一個對象實(shí)例化paramiko.transport t.connect(username = remoteuser,password = remotepwd) #連接遠(yuǎn)程主機(jī) sftp = paramiko.SFTPClient.from_transport(t) #建立一個sftp對象,通過sshtransport遠(yuǎn)程操作文件 for i in loglist: #遍歷日志文件列表 print type(i) #unicode a = (i.encode('utf-8')).replace('\n','') #/var/log/jettyMYSQL/logs/2016_01_03.stderrout.log #將之前找到的日志文件名進(jìn)行處理,轉(zhuǎn)換unicode轉(zhuǎn)換至utf8格式,并去除尾部的\n字符. b = a.replace('/','') #varlogjettyMYSQLlogs2016_01_03.stderrout.log #將完全的路徑中的/刪除,得到的值作為將要保存在本地的文件名 if os.path.exists('/tmp/'+ip): #判斷是否存在以遠(yuǎn)程主機(jī)IP為名字的目錄,如果存在,則將文件下載到該目錄下,如果不存在,創(chuàng)建目錄后將文件下載到該目錄下. sftp.get(a,'/tmp/'+ip+'/'+b) else: os.makedirs('/tmp/'+ip) sftp.get(a,'/tmp/'+ip+'/'+b) t.close()
這樣我們就完成了簡單的遠(yuǎn)程連接主機(jī)執(zhí)行命令和下載文件的操作.現(xiàn)在只是完成了需求,完全可以將遠(yuǎn)程主機(jī)的IP,用戶名,密碼寫成一個配置文件,讀取配置文件進(jìn)行操作,也可以將命令寫成2個函數(shù),調(diào)用指定函數(shù)完成指定操作.