通过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.178linux.com/11144

(8)
海马海马
上一篇 2016-01-15 11:52
下一篇 2016-01-16 22:53

相关推荐

  • python基础总结

    编程基础 一组能让计算机识别和执行的指令   电子计算机 能够执行程序的机器   现代计算机 英国数学家、逻辑学家,艾伦.麦席森.图灵被称为计算机科学之父,人工智能之父。图灵提出的著名的图灵模型为现代计算机的逻辑工作方式奠定了基础   图灵机,又称图灵计算机、图灵计算机,由图灵提出的一种抽象计算机模型,即将人们使用纸笔进行数学运…

    2017-09-17
  • 封装与解构 集合

    封装和解构 封装:将多个值进行分割,结合在一起,本质上返回元组,只是省掉了小括号 ‘==‘意思为内容一致,‘=’意思为内存空间一致 解构:把线性结构的元素解开,并顺序的赋值给其他变量,左边接纳的变量数要和左边解开的元素数量一致 集合不是非线性 解构中使用*变量名接收,但不能单独使用,被*变量名收集后组成一个列表 第一个下划线为9,结果被第二个下划线重新赋值为…

    Python笔记 2018-04-01
  • Python函数式编程指南(四):生成器

    生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。 这是函数式编程指南的最后一篇,似乎拖了一个星期才写好,嗯…… 转载请注明原作者和原文地址:) 4. 生成器(generator) 4.1. 生成器简介 首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代…

    Linux干货 2015-03-11
  • Python 部分知识点总结(五)

    此篇博客只是记录第七周未掌握或不熟悉的知识点,用来加深印象。

    Python笔记 2018-04-25
  • python基础语法之if,else,for,while,continue,break

    如果你了解语法的使用,内有习题可以稍作练习。

    2017-09-16
  • 正则表达式

    正则表达式 分类 BRE:基本正则表达式,grep,sed,vi等软件支持,vim有扩展 ERE:扩展正则表达式,egrep,grep -E ,sed  r等 PCRE:几乎所有的高级语言都是PCRE的方言或则变种, 基本语法 元字符metacharater .  匹配除换行符外任意一个字符 [abc]字符集合,只能表示一个字符的位置,匹配所包含的任意一个字…

    Python笔记 2018-05-07

评论列表(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