通過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 11:52
下一篇 2016-01-16 22:53

相關推薦

  • 使用pyenv管理不同版本的python

    安裝: 安裝: $ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash 在你的shellrc文件中添加: export PATH=”$HOME/.pyenv/bin:$PATH” eval “$(pyenv init …

    Linux干貨 2015-03-12
  • Python內置數據結構——字符串

    知識結構圖 學習筆記 字符串 字符組成的有序序列,字符的集合 使用單引號、雙引號、三引號引起來的字符序列 不可變對象 Unicode類型 定義 單引號、雙引號、三引號 r、R:引號內的字符原樣輸出 元素訪問 索引訪問 可迭代 join連接 “string“.join(iteratable) 使用string作為分隔符將可迭代對象連接起…

    2018-03-31
  • 正則表達式

    正則表達式

    Python筆記 2018-05-03
  • Python裝飾器各種類型總結

    寫了一篇裝飾器的總結,分析了不同類型的裝飾器的應用場景 http://blog.csdn.net/yhy1271927580/article/details/72758577

    Python干貨 2017-05-26
  • Python文件操作

    計算機體系架構 運算器:完成各種算術運算、邏輯運算、出具傳輸等數據加工處理 控制器:控制程序的執行 CPU = 運算器 + 控制器 存儲器:用于記憶程序的數據,內存 輸入設備:將數據或程序輸入到計算機中 輸出設備:將數據或程序的處理結果展示給用戶 文件IO常用操作 open 打開 read 讀取 write 寫入 close 關閉 readline 行讀取 …

    Python筆記 2018-05-02
  • python基礎語法之if,else,for,while,continue,break

    如果你了解語法的使用,內有習題可以稍作練習。

    2017-09-16

評論列表(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

欧美性久久久久