通過paramiko模塊遠程抓取日志

    最近一直在學習python,可是工作中一直缺少機會用到這塊功能.最近接到一個需求需要拉取6臺客戶端的某一天jetty日志.因為jetty的日志是保存在jetty的log目錄下,以yyyy_mm_dd.stderrout.log的形式保存,所以我們只要創建一個腳本,傳入需要查詢日志的日期和需要查詢日志的主機IP及用戶密碼,就可以將制定主機的指定日期的日志抓取到本地.

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

paramiko是一個可以連接遠程主機及上傳下載文件的一個第三方模塊,他基于ssh2協議.官網地址是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'
#傳入需要查詢的日期,這步可以通過參數傳入,或者讀取配置文件實現
ip = '192.168.0.1'
#傳入需要查詢的主機IP,這步可以通過參數傳入,或者讀取配置文件實現
remoteuser = 'xxx'
#傳入需要查詢的主機用戶,這步可以通過參數傳入,或者讀取配置文件實現
remotepwd = 'xxx'
#傳入需要查詢的主機密碼,這步可以通過參數傳入,或者讀取配置文件實現
client = paramiko.client.SSHClient()
#創建一個對象,建立一個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可以傳入很多參數,我們主要用到的是IP,端口(默認22),用戶名,密碼
i,o,e = client.exec_command('find /hsdata/ljetty/ -name %s*'%(date))
#在遠程執行shell腳本,通過輸出流的方式輸出stdin,stdout,stderr,本例中通過find命令在指定目錄下找到以指定日期開頭的文件
loglist = o.readlines()
#[u'/var/log/jettyMYSQL/logs/2016_01_03.stderrout.log\n'] 
#將標準輸出的文件讀取,賦值給loglist,輸出的的每個內容其實是個unicode格式文本,之后使用的過程中需要轉換成utf8格式
client.close()
#關閉連接
t = paramiko.Transport((ip,22))
#創建一個對象實例化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
    #將之前找到的日志文件名進行處理,轉換unicode轉換至utf8格式,并去除尾部的\n字符.
    b = a.replace('/','')
    #varlogjettyMYSQLlogs2016_01_03.stderrout.log
    #將完全的路徑中的/刪除,得到的值作為將要保存在本地的文件名
    if os.path.exists('/tmp/'+ip):
    #判斷是否存在以遠程主機IP為名字的目錄,如果存在,則將文件下載到該目錄下,如果不存在,創建目錄后將文件下載到該目錄下.
        sftp.get(a,'/tmp/'+ip+'/'+b)
    else:
        os.makedirs('/tmp/'+ip)
        sftp.get(a,'/tmp/'+ip+'/'+b)
t.close()

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

原創文章,作者:海馬,如若轉載,請注明出處:http://www.www58058.com/11144

(8)
海馬海馬
上一篇 2016-01-15
下一篇 2016-01-16

相關推薦

  • python學習總結

    內建函數、函數、插入排序、樹

    2018-04-15
  • Centtos7搭建ftp服務

    Centtos7搭建ftp服務 下載安裝軟件包 yum -y install vsftpd ? 開啟啟用ftp服務 systemctl start vsftpd ???#設置立即啟用該服務 systemctl status vsftpd ??#查看該服務當前運行狀態 systemctl enable vsftpd ??#設置開機自動啟用該服務 systemc…

    Python筆記 2018-07-07
  • python基礎

      shell作業 1. 取出文件基名 ????法一:cat 1.txt | egrep -o “[^/]+$” ????法二:awk -F/ ‘{print $NF}’ 1.txt 2. 取ip地址 ????法一:ifconfig eth0 | grep “inet addr” | awk ‘{print $2}’ | cut -d: -f2 ?…

    2017-09-17
  • Python 部分知識點總結(四)

    此篇博客只是記錄第六周未掌握或不熟悉的知識點,用來加深印象。

    Python筆記 2018-04-14
  • Python 部分知識點總結(十)

    此篇博客只是記錄第十二周未掌握或不熟悉的知識點,用來加深印象。

    Python筆記 2018-05-28
  • Ipython封裝解構

    IPython Shell命令 !command 執行shell命令 !ls -l , !touch a.txt file = !ls -l | grep py 魔術方法 使用%開頭的,IPython內置的特殊方法 %magic 格式 %開頭是line magic %% 開頭是cell magic,notebook的cell %alias 定義一個系統命令的…

    2018-04-09

評論列表(1條)

  • leezqang
    leezqang 2016-02-03 14:13

    我按著你的腳本執行 ,中間遇到錯誤循環就會中斷,如果加了個錯誤拋出機制 問題就解決了
    for file in loglist:
    a = (file.encode(‘utf-8’)).replace(‘\n’,”)
    remotepath = ‘/tmp/test/’ + a
    print remotepath
    try:
    if os.path.exists(‘/tmp/test/’+ip):
    sftp.get(remotepath,’/tmp/test/’+ip+’/’+a)
    else:
    os.makedirs(‘/tmp/test/’+ip)
    sftp.get(remotepath,’/tmp/test/’+ip+’/’+a)
    except IOError:
    pass

欧美性久久久久