亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

通過paramiko模塊遠程抓取日志

    最近一直在學習Python,可是工作中一直缺少機會用到這塊功能.最近接到一個需求需要拉取6臺客戶端的某一天jetty日志.因為jetty的日志是保存在jetty的log目錄下,以yyyy_mm_dd.stderrout.log的形式保存,所以我們只要創(chuàng)建一個腳本,傳入需要查詢?nèi)罩镜娜掌诤托枰樵內(nèi)罩镜闹鳈CIP及用戶密碼,就可以將制定主機的指定日期的日志抓取到本地.

腳本的邏輯并不是很難,先模擬ssh訪問指定主機,在指定目錄下通過find找到指定文件,將該文件通過sftp或scp將文件傳輸至本地.通過shell腳本會非常輕松.為了考驗自己的Python水平,這次我們通過Python的方式進行實現(xiàn).主要用到的就是paramiko模塊.

paramiko是一個可以連接遠程主機及上傳下載文件的一個第三方模塊,他基于ssh2協(xié)議.官網(wǎng)地址是http://www.paramiko.org/,安裝的方式非常簡單,通過easy_install paramiko或者在pypi中下載安裝包安裝都可以.

安裝完以后,我們通過之前我的那個實際案例來初步了解paramiko的遠程連接和文件下載.

[root@Manatee ~]# cat pytest/paramiko
#!/usr/bin/env Python
import paramiko
import sys
import os
loglist = []
#設定一個空列表用于存放日志文件名,因為一臺主機中有多個jetty項目,可能同一天會有多個日志.
date = '2016_01_03'
#傳入需要查詢的日期,這步可以通過參數(shù)傳入,或者讀取配置文件實現(xiàn)
ip = '192.168.0.1'
#傳入需要查詢的主機IP,這步可以通過參數(shù)傳入,或者讀取配置文件實現(xiàn)
remoteuser = 'xxx'
#傳入需要查詢的主機用戶,這步可以通過參數(shù)傳入,或者讀取配置文件實現(xiàn)
remotepwd = 'xxx'
#傳入需要查詢的主機密碼,這步可以通過參數(shù)傳入,或者讀取配置文件實現(xiàn)
client = paramiko.client.SSHClient()
#創(chuàng)建一個對象,建立一個ssh連接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#允許連接不在know_hosts文件中的主機
client.connect(hostname=ip,username=remoteuser,password=remotepwd)
#連接遠程主機
#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,端口(默認22),用戶名,密碼
i,o,e = client.exec_command('find /hsdata/ljetty/ -name %s*'%(date))
#在遠程執(zhí)行shell腳本,通過輸出流的方式輸出stdin,stdout,stderr,本例中通過find命令在指定目錄下找到以指定日期開頭的文件
loglist = o.readlines()
#[u'/var/log/jettyMYSQL/logs/2016_01_03.stderrout.log\n'] 
#將標準輸出的文件讀取,賦值給loglist,輸出的的每個內(nèi)容其實是個unicode格式文本,之后使用的過程中需要轉(zhuǎn)換成utf8格式
client.close()
#關閉連接
t = paramiko.Transport((ip,22))
#創(chuàng)建一個對象實例化paramiko.transport
t.connect(username = remoteuser,password = remotepwd)
#連接遠程主機
sftp = paramiko.SFTPClient.from_transport(t)
#建立一個sftp對象,通過sshtransport遠程操作文件
for i in loglist:
#遍歷日志文件列表
    print type(i)
    #unicode
    a = (i.encode('utf-8')).replace('\n','')
    #/var/log/jettyMYSQL/logs/2016_01_03.stderrout.log
    #將之前找到的日志文件名進行處理,轉(zhuǎn)換unicode轉(zhuǎn)換至utf8格式,并去除尾部的\n字符.
    b = a.replace('/','')
    #varlogjettyMYSQLlogs2016_01_03.stderrout.log
    #將完全的路徑中的/刪除,得到的值作為將要保存在本地的文件名
    if os.path.exists('/tmp/'+ip):
    #判斷是否存在以遠程主機IP為名字的目錄,如果存在,則將文件下載到該目錄下,如果不存在,創(chuàng)建目錄后將文件下載到該目錄下.
        sftp.get(a,'/tmp/'+ip+'/'+b)
    else:
        os.makedirs('/tmp/'+ip)
        sftp.get(a,'/tmp/'+ip+'/'+b)
t.close()

這樣我們就完成了簡單的遠程連接主機執(zhí)行命令和下載文件的操作.現(xiàn)在只是完成了需求,完全可以將遠程主機的IP,用戶名,密碼寫成一個配置文件,讀取配置文件進行操作,也可以將命令寫成2個函數(shù),調(diào)用指定函數(shù)完成指定操作.

相關新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計算運維、SRE、Devops、網(wǎng)絡安全、云原生、Go、Python開發(fā)專業(yè)人才培訓機構!