python写的系统常用命令(二)

发布时间:2019-09-12 07:55:10编辑:auto阅读(1563)

    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 

     

关键字