20170220--python--log+ssh

syslog --只能用在linux系统下

094553_6na2_2918364.png

自定义logging

101101_6X1D_2918364.png

md5值的生成

101551_fLha_2918364.png

mylog.py --用logging写一个日志备份脚本

  1 #!/usr/bin/env python
  2 # coding: utf8
  3 #
  4 # /etc/hosts  /tmp/hosts-20170220
  5 #
  6 
  7 import shutil
  8 import time
  9 import logging
 10 import hashlib
 11 
 12 logging.basicConfig(filename="/tmp/myapp.log", format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO)  //定义日志输出到屏幕的级别为INFO
 13 
 14 nowdate = time.strftime("%Y%m%d")
 15 
 16 logging.info("backup begin...")   //默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。
 17 shutil.copy2("/etc/hosts", "/tmp/hosts-%s" % nowdate)
 18 logging.info("backup end!")
 19 
 20 mymd5 = hashlib.md5()
 21 with open("/etc/hosts") as f:
 22     mymd5.update(f.read())
 23     oldmd5 = mymd5.hexdigest()
 24 
 25 mymd5 = hashlib.md5()
 26 with open("/tmp/hosts-%s" % nowdate) as f:
 27     mymd5.update(f.read())
 28     newmd5 = mymd5.hexdigest()
 29 
 30 if oldmd5 == newmd5:
 31     logging.info("backup OK")
 32 else:
 33     logging.error("backup KO")

######################################################


logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
 %(levelno)s: 打印日志级别的数值
 %(levelname)s: 打印日志级别名称
 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 %(filename)s: 打印当前执行程序名
 %(funcName)s: 打印日志的当前函数
 %(lineno)d: 打印日志的当前行号
 %(asctime)s: 打印日志的时间
 %(thread)d: 打印线程ID
 %(threadName)s: 打印线程名称
 %(process)d: 打印进程ID
 %(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略


二、捕获异常(ctrl+c)

sigal 模块 用signal.SIGINT捕获信号,用signal.SIG_IGN忽略捕获到的信号

134446_sKsD_2918364.png

三、paramiko--python 中最常用的连接ssh的模块

第8行的作用是相当于我们初次连接用户的时候需要回答yes/no 第8行的意思就是帮我们默认回答为yes

111713_eWoM_2918364.png

112007_0xzD_2918364.png

 

用我们的私钥进行连接

113309_OmiA_2918364.png

 

#!/usr/bin/env python
  2 # coding: utf8
  3 #
  4 
  5 import os
  6 import yaml
  7 import paramiko
  8 
  9 from multiprocessing.dummy import Pool
 10 #from multiprocessing import Pool
 11 
 12 with open("hosts.yaml") as f:
 13     config = yaml.safe_load(f)
 14 
 15 hosts = config.items()
 16 
 17 
 18 def runcmd(info):
 19     #print host[0], ": ", host[1].get("host")
 20     hostname = info[0]
 21     hostinfo = info[1]
 22 
 23     if hostinfo.get("pkey"):
 24         keyfile = os.path.expanduser(hostinfo.get("pkey"))
 25     else:
 26         keyfile = None
 27 
 28     client = paramiko.SSHClient()
 29     client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 30 
 31     try:
 32         client.connect(hostinfo.get("host"), hostinfo.get("port", 2200), hostinfo.get("user", "root"), str(hostinfo.get("    pass", "")), key_filename=keyfile, timeout=5)
 33     except:
 34         print hostname + ": Connect Fail!"
 35     else:
 36         _, stdout, stderr = client.exec_command("free -m")
 37         print hostname + ":"
 38         print stdout.read()
 39     finally:
 40         client.close()
 41 
 42 #map(runcmd, hosts)
 43 pool = Pool()
 44 pool.map(runcmd, hosts)
 45 pool.close()
 46 pool.join()

 

hosts.yaml

 up17:
  2     host: 192.168.30.17
  3     user: root
  4     pass: xy9860
  5     port: 22
  6     pkey: ~/.ssh/id_rsa.bak2
  7 
  8 localhost:
  9     host: localhost
 10     user: tom
 11     pass: uplooking
 12     port: 2200
 13 
 14 up153:
 15     host: 192.168.30.153
 16     user: root
 17     pass: 123456
 18     port: 22
 19 
 20 up20:
 21   host: 192.168.30.17
 22   port: 22
 23   user: root
                                                              1,1           Top

 

 

四、配置文件,可以使用python的模块机制,直接将配置文件import使用

如果我们用yaml格式保存配置文件。

140924_MQOi_2918364.png

141317_AJCO_2918364.png

 

将修改的内容写入到配置文件中

144456_nEpB_2918364.png

 

yaml的一般格式为

152505_oAA1_2918364.png

五、

threading 多线程

multiprocessing 多进程

multiprocessing.dummy 多线程

IO 密集型--- 多线程

CPU 密集型---多进程 core

162036_ypZR_2918364.png

产生100个线程提供服务

 

162823_Rjm1_2918364.png

加入正则表达式的多线程

1 #!/usr/bin/env python
  2 # coding: utf8
  3 #
  4 
  5 import re
  6 import os
  7 import sys
  8 import yaml
  9 import paramiko
 10 
 11 from multiprocessing.dummy import Pool,Lock
 12 #from multiprocessing import Pool
 13 
 14 from optparse import OptionParser
 15 
 16 op = OptionParser()
 17 op.add_option("-r", dest="regex", help="regex pattern", metavar="REGEX", def    ault=r'.*')
 18 op.add_option("-e", dest="cmd", help="run cmd", metavar="CMD", default="date    ")
 19 
 20 options, _ = op.parse_args()
 21 
  22 myre = re.compile(options.regex)
 23 
 24 with open("hosts.yaml") as f:
 25     config = yaml.safe_load(f)
 26 
 27 hosts = config.items()
 28 
 29 lock = Lock()
 30 
 31 def runcmd(info):
 32     global lock
 33     #print host[0], ": ", host[1].get("host")
 34     hostname = info[0]
 35     hostinfo = info[1]
 36 
 37     if hostinfo.get("pkey"):
 38         keyfile = os.path.expanduser(hostinfo.get("pkey"))
 39     else:
 40         keyfile = None
 41 
 42     client = paramiko.SSHClient()
 43     client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 44 
 45     try:
 46         client.connect(hostinfo.get("host"), hostinfo.get("port", 2200), hos    tinfo.get("user", "root"), str(hostinfo.get("pass", "")), key_filename=keyfi    le, timeout=5)
 47     except:
 48         lock.acquire()
 49         print hostname + ": Connect Fail!"
 50         lock.release()
 51     else:
 52         _, stdout, stderr = client.exec_command(options.cmd)
 53         lock.acquire()
 54         print hostname + ":\n", stdout.read()
 55         lock.release()
 56     finally:
 57         client.close()
 58 
 59 #[("up10", {host: port ..),(),()]
 60 #match_hosts = []
 61 #for h in hosts:
 62 #    if myre.search(h[0]):
 63 #        match_hosts.append(h)
 64 
 65 match_hosts = [h for h in hosts if myre.search(h[0])]
 66 #match_hosts = filter(lambda h: myre.search(h[0]), hosts)
 67 
 68 #map(runcmd, hosts)
 69 pool = Pool()
 70 pool.map(runcmd, match_hosts)
 71 pool.close()
 72 pool.join()


 

Python 与数据库的连接

101643_t4iv_2918364.png

python与数据库的连接,必须定义相应的方法

102607_3FSA_2918364.png

 

转载于:https://my.oschina.net/liubaizi/blog/842351

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值