为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Python


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

#!/usr/bin/python  

# -*- coding: utf-8 -*-  

# 通用功能类封装  

import os,time,sys,string,urllib,httplib,shutil,platform,tarfile  

from commands import getstatusoutput as getso  

from ConfigParser import *  

 

def hostname(host_name):  

    '''''  

    linux适用  

       

    hostname封装,修改主机名。  

    ''' 

    str_cmd = "/bin/sed -i 's/HOSTNAME/#&/;$a HOSTNAME=%s' /etc/sysconfig/network;/bin/hostname %s" % (host_name,host_name)  

    status, result = getso(str_cmd)  

    wr_log(str_cmd, status, result)  

   

def md5sum(file_name):  

    '''''  

    md5sum封装,获取文件的md5值  

    ''' 

    if os.path.isfile(file_name):  

        f = open(file_name,'rb')  

        py_ver = sys.version[:3]  

        if py_ver == "2.4":  

            import md5 as hashlib  

        else:  

            import hashlib  

            md5 = hashlib.md5(f.read()).hexdigest()  

            f.close()  

            return md5  

    else:  

        return 0 

   

def md5(file_name):  

    '''''  

    linux适用  

   

    md5sum -c 封装,校验md5文件,返回校验成功或失败状态  

    ''' 

    str_cmd="/usr/bin/md5sum -c %s" % file_name  

    status,result=getso(str_cmd)  

    return status  

   

def grep(s_str, file_name):  

    '''''  

    grep封装,查找文件中关键字,有则返回所在行,否则返回空字符串。  

    ''' 

    try:  

        fd = open(file_name)  

        content = fd.read()  

        result = ""  

        if content.find(s_str) != -1:  

            for line in content.split("\n"):  

                if line.find(s_str) != -1:  

                    result = result + line + "\n" 

        return result.strip()  

    except Exception, e:  

        wr_log("grep %s %s" % (s_str, file_nsme), 1, e)  

   

def rwconf(type, file_name, section, option, s_str=""):  

    '''''  

    读取标准的ini格式配置文件,type可为以下值:  

    get     获取section下的option的值,值为字符串;  

    getint  获取section下的option的值,值为数字;  

    modi    修改section下的option的值,并保存;  

    del     删除section下的option,并保存。  

   

    注:option严格区分大小写  

    ''' 

    try:  

        if type == "get" or type == "getint":  

            cf = ConfigParser()  

        else:  

            cf = ConfParser()  

        cf.read(file_name)  

        if type == "get":  

            return cf.get(section, option)  

        elif type == "getint":  

            return cf.getint(section, option)  

        elif type == "modi":  

            try:  

                cf.set(section, option, s_str)  

                cf.write(open(file_name, "w"))  

                wr_log("modify %s for %s" % (option, file_name))  

            except Exception, e:  

                wr_log("modify %s for %s" % (option, file_name), 1, str(e))  

        elif type == "del":  

            try:  

                cf.remove_option(section, option)  

                cf.write(open(file_name, "w"))  

                wr_log("del %s for %s" % (option, file_name))  

            except Exception, e:  

                wr_log("del %s for %s" % (option, file_name), 1, str(e))  

    except Exception, e:  

        wr_log("read %s for %s" % (option, file_name), 1, str(e))  

   

def chkconfig(type, svr_name, switch=""):  

    '''''  

    linux适用  

       

    chkconfig封装,根据传入的type参数执行相应操作,type可以为以下几种:  

    add  添加服务至启动项;  

    del  从启动项删除服务;  

    数字  指定运行级别的服务开启或关闭。  

       

    type及svr_name为必需的参数。  

       

    例子:  

    开启运行级别3的sshd服务:chkconfig("3", "sshd", "on")  

    ''' 

    if type != "add" and type != "del":  

        type = "--level %s" % str(type)  

    str_cmd = "/sbin/chkconfig %s %s %s" % (type, svr_name, switch)  

    status, result = getso(str_cmd)  

    wr_log(str_cmd, status, result)  

   

def passwd(user_name,newpass):  

    '''''  

    passwd封装,修改用户密码  

    ''' 

    os_type = platform.system()  

    if os_type == "Linux":  

        str_cmd = "echo '%s' | passwd %s --stdin" % (newpass, user_name)  

        status, result = getso(str_cmd)  

        wr_log(str_cmd, status, result)  

    elif os_type == "Windows":  

        try:  

            if os.system('net user %s "%s" ' %(user_name,newpass)) == 0:  

                wr_log("modify passwd for %s  " % user_name)  

            elif os.system('net user %s "%s" ' %(user_name,newpass)) == 2:  

                raise Exception, "user %s isnot exists" % user_name  

        except Exception,e:  

            wr_log("modify passwd for %s " % user_name, 1, e)  

   

def echo(str, file_name):  

    '''''  

    linux适用  

   

    echo封装,添加字符串到文件尾部  

    ''' 

    str_cmd = "/bin/echo '%s' >> %s" % (str, file_name)  

    status, result = getso(str_cmd)  

    wr_log(str_cmd, status, result)  

   

def upload(localfiles, remotepath, host="xxx", username="xxx", password="xxxx"):  

    '''''  

    上传文件至ftp服务器,默认上传至208FTP,如要上传至其它FTP服务器,请指定host/user/pass  

   

    例:  

    upload("a.txt,b.txt", "/test/")  

    上传a.txt、b.txt文件到208的test目录下  

    ''' 

    import base64  

    from ftplib import FTP  

    try:  

        localfiles = localfiles.split(",")  

        f =FTP(host)  

        f.login(username,password)  

        f.cwd(remotepath)  

        for localfile in localfiles:  

            fd = open(localfile,'rb')  

            f.storbinary('STOR %s' % os.path.basename(localfile),fd)  

            fd.close()  

        f.quit()  

        wr_log("upload %s" % localfiles)  

    except Exception, e:  

        wr_log("upload %s" % localfiles, 1, e)  

   

class ConfParser(RawConfigParser):  

    '''''  

    ConfigParser模块有一个缺陷,改写ini文件的某个section的某个option,写入ini文件后  

    ini文件的注释都丢掉了,并且option的大写字母都转换成了小写  

    为了保存ini文件的注释以及option的大小写,重写了write、set、optionxform等方法,由rwconf函数调用  

    ''' 

    def write(self, fp):  

        """Write an .ini-format representation of the configuration state.  

   

        write ini by line no  

        """ 

           

        if self._defaults:  

            section = DEFAULTSECT  

            lineno = self._location[section]  

            self._data[lineno] = "[%s]\n" %section  

            for (key, value) in self._defaults.items():  

                if key != "__name__":  

                    wholename = section + '_' + key  #KVS  

                    lineno = self._location[wholename]  

                    self._data[lineno] = "%s = %s\n" %(key, str(value).replace('\n', '\n\t'))  

                       

        for section in self._sections:  

            lineno = self._location[section]  

            self._data[lineno] = "[%s]\n" % section  

            for (key, value) in self._sections[section].items():  

                if key != "__name__":  

                    wholename = section + '_' + key  #KVS  

                    lineno = self._location[wholename]  

                    self._data[lineno] = "%s = %s\n" %(key, str(value).replace('\n', '\n\t'))  

               

        for line in self._data:  

            fp.write("%s"%line)  

        fp.close()  

               

    def _read(self, fp, fpname):  

        """Parse a sectioned setup file.  

   

        When parsing ini file, store the line no in self._location  

        and store all lines in self._data  

        """ 

        self._location = {}  

        self._data = []  

        cursect = None      # None, or a dictionary  

        optname = None 

        lineno = 0 

        e = None            # None, or an exception  

        while True:  

            line = fp.readline()  

            self._data.append(line) #KVS  

            if not line:  

                break 

            lineno = lineno + 1 

            if line.strip() == '' or line[0] in '#;':  

                continue 

            if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":  

                # no leading whitespace  

                continue 

            if line[0].isspace() and cursect is not None and optname:  

                value = line.strip()  

                if value:  

                    cursect[optname] = "%s\n%s" % (cursect[optname], value)  

            else:  

                mo = self.SECTCRE.match(line)  

                if mo:  

                    sectname = mo.group('header')  

                    if sectname in self._sections:  

                        cursect = self._sections[sectname]  

                    elif sectname == DEFAULTSECT:  

                        cursect = self._defaults  

                        self._location[DEFAULTSECT] = lineno -1 #KVS  

                           

                    else:  

                        cursect = {'__name__': sectname}  

                        self._location[sectname] = lineno -1 #KVS  

                        self._sections[sectname] = cursect  

   

                    optname = None 

                elif cursect is None:  

                    raise MissingSectionHeaderError(fpname, lineno, line)  

                else:  

                    mo = self.OPTCRE.match(line)  

                    if mo:  

                        optname, vi, optval = mo.group('option', 'vi', 'value')  

                        if vi in ('=', ':') and ';' in optval:  

                            pos = optval.find(';')  

                            if pos != -1 and optval[pos-1].isspace():  

                                optval = optval[:pos]  

                        optval = optval.strip()  

                        if optval == '""':  

                            optval = '' 

                        optname = self.optionxform(optname.rstrip())  

                        cursect[optname] = optval  

                           

                        if cursect == self._defaults:  

                            wholename = DEFAULTSECT + '_' + optname  #KVS  

                        else:  

                            wholename = cursect['__name__'] + '_' + optname  #KVS  

                        self._location[wholename] = lineno-1     #KVS  

                    else:  

                        if not e:  

                            e = ParsingError(fpname)  

                        e.append(lineno, repr(line))  

        if e:  

            raise e  

   

    def add_section(self, section):  

        """Create a new section in the configuration.  

   

        Raise DuplicateSectionError if a section by the specified name  

        already exists.  

        """ 

        if section in self._sections:  

            raise DuplicateSectionError(section)  

        self._sections[section] = {}  

   

        linecount = len(self._data)  

        self._data.append('\n')  

        self._data.append('%s'%section)  

        self._location[section] = linecount + 1 

   

    def set(self, section, option, value):  

        """Set an option.""" 

        if not section or section == DEFAULTSECT:  

            sectdict = self._defaults  

        else:  

            try:  

                sectdict = self._sections[section]  

            except KeyError:  

                raise NoSectionError(section)  

        option = self.optionxform(option)  

        add = False 

        if not option in sectdict:  

            add = True 

        sectdict[self.optionxform(option)] = value  

        if add:  

            lineno = self._location[section]  

            self._data.append('')  

            idx = len(self._data)  

            while idx>lineno:  

                self._data[idx-1] = self._data[idx-2]  

                idx = idx-1 

            self._data[idx+1] = '%s = %s\n'%(option,value)  

            self._location[section+'_'+option]=idx+1 

            for key in self._location:  

                if self._location[key] > lineno:  

                    self._location[key] = self._location[key] + 1 

            self._data[idx+1] = '%s = %s\n'%(option,value)  

            self._location[section+'_'+option]=idx+1 

   

    def remove_option(self, section, option):  

        """Remove an option. """ 

        if not section or section == DEFAULTSECT:  

            sectdict = self._defaults  

        else:  

            try:  

                sectdict = self._sections[section]  

            except KeyError:  

                raise NoSectionError(section)  

        option = self.optionxform(option)  

        existed = option in sectdict  

        if existed:  

            del sectdict[option]  

            wholename = section + '_' + option  

            lineno  = self._location[wholename]  

               

            del self._location[wholename]  

            for key in self._location:  

                if self._location[key] > lineno:  

                    self._location[key] = self._location[key] -1 

            del self._data[lineno]  

        return existed  

   

    def remove_section(self, section):  

        """Remove a file section.""" 

        existed = section in self._sections  

        if existed:  

            lstOpts = []  

            for option in self._sections[section]:  

                if option == '__name__':  

                    continue 

                lstOpts.append(option)  

            for option in lstOpts:  

                self.remove_option(section,option)  

   

            del self._sections[section]  

            wholename = section  

            lineno  = self._location[wholename]  

               

            del self._location[wholename]  

            for key in self._location:  

                if self._location[key] > lineno:  

                    self._location[key] = self._location[key] -1 

            del self._data[lineno]  

        return existed  

   

    def optionxform(self, optionstr):  

        ''''' 防止大小写转换''' 

        return optionstr 

 

©著作权归作者所有:来自51CTO博客作者AIOPS_DBA的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消