python写的系统常用命令,linux和windows通用,用的时候直接from util import *导入即可使用,很方便

  1. #!/usr/bin/python  
  2. # -*- coding: utf-8 -*-  
  3. # 通用功能类封装  
  4. import os,time,sys,string,urllib,httplib,shutil,platform,tarfile  
  5. from commands import getstatusoutput as getso  
  6. from ConfigParser import *  
  7.  
  8. def hostname(host_name):  
  9.     '''''  
  10.     linux适用  
  11.        
  12.     hostname封装,修改主机名。  
  13.     ''' 
  14.     str_cmd = "/bin/sed -i 's/HOSTNAME/#&/;$a HOSTNAME=%s' /etc/sysconfig/network;/bin/hostname %s" % (host_name,host_name)  
  15.     status, result = getso(str_cmd)  
  16.     wr_log(str_cmd, status, result)  
  17.    
  18. def md5sum(file_name):  
  19.     '''''  
  20.     md5sum封装,获取文件的md5值  
  21.     ''' 
  22.     if os.path.isfile(file_name):  
  23.         f = open(file_name,'rb')  
  24.         py_ver = sys.version[:3]  
  25.         if py_ver == "2.4":  
  26.             import md5 as hashlib  
  27.         else:  
  28.             import hashlib  
  29.             md5 = hashlib.md5(f.read()).hexdigest()  
  30.             f.close()  
  31.             return md5  
  32.     else:  
  33.         return 0 
  34.    
  35. def md5(file_name):  
  36.     '''''  
  37.     linux适用  
  38.    
  39.     md5sum -c 封装,校验md5文件,返回校验成功或失败状态  
  40.     ''' 
  41.     str_cmd="/usr/bin/md5sum -c %s" % file_name  
  42.     status,result=getso(str_cmd)  
  43.     return status  
  44.    
  45. def grep(s_str, file_name):  
  46.     '''''  
  47.     grep封装,查找文件中关键字,有则返回所在行,否则返回空字符串。  
  48.     ''' 
  49.     try:  
  50.         fd = open(file_name)  
  51.         content = fd.read()  
  52.         result = ""  
  53.         if content.find(s_str) != -1:  
  54.             for line in content.split("\n"):  
  55.                 if line.find(s_str) != -1:  
  56.                     result = result + line + "\n" 
  57.         return result.strip()  
  58.     except Exception, e:  
  59.         wr_log("grep %s %s" % (s_str, file_nsme), 1, e)  
  60.    
  61. def rwconf(type, file_name, section, option, s_str=""):  
  62.     '''''  
  63.     读取标准的ini格式配置文件,type可为以下值:  
  64.     get     获取section下的option的值,值为字符串;  
  65.     getint  获取section下的option的值,值为数字;  
  66.     modi    修改section下的option的值,并保存;  
  67.     del     删除section下的option,并保存。  
  68.    
  69.     注:option严格区分大小写  
  70.     ''' 
  71.     try:  
  72.         if type == "get" or type == "getint":  
  73.             cf = ConfigParser()  
  74.         else:  
  75.             cf = ConfParser()  
  76.         cf.read(file_name)  
  77.         if type == "get":  
  78.             return cf.get(section, option)  
  79.         elif type == "getint":  
  80.             return cf.getint(section, option)  
  81.         elif type == "modi":  
  82.             try:  
  83.                 cf.set(section, option, s_str)  
  84.                 cf.write(open(file_name, "w"))  
  85.                 wr_log("modify %s for %s" % (option, file_name))  
  86.             except Exception, e:  
  87.                 wr_log("modify %s for %s" % (option, file_name), 1, str(e))  
  88.         elif type == "del":  
  89.             try:  
  90.                 cf.remove_option(section, option)  
  91.                 cf.write(open(file_name, "w"))  
  92.                 wr_log("del %s for %s" % (option, file_name))  
  93.             except Exception, e:  
  94.                 wr_log("del %s for %s" % (option, file_name), 1, str(e))  
  95.     except Exception, e:  
  96.         wr_log("read %s for %s" % (option, file_name), 1, str(e))  
  97.    
  98. def chkconfig(type, svr_name, switch=""):  
  99.     '''''  
  100.     linux适用  
  101.        
  102.     chkconfig封装,根据传入的type参数执行相应操作,type可以为以下几种:  
  103.     add  添加服务至启动项;  
  104.     del  从启动项删除服务;  
  105.     数字  指定运行级别的服务开启或关闭。  
  106.        
  107.     type及svr_name为必需的参数。  
  108.        
  109.     例子:  
  110.     开启运行级别3的sshd服务:chkconfig("3", "sshd", "on")  
  111.     ''' 
  112.     if type != "add" and type != "del":  
  113.         type = "--level %s" % str(type)  
  114.     str_cmd = "/sbin/chkconfig %s %s %s" % (type, svr_name, switch)  
  115.     status, result = getso(str_cmd)  
  116.     wr_log(str_cmd, status, result)  
  117.    
  118. def passwd(user_name,newpass):  
  119.     '''''  
  120.     passwd封装,修改用户密码  
  121.     ''' 
  122.     os_type = platform.system()  
  123.     if os_type == "Linux":  
  124.         str_cmd = "echo '%s' | passwd %s --stdin" % (newpass, user_name)  
  125.         status, result = getso(str_cmd)  
  126.         wr_log(str_cmd, status, result)  
  127.     elif os_type == "Windows":  
  128.         try:  
  129.             if os.system('net user %s "%s" ' %(user_name,newpass)) == 0:  
  130.                 wr_log("modify passwd for %s  " % user_name)  
  131.             elif os.system('net user %s "%s" ' %(user_name,newpass)) == 2:  
  132.                 raise Exception, "user %s isnot exists" % user_name  
  133.         except Exception,e:  
  134.             wr_log("modify passwd for %s " % user_name, 1, e)  
  135.    
  136. def echo(str, file_name):  
  137.     '''''  
  138.     linux适用  
  139.    
  140.     echo封装,添加字符串到文件尾部  
  141.     ''' 
  142.     str_cmd = "/bin/echo '%s' >> %s" % (str, file_name)  
  143.     status, result = getso(str_cmd)  
  144.     wr_log(str_cmd, status, result)  
  145.    
  146. def upload(localfiles, remotepath, host="xxx", username="xxx", password="xxxx"):  
  147.     '''''  
  148.     上传文件至ftp服务器,默认上传至208FTP,如要上传至其它FTP服务器,请指定host/user/pass  
  149.    
  150.     例:  
  151.     upload("a.txt,b.txt", "/test/")  
  152.     上传a.txt、b.txt文件到208的test目录下  
  153.     ''' 
  154.     import base64  
  155.     from ftplib import FTP  
  156.     try:  
  157.         localfiles = localfiles.split(",")  
  158.         f =FTP(host)  
  159.         f.login(username,password)  
  160.         f.cwd(remotepath)  
  161.         for localfile in localfiles:  
  162.             fd = open(localfile,'rb')  
  163.             f.storbinary('STOR %s' % os.path.basename(localfile),fd)  
  164.             fd.close()  
  165.         f.quit()  
  166.         wr_log("upload %s" % localfiles)  
  167.     except Exception, e:  
  168.         wr_log("upload %s" % localfiles, 1, e)  
  169.    
  170. class ConfParser(RawConfigParser):  
  171.     '''''  
  172.     ConfigParser模块有一个缺陷,改写ini文件的某个section的某个option,写入ini文件后  
  173.     ini文件的注释都丢掉了,并且option的大写字母都转换成了小写  
  174.     为了保存ini文件的注释以及option的大小写,重写了write、set、optionxform等方法,由rwconf函数调用  
  175.     ''' 
  176.     def write(self, fp):  
  177.         """Write an .ini-format representation of the configuration state.  
  178.    
  179.         write ini by line no  
  180.         """ 
  181.            
  182.         if self._defaults:  
  183.             section = DEFAULTSECT  
  184.             lineno = self._location[section]  
  185.             self._data[lineno] = "[%s]\n" %section  
  186.             for (key, value) in self._defaults.items():  
  187.                 if key != "__name__":  
  188.                     wholename = section + '_' + key  #KVS  
  189.                     lineno = self._location[wholename]  
  190.                     self._data[lineno] = "%s = %s\n" %(key, str(value).replace('\n''\n\t'))  
  191.                        
  192.         for section in self._sections:  
  193.             lineno = self._location[section]  
  194.             self._data[lineno] = "[%s]\n" % section  
  195.             for (key, value) in self._sections[section].items():  
  196.                 if key != "__name__":  
  197.                     wholename = section + '_' + key  #KVS  
  198.                     lineno = self._location[wholename]  
  199.                     self._data[lineno] = "%s = %s\n" %(key, str(value).replace('\n''\n\t'))  
  200.                
  201.         for line in self._data:  
  202.             fp.write("%s"%line)  
  203.         fp.close()  
  204.                
  205.     def _read(self, fp, fpname):  
  206.         """Parse a sectioned setup file.  
  207.    
  208.         When parsing ini file, store the line no in self._location  
  209.         and store all lines in self._data  
  210.         """ 
  211.         self._location = {}  
  212.         self._data = []  
  213.         cursect = None      # None, or a dictionary  
  214.         optname = None 
  215.         lineno = 0 
  216.         e = None            # None, or an exception  
  217.         while True:  
  218.             line = fp.readline()  
  219.             self._data.append(line) #KVS  
  220.             if not line:  
  221.                 break 
  222.             lineno = lineno + 1 
  223.             if line.strip() == '' or line[0in '#;':  
  224.                 continue 
  225.             if line.split(None1)[0].lower() == 'rem' and line[0in "rR":  
  226.                 # no leading whitespace  
  227.                 continue 
  228.             if line[0].isspace() and cursect is not None and optname:  
  229.                 value = line.strip()  
  230.                 if value:  
  231.                     cursect[optname] = "%s\n%s" % (cursect[optname], value)  
  232.             else:  
  233.                 mo = self.SECTCRE.match(line)  
  234.                 if mo:  
  235.                     sectname = mo.group('header')  
  236.                     if sectname in self._sections:  
  237.                         cursect = self._sections[sectname]  
  238.                     elif sectname == DEFAULTSECT:  
  239.                         cursect = self._defaults  
  240.                         self._location[DEFAULTSECT] = lineno -1 #KVS  
  241.                            
  242.                     else:  
  243.                         cursect = {'__name__': sectname}  
  244.                         self._location[sectname] = lineno -1 #KVS  
  245.                         self._sections[sectname] = cursect  
  246.    
  247.                     optname = None 
  248.                 elif cursect is None:  
  249.                     raise MissingSectionHeaderError(fpname, lineno, line)  
  250.                 else:  
  251.                     mo = self.OPTCRE.match(line)  
  252.                     if mo:  
  253.                         optname, vi, optval = mo.group('option''vi''value')  
  254.                         if vi in ('='':'and ';' in optval:  
  255.                             pos = optval.find(';')  
  256.                             if pos != -1 and optval[pos-1].isspace():  
  257.                                 optval = optval[:pos]  
  258.                         optval = optval.strip()  
  259.                         if optval == '""':  
  260.                             optval = '' 
  261.                         optname = self.optionxform(optname.rstrip())  
  262.                         cursect[optname] = optval  
  263.                            
  264.                         if cursect == self._defaults:  
  265.                             wholename = DEFAULTSECT + '_' + optname  #KVS  
  266.                         else:  
  267.                             wholename = cursect['__name__'] + '_' + optname  #KVS  
  268.                         self._location[wholename] = lineno-1     #KVS  
  269.                     else:  
  270.                         if not e:  
  271.                             e = ParsingError(fpname)  
  272.                         e.append(lineno, repr(line))  
  273.         if e:  
  274.             raise e  
  275.    
  276.     def add_section(self, section):  
  277.         """Create a new section in the configuration.  
  278.    
  279.         Raise DuplicateSectionError if a section by the specified name  
  280.         already exists.  
  281.         """ 
  282.         if section in self._sections:  
  283.             raise DuplicateSectionError(section)  
  284.         self._sections[section] = {}  
  285.    
  286.         linecount = len(self._data)  
  287.         self._data.append('\n')  
  288.         self._data.append('%s'%section)  
  289.         self._location[section] = linecount + 1 
  290.    
  291.     def set(self, section, option, value):  
  292.         """Set an option.""" 
  293.         if not section or section == DEFAULTSECT:  
  294.             sectdict = self._defaults  
  295.         else:  
  296.             try:  
  297.                 sectdict = self._sections[section]  
  298.             except KeyError:  
  299.                 raise NoSectionError(section)  
  300.         option = self.optionxform(option)  
  301.         add = False 
  302.         if not option in sectdict:  
  303.             add = True 
  304.         sectdict[self.optionxform(option)] = value  
  305.         if add:  
  306.             lineno = self._location[section]  
  307.             self._data.append('')  
  308.             idx = len(self._data)  
  309.             while idx>lineno:  
  310.                 self._data[idx-1] = self._data[idx-2]  
  311.                 idx = idx-1 
  312.             self._data[idx+1] = '%s = %s\n'%(option,value)  
  313.             self._location[section+'_'+option]=idx+1 
  314.             for key in self._location:  
  315.                 if self._location[key] > lineno:  
  316.                     self._location[key] = self._location[key] + 1 
  317.             self._data[idx+1] = '%s = %s\n'%(option,value)  
  318.             self._location[section+'_'+option]=idx+1 
  319.    
  320.     def remove_option(self, section, option):  
  321.         """Remove an option. """ 
  322.         if not section or section == DEFAULTSECT:  
  323.             sectdict = self._defaults  
  324.         else:  
  325.             try:  
  326.                 sectdict = self._sections[section]  
  327.             except KeyError:  
  328.                 raise NoSectionError(section)  
  329.         option = self.optionxform(option)  
  330.         existed = option in sectdict  
  331.         if existed:  
  332.             del sectdict[option]  
  333.             wholename = section + '_' + option  
  334.             lineno  = self._location[wholename]  
  335.                
  336.             del self._location[wholename]  
  337.             for key in self._location:  
  338.                 if self._location[key] > lineno:  
  339.                     self._location[key] = self._location[key] -1 
  340.             del self._data[lineno]  
  341.         return existed  
  342.    
  343.     def remove_section(self, section):  
  344.         """Remove a file section.""" 
  345.         existed = section in self._sections  
  346.         if existed:  
  347.             lstOpts = []  
  348.             for option in self._sections[section]:  
  349.                 if option == '__name__':  
  350.                     continue 
  351.                 lstOpts.append(option)  
  352.             for option in lstOpts:  
  353.                 self.remove_option(section,option)  
  354.    
  355.             del self._sections[section]  
  356.             wholename = section  
  357.             lineno  = self._location[wholename]  
  358.                
  359.             del self._location[wholename]  
  360.             for key in self._location:  
  361.                 if self._location[key] > lineno:  
  362.                     self._location[key] = self._location[key] -1 
  363.             del self._data[lineno]  
  364.         return existed  
  365.    
  366.     def optionxform(self, optionstr):  
  367.         ''''' 防止大小写转换''' 
  368.         return optionstr