09/28/14

【python】paramiko和pexpect运维批量脚本

batch_ssh功能介绍:

### 执行批量命令 调用方式
batch_iplist(“iplist.txt”,’who’,”root”,”/root/.ssh/id_rsa”,60,”command.txt”,True)
### 执行单个命令 调用方式
batch_iplist(“iplist.txt”,’who’,”root”,”/root/.ssh/id_rsa”,60,”command.txt”,False)
### iptable 功能模块
1、通过读取iptable_iplist_file.txt文件中ip列表,批量封禁IP
python2.6 batch_ssh.py -I –iptable_config_ini=iptable_config.ini –sub_domain=www.phpdba.com –iptable_iplist_file=iptable_iplist_file.txt
2、直接通过-s将要封禁IP,传入脚本
python2.6 batch_ssh.py -I –iptable_config_ini=iptable_config.ini –sub_domain=www.phpdba.com -s 123.123.123.123
3、同时封禁iptable_iplist_file.txt和-s指定IP
python2.6 batch_ssh.py -I –iptable_config_ini=iptable_config.ini –sub_domain=www.phpdba.com -s 123.123.123.123 –iptable_iplist_file=iptable_iplist_file.txt

### 批量执行命令模块
1、以dev 权限登录iplist.txt中ip,同时批量执行command.txt中定义系列命令及command定义命令
python2.6 batch_ssh.py -B –batch_iplist_file=iplist.txt –batch_commandlist_file=command.txt –command=”ps aux|grep python” –batch_user=dev –batch_auth_key=dev_id_rsa
2、以dev 权限登录iplist.txt中ip,执行command.txt中系列命令
python2.6 batch_ssh.py -B –batch_iplist_file=iplist.txt –batch_commandlist_file=command.txt –batch_user=dev –batch_auth_key=dev_id_rsa
3、以dev权限登录iplist.txt中ip,只执行command定义命令
python2.6 batch_ssh.py -B –batch_iplist_file=iplist.txt –command=”ps aux|grep python” –batch_user=dev –batch_auth_key=dev_id_rsa
4、以root权限登录iplist.txt中ip,批量执行command.txt文件中定义的系列命令
python2.6 batch_ssh.py -B –batch_iplist_file=iplist.txt –batch_commandlist_file=command.txt
5、以root权限登录iplist.txt中ip,执行command定义的命令
python2.6 batch_ssh.py -B –batch_iplist_file=iplist.txt –command=”ps aux|grep python”
6、以root权限登录iplist.txt中ip,同时批量执行command.txt中定义系列命令及command定义命令
python2.6 batch_ssh.py -B –batch_iplist_file=iplist.txt –batch_commandlist_file=command.txt –command=”ps aux|grep python”
### 批量获取mysql信息
1、以root权限登录iplist.txt中ip,批量执行command.txt文件中定义的系列命令
python2.6 batch_ssh.py -M –batch_iplist_file=iplist.txt –batch_commandlist_file=command.txt

源码:https://github.com/chen-123/phper/blob/master/运维工具/python/batch_ssh.py

08/6/14

【python】smtplib修改

描述:

1、qmail搭建了一套邮件系统,python通过smtp发送邮件,遇到发送失败。

2、排查发现smtplib.py 中authmethod 优先匹配了AUTH_CRAM_MD5

源代码:

# Authentication methods the server supports:
authlist = self.esmtp_features["auth"].split()

# List of authentication methods we support: from preferred to
# less preferred methods. Except for the purpose of testing the weaker
# ones, we prefer stronger methods like CRAM-MD5:
preferred_auths = [AUTH_CRAM_MD5, AUTH_PLAIN,AUTH_LOGIN,]

# Determine the authentication method we’ll use
authmethod = None
for method in preferred_auths:
if method in authlist:
authmethod = method
break

 

修改之后:

        # Authentication methods the server supports:
        authlist = self.esmtp_features["auth"].split()

        # List of authentication methods we support: from preferred to
        # less preferred methods. Except for the purpose of testing the weaker
        # ones, we prefer stronger methods like CRAM-MD5:
        preferred_auths = [AUTH_LOGIN, AUTH_CRAM_MD5, AUTH_PLAIN]

        # Determine the authentication method we'll use
        authmethod = None
        for method in preferred_auths:
            if method in authlist:
                authmethod = method
                break

 

修改之后邮件正常发送。

01/3/14

mysql mtop 监控系统

2014年,第一篇博文,记录下记录搭建的mysqlmtop系统。

1.实时 MySQL 可用性监视
数据库可用性监视和衡量让开发者和DBA们了解它们是否符合所承诺的服务水平。

2.实时 MySQL 状态监视和警报
MySQL MTOP 持续监视 MySQL 的基本状态和性能信息,包括数据库连接状态,启动时间,数据库版本,总连接数,活动进程,QPS,TPS,
进出MySQL数据库的流量信息。在数据库状态异常或偏离正常基准水平时发出报警邮件通知。

3.实时 MySQL复制监视
MySQL MTOP自动发现您的 MySQL 复制拓扑结构,自动监视数据库的延时和binlog信息,让您可以了解所有 MySQL 主服务器和从服务器的性能、可用性和运行状况。并在问题(如从服务器延迟)导致停机前向管理员提供改正建议。

4.远程监视云中的 MySQL
适合于云和虚拟机的设计,使您能远程监视您的MySQL服务器不需要任何远程代理器。

5.直观管理所有 MySQL 服务器
MySQL MTOP提供一个基于 Web 的界面,可令您全面深入地了解数据库性能、可用性、关键活动等;直观地查看一台服务器、自定义的应用组或所有服务器。一组丰富的实时图形和历史图形将帮助您深入了解详细的服务器统计信息。

6.可视化MySQL慢查询分析
监视实时查询性能,查看执行统计信息,筛选和定位导致性能下降的 SQL 代码。结合使用 Information Schema 可直接从 MySQL 服务器收集数据,无需额外的软件或配置。

7.性能监视
监视影响 MySQL 性能的主要指标。如查询缓存命中率,Key_buffer_read_hits,Key_buffer_write_hits,Thread_cache_hits,Key_blocks_used_rate,Created_tmp_disk_tables_rate等信息,根据相关性能指标可以对服务器核心参数进行调整优化。

mtop

12/27/13

python 参数类型

1)必须的参数
2)可选的参数
3)过量的位置参数
4)过量的关键字参数

def complex_function(a, b=None, *c, **d):

1、*args和**kwargs只接受那些没有放进来的其他任何参数。
2、没有这个次序,当你调用一个带有位置参数的函数,python就不知道哪个值是已声明参数想要的,也不知道哪个被作为过量参数对待。
3、函数能接受许多必须的参数和可选的参数,那它只要定义一个过量的参数类型即可。
4、传递一个元组作为过量的位置参数时,是否要显式的传递关键字参数。因为python使用次序规则来扩展过量的参数,那位置参数要放在前面。

>>> def add(a, b, c):
… return a + b + c

>>> add(1, 2, 3)
6
>>> add(a=4, b=5, c=6)
15
>>> args = (2, 3)
>>> add(1, *args)
6
>>> kwargs={‘b’: 8, ‘c’: 9}
>>> add(a=7, **kwargs)
24
>>> add(a=7, *args)
Traceback (most recent call last):
File ““, line 1, in
TypeError: add() got multiple values for keyword argument ‘a’
>>> add(1, 2, a=7)
Traceback (most recent call last):
File ““, line 1, in
TypeError: add() got multiple values for keyword argument ‘a’

10/20/13

python 抓取搜房网成交数据

#!/usr/bin/python
#-*- coding:utf-8 -*-
import time
import urllib2
import StringIO
import gzip
import string
import sys,os
import chardet
from bs4 import BeautifulSoup
import re

reload(sys)
sys.setdefaultencoding('utf-8')

def getlist(html):
soup = BeautifulSoup(html,from_encoding="utf-8")
divs = soup.find_all('div',{'class':'searchListNoraml'})
for div_html in divs:
company_li=div_html.findAll("li",{'class':'s2'})
price_div=div_html.findAll("div",{'class':'price'})
img_tmp=div_html.findAll("img",width='122')
name_div=div_html.findAll("div",{'class':'name'})
type_div=div_html.findAll("div",{'class':'dot6'})
if (company_li):
print "===============分割线========================"
print "["+img_tmp[0].get("alt")+"]-----["+img_tmp[0].get("src")+"]\
 ----["+price_div[0].get_text().strip()+"]"\
 +type_div[0].get_text().strip()
print "[http://newhouse.jiujiang.soufun.com"\
    +company_li[0].a.get('href')+"]----\
    ["+company_li[1].font.string+']'
print "["+name_div[0].a.string+"]的网址:"+name_div[0].a.get('href')

def getHtml(url):
headers={'User-Agent':'Opera/8.0 (Macintosh; PPC Mac OS X; U; en)'}
opener = urllib2.build_opener()
request = urllib2.Request(url,headers=headers)
request.add_header('Accept-encodeing','gzip')
page = opener.open(request)
predata = page.read()
pdata = StringIO.StringIO(predata)
gzipper = gzip.GzipFile(fileobj = pdata)
try:
data = gzipper.read()
except(IOError):
print 'unused gzip'
data = predata

mychar=chardet.detect(data)
bianma = mychar['encoding']
if bianma == 'utf-8' or bianma == 'UTF-8':
html = data
else :
html = data.decode('gb2312','ignore').encode('utf-8')
return html

def getSouFun_NewHouseList():
for i in range(1,19,1):
url_tmp="http://newhouse.jiujiang.soufun.com/house/%BE%C5%BD%AD\
     _________________"+str(i)+"__.htm"
#print url_tmp
tags_html=getHtml(url_tmp)
time.sleep(2)
getlist(tags_html)
def getSouFun_everydayTrace():
print '<html xmlns=\"http://www.w3.org/1999/xhtml\">'
print '<head>'
print '<meta http-equiv=\"Content-Type\"\
   content=\"text/html; charset=utf-8\" />'
print '<title>九江城区--成交情况统计</title>'
print '<body>'
for i in range(1,2):
list_url="http://newhouse.jiujiang.soufun.com/house/web/\
     newhouse_news_more.php?type=12193&page="+str(i)
list_html=getHtml(list_url)

soup = BeautifulSoup(list_html,from_encoding="utf-8")
divs = soup.find_all('div',{'class':'lnews'})

#print divs
for div_html in divs:
#print div_html
li_tracelist=div_html.findAll("li",{'class':''})
for lit in li_tracelist:
print "<p>[<a href='http://newhouse.jiujiang.soufun.com"\
  +lit.a.get('href').replace('.','_all.')+"' >"\
  +lit.a.string+"平方米</a>]\
  的链接:http://newhouse.jiujiang.soufun.com"\
  +lit.a.get('href').replace('.','_all.')+"</p>"
print "<br/>"
getSouFun_trace_Data("http://newhouse.xxxx.soufun.com"\
  +lit.a.get('href').replace('.','_all.'))
time.sleep(2)
print "</body></html>"

def getSouFun_trace_Data(url):
data_html = getHtml(url)
soup = BeautifulSoup(data_html,from_encoding="utf-8")

#print soup
divs = soup.find_all('div',{'name':'news_content'})
if (not divs):
divs = soup.find_all('div',{'id':'news_body'})
for div_html in divs:
table_list=div_html.findAll('table',{'class':''})
if(table_list):
for table_html in table_list:
print table_html
print "<br/>"
print "<br/>"
img_list=div_html.findAll('img')
#img_list=div_html.findAll(name='img',attrs=\
 {'src',re.compile(r"(.*)news(.*).jpg")})
if(img_list):
for img_html in img_list:
print img_html
print "<br/>"
print "<br/>"
10/20/13

Python中过滤HTML标签

1、strip_tags.py
#用了HTMLParser,有更简单的方式吗?正则?
def strip_tags(html):
    """
    Python中过滤HTML标签的函数
    >>> str_text=strip_tags("<font color=red>chen-123</font>")
    >>> print str_text
    chen-13
    """
    from HTMLParser import HTMLParser
    html = html.strip()
    html = html.strip("\n")
    result = []
    parser = HTMLParser()
    parser.handle_data = result.append
    parser.feed(html)
    parser.close()
    return ''.join(result)

2、filter_tags.py

#更深层次的过滤,类似instapaper或者readitlater这种服务,很有意思的研究课题
# -*- coding: utf-8-*-
import re
##过滤HTML中的标签
#将HTML中标签等信息去掉
#@param htmlstr HTML字符串.
def filter_tags(htmlstr):
    #先过滤CDATA
    re_cdata=re.compile('//<!\[CDATA\[[^>]*//\]\]>',re.I) #匹配CDATA
    re_script=re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I)#Script
    re_style=re.compile('<\s*style[^>]*>[^<]*<\s*/\s*style\s*>',re.I)#style
    re_br=re.compile('<br\s*?/?>')#处理换行
    re_h=re.compile('</?\w+[^>]*>')#HTML标签
    re_comment=re.compile('<!--[^>]*-->')#HTML注释
    s=re_cdata.sub('',htmlstr)#去掉CDATA
    s=re_script.sub('',s) #去掉SCRIPT
    s=re_style.sub('',s)#去掉style
    s=re_br.sub('\n',s)#将br转换为换行
    s=re_h.sub('',s) #去掉HTML 标签
    s=re_comment.sub('',s)#去掉HTML注释
    #去掉多余的空行
    blank_line=re.compile('\n+')
    s=blank_line.sub('\n',s)
    s=replaceCharEntity(s)#替换实体
    return s

##替换常用HTML字符实体.
#使用正常的字符替换HTML中特殊的字符实体.
#你可以添加新的实体字符到CHAR_ENTITIES中,处理更多HTML字符实体.
#@param htmlstr HTML字符串.
def replaceCharEntity(htmlstr):
    CHAR_ENTITIES={'nbsp':' ','160':' ',
                'lt':'<','60':'<',
                'gt':'>','62':'>',
                'amp':'&','38':'&',
                'quot':'"','34':'"',}

    re_charEntity=re.compile(r'&#?(?P<name>\w+);')
    sz=re_charEntity.search(htmlstr)
    while sz:
        entity=sz.group()#entity全称,如&gt;
        key=sz.group('name')#去除&;后entity,如&gt;为gt
        try:
            htmlstr=re_charEntity.sub(CHAR_ENTITIES[key],htmlstr,1)
            sz=re_charEntity.search(htmlstr)
        except KeyError:
            #以空串代替
            htmlstr=re_charEntity.sub('',htmlstr,1)
            sz=re_charEntity.search(htmlstr)
    return htmlstr

def repalce(s,re_exp,repl_string):
    return re_exp.sub(repl_string,s)

if __name__=='__main__':
    s=file('chen-123.html').read()
    news=filter_tags(s)
    print news

3、re.py

#用正则简单过滤html的<>标签
     import re
     str = "<img /><a>srcd</a>chen-123</br><br/>"
     str = re.sub(r'</?\w+[^>]*>','',str)
     print str