看CookBook就像看小说,挑感兴趣的先学习。
所以继《文本》之后,开始《系统管理》。
同样,请善用目录。
发现一个cookbook:好地址
生成随机密码
from random import choice
import string
def GenPasswd(length = 8,chars = string.letters+string.digits):
return ''.join([choice(chars) for i in range(length)])
for i in range(6):
print GenPasswd(12)
结果:
>>>
fnkdz5dPA3zu
TZF9HzndkrSb
fiGAfBU8y2rk
QRmtzTzNnxFR
RJp8Cv6CsEHV
9kPHiFUJ7uWz
>>>
拓展阅读:
Python中的random模块 - Capricorn.python - 博客园(random的常见操作,很清晰)
生成易记的伪随机密码
import random,string
class password(object):
def __init__(self,filename):
self.data = open(filename).read().lower()
def renew(self,n = 8,maxmem = 3):
chars = []
for i in range(n):
rmdIndex = random.randrange(len(self.data))
self.data = self.data[rmdIndex:]+self.data[:rmdIndex]
where = -1
locate = chars[-maxmem:]
while where < 0 and locate:
where = self.data.find(str(locate))
locate = locate[1:]
ch = self.data[where+len(locate)+1]
if not ch.islower():
ch = random.choice(string.lowercase)
chars.append(ch)
return ''.join(chars)
p = password("c:\\LICENSE.txt")
print p.renew(12)
(1)对于每一个随机字符,我们都按照以下流程处理一遍
(2)随机找到中间点,然后分成两段,翻转合并
(3)用最后的结果的倒数maxmem个字符来做locate标记
(4)每次找到这个locate处,若找不到,locate缩减为locate[1:],继续找,直到找到为止
(5)我们要的本次的随机字符就是找到的locate处的后一个字符self.data[where+len(locate)+1],如果locate为空,那么ch就是(2)后的第一个字符,也是随机的
拓展阅读:
以POP服务器的方式验证用户
import poplib
def checkPOP3User(host,user,password):
try:
pop = poplib.POP3(host)
except:
raise RuntimeError("Could not establish connection"
"to %r for password check" % host)
try:
pop.user(user)
pop.pass_(password)
count,size = pop.stat()
assert type(count) == type(size) == int
print count,size
pop.quit()
except:
raise RuntimeError("Could not verify identity. \n"
"User name %r or password incorrect." % user)
pop.quit()
checkPOP3User("pop.qq.com","411187674@qq.com","123456")
Ps:看了RuntimeError之后才发现,字符串可以s = "123""abc"这么写
思想:
(1)POP3.user(username)
Send user command, response should indicate that a password is required.
(2)POP3.pass_(password),请注意我不是pass,而是pass_
Send password, response includes message count and mailbox size. Note: the mailbox on the server is locked until quit() is called.
(3)POP3.stat()
Get mailbox status. The result is a tuple of 2 integers: (message count, mailbox size).
(4)记得用raise ,对了那个密码是我乱写的,别猜了,但是qq是对的
拓展阅读:
python中的异常处理-kouyanghao-ChinaUnix博客(异常的各种用法)
统计Apache中每个IP的点击率
import re
def calcuteApacheIpHits(logfile_pathname):
ip_specs = r'\.'.join([r'\d{1,3}']*4)
re_ip = re.compile(ip_specs)
ipHitListing = {}
contents = open(logfile_pathname,"r")
for line in contents:
match = re_ip.match(line)
if match :
ip = match.group()
#检查正确性
try:
quad = map(int,ip.split('.'))
except ValueError:
pass
else:
#如果ip存在就+1,不存在就设置为1
if len(quad) == 4 and min(quad) >= 0 and max(quad) <= 255:
ipHitListing[ip] = ipHitListing.get(ip,0) + 1
return ipHitListing
print calcuteApacheIpHits("log.txt")
思想:
统计Apache的客户缓存的命中率
def clientCachePercentage(logfile_pathname):
contents = open(logfile_pathname,"r")
totalRequests = 0
cachedRequests = 0
for line in contents:
totalRequests += 1
if line.split(" ")[8] == "304":
cachedRequests += 1
return int(0.5+float(100 * cachedRequests)/totalRequests)
print clientCachePercentage("1.txt")
思想:
在脚本中调用编辑器
import sys,os,tempfile
def what_editor():
editor = os.getenv('VISUAL') or os.getenv('EDITOR')
if not editor:
if sys.platform == 'windows':
editor = 'Notepad.Exe'
else:
editor = 'vi'
return editor
def edited_text(starting_text = ''):
temp_fd,temp_filename = tempfile.mkstemp(text = True)
os.write(temp_fd,starting_text)
os.close(temp_fd)
editor = what_editor()
x = os.spawnlp(os.P_WAIT,editor,editor,temp_filename)
if x:
raise RuntimeError, "Can't run %s %s (%s)" % (editor,temp_filename,x)
result = open(temp_filename).read()
os.unlink(temp_filename)
return result
if __name__ == '__main__':
text = edited_text('''aaaaaaaa
bbbbbbb
cccccccc''')
print 'Edited text is:',text
备份文件
import sys,os,shutil,filecmp
MAXVERSIONS = 100
def backup(tree_top,bakdir_name = 'bakdir'):
for root,subdirs,files in os.walk(tree_top):
#join链接出每个root下的子目录bakdir
backup_dir = os.path.join(root,bakdir_name)
#确保每个root下都有个子目录叫bakdir
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
#bakdir下的不递归处理
subdirs[:] = [d for d in subdirs if d != bakdir_name]
for file in files:
filepath = os.path.join(root,file)
destpath = os.path.join(backup_dir,file)
#检查版本,共有MAXVERSIONS个版本
for index in xrange(MAXVERSIONS):
backup = "%s.%2.2d" % (destpath,index)
if not os.path.exists(backup):
break
if index > 0:
old_backup = "%s.%2.2d" % (destpath,index-1)
#abspath = os.path.abspath(filepath)#filepath本来就是绝对路径
try:
#如果备份和源文件一致,continue不处理
if os.path.isfile(old_backup) and filecmp.cmp(filepath,old_backup,shallow = False):
continue
except OSError:
pass
try:
shutil.copy(filepath,backup)
except OSError:
pass
if __name__ == '__main__':
backup("c:\\test")
选择性地复制邮箱文件
通过邮箱创建一个邮件地址的白名单
阻塞重复邮件
检查你的Windows声音系统
import winsound
try:
winsound.PlaySound("*",winsound.SND_ALIAS)
except RuntimeError,e:
print 'Sound system has problems,',e
else:
print 'Sound system is OK'
在Windows中注册和反注册DLL
from ctypes import windll
dll = windll[r'C:\\WINDOWS\\system32\\alrsvc.dll']
result = dll.DllRegisterServer()
result = dll.DllUnregisterServer()
from ctypes import oledll
dll = oledll[r'C:\\WINDOWS\\system32\\alrsvc.dll']
result = dll.DllRegisterServer()
result = dll.DllUnregisterServer()
Ps:暂时没用到。先记录下来。
检查并修改Windows自动运行任务
# -*- coding: cp936 -*-
import _winreg as wr
def how_many_tasks_at_logon():
areg = wr.ConnectRegistry(None,wr.HKEY_LOCAL_MACHINE)
akey = wr.OpenKey(areg,r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run')
try:
for i in xrange(1024):
try:
name,value,int_type = wr.EnumValue(akey,i)
print i,name,value,int_type
except EnvironmentError:
print "You have",i,"tasks strating at logon"
break
finally:
wr.CloseKey(akey)
def wirte_to_registry(root_key,arg,value_name,value):
areg = wr.ConnectRegistry(None,root_key)
akey = wr.OpenKey(areg,arg,0,wr.KEY_WRITE)
try:
try:
wr.SetValueEx(akey,value_name,0,wr.REG_SZ,value)
except EnvironmentError:
print "Encountered problems writing into the Registry"
raise
finally:
wr.CloseKey(akey)
def delete_from_registry(root_key,arg,value_name):
areg = wr.ConnectRegistry(None,root_key)
akey = wr.OpenKey(areg,arg,0,wr.KEY_WRITE)
try:
try:
wr.DeleteValue(akey,value_name)
except EnvironmentError:
print "Encountered problems deleting key from Registry"
raise
finally:
wr.CloseKey(akey)
root_key = wr.HKEY_LOCAL_MACHINE
arg = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
value_name = "myOwnKey"
value = r"C:\Program Files\多玩英雄联盟盒子\LOLBox.exe"
print "=================reading=============== "
how_many_tasks_at_logon()
print "=================writing=============== "
wirte_to_registry(root_key,arg,value_name,value)
print "=================reading=============== "
how_many_tasks_at_logon()
print "=================deleting============== "
delete_from_registry(root_key,arg,value_name)
print "=================reading=============== "
how_many_tasks_at_logon()
结果:
Ps:一开始编程把EnumValue写成EnumKey,一直报错,囧。还有把DeleteValue写成DeleteKey,囧。
在Windows中创建共享
import win32net
import win32netcon
import os
print('>>>正在运行共享文件夹设置程序...')
shinfo = {}
folder = "c:\\test"
shinfo['netname'] = os.path.basename(folder)
shinfo['type'] = win32netcon.STYPE_DISKTREE
shinfo['remark'] = 'data files'
shinfo['premissions'] = 0
shinfo['max_uses'] = -1
shinfo['current_uses'] = 0
shinfo['path'] = 'c:\\test'
shinfo['passwd'] = ''
server = r'\\.'
win32net.NetShareAdd(server,2,shinfo)
思想:
链接一个正在运行的Internet Explorer实例
from win32com.client import Dispatch
from win32gui import GetClassName
ShellWindowsCLSID = '{9BA05972-F6A8-11CF-A442-00A0C90A8F39}'
ShellWindows = Dispatch(ShellWindowsCLSID)
for shellwindow in ShellWindows:
#筛选,Windows Explorer和Internet Explorer 是一样的,一个本地,一个网络
#这里要IE
if GetClassName(shellwindow.HWND) == 'IEFrame':
print shellwindow,shellwindow.LocationName,shellwindow.LocationURL
结果: