python修改linux配置文件_linux通过python脚本修改配置文件 - CSDN
精华内容
参与话题
  • Python-修改配置文件

    千次阅读 2018-03-18 10:42:26
    配置文件修改功能:主要用来作为功能菜单选择及相关模块的选择、处理功能,包括: 1 查看所有 backend 的配置信息 2 添加配置信息 3 删除配置信息设计思路:查看功能: 打开配置文件,一行一行的进行读取,当发现...
    配置文件的修改


    功能:
    主要用来作为功能菜单选择及相关模块的选择、处理功能,包括:
            1 查看所有 backend 的配置信息
            2 添加配置信息
            3 删除配置信息


    设计思路:
    查看功能: 打开配置文件,一行一行的进行读取,当发现有 backend开头行时,再判断后面的 域名是否等于要查找的名称,如果是则做一个标记,判断标记
               为True时开始写到变量中,直到找到下一个backend时将标志位置False
    添加配置信息:新建一个临时文件,同查找功能一样一行一行读取写入临时文件,同时判断当找到指定backend的记录后,置标志位,到下一个backend记录时
                将新增加的记录写入文件,再将剩下的配置信息写入到文件中。最后进行重命名操作替换到以前的配置文件
    删除配置信息: 同添加类似,一行一行读取。当找到与要删除的配置一样时,就把那一行跳过不写入文件

    2 haconfig.py       haproxy 自定义类

    功能:
    此文件主要是将要操作的配置文件进行一个类的封装。
    用户的添加、删除、查找等操作都在类实现了具体的方法。并增加了 IP 地址合法性的判断。将用户输入的配置参数中的: IP地址、weight值、maxconn值
    作为类的一个属性进行处理,在类内部通过字符串的拼接生成配置串
    包括方法:
    1 获取所有backend下的配置信息 : show_show_backend()
    2 添加配置信息: add_backend()
    3 删除配置信息: del_backend()
    4 检查ip合法性:check_ip_available
    5 字符串拼接:union_str

    6 获取backend的所有节点名; get_backend_name




    流程图:



    源码;

    haconfig.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import os
    import shutil
    import re
    
    
    _default_path = os.path.dirname(os.path.abspath("__file__"))
    class haproxy(object):
    
        _default_path = os.path.dirname(os.path.abspath("__file__"))
        _default_file = os.path.join(_default_path, "config.ini")
        _tmp_file = os.path.join(_default_path, "tmp.ini")
    
        def __init__(self, ip='', weight=20, max_conn=100, file=_default_file):
            self.config_file = file
            self.ip_address = ip
            self.weight = weight
            self.max_conn = max_conn
            self.backend_contant = ''
            self.backend_name = list()
    
        # 检查ip是否合法,变为一个属性
        @property
        def check_ip_available(self):
            rule = "((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"
            #         (200-240   | 250- 255|0-199|). 重复3次       IP
            r = re.compile(rule)
            if r.match(self.ip_address):
                return True
            else:
                return False
    
        # 拼接字符串
        def union_str(self):
            """
            添加或修改backend的内容时,调用此类方法,将输入的参数值拼接成一行完成配置信息
            :return: 更新到self.backend_value属性中,
            """
            _default_str = 'server {ip} {ip} weight {weight} maxconn {maxconn}'
            self.backend_contant = _default_str.format(ip=self.ip_address,
                                                       weight=self.weight,
                                                       maxconn=self.max_conn)
    
        def get_backend_name(self):
            """
            获取配置文件中的所有 backend 节点信息
            :return: 无返回值,保存在 self.backend_name 中
            """
            with open(self.config_file, 'r') as fr:
                for line in fr:
                    if line.startswith("backend"):
                        self.backend_name.append(line.split()[1])
    
        # 查找指定 backend 节点下的配置信息
        def show_backend(self, backend):
            """
            根据用户输入的 backend 节点值获取对应的配置文件
            :param backend: 查找的键值,如: test.oldboy.org
            :return: 返回一个列表  list
            """
            result = list()
            # 定位到查找的行标识
            line_locked_flag = False
    
            with open(self.config_file, 'r', encoding='utf-8') as f:
                for line in f:
                    # 如果找到 backend 配置节
                    if line.startswith('backend'):
                        # 获取backend的内容,test.oldboy.com
                        url_addr = line.split()[1]
                        # 如果内容和搜索的内容一样,则将定位标识置为True
                        if url_addr == backend:
                            line_locked_flag = True
                            continue
                        else:
                            line_locked_flag = False
    
                    # 如果定位到内容则将配置写入到结果列表中
                    if line_locked_flag:
                        result.append(line)
            return result
    
        # 增加backend内容
        def add_backend(self, backend):
            """
            根据输入的backend查找文件:
            如果存在 backend,则在配置末尾增加一条记录
            如果不存在 backend,则在最后新增加一个
            :param backend: 要增加的backend,如:test.oldboy.com
            :return:
            """
            # 是否存在指定的backend标识,如果存在就在指定下面添加配置,没有就新建一个backend,再添加配置
            backend_is_exists_flag = False
            # 定位到查找的行标识
            line_locked_flag = False
    
            try:
                with open(self.config_file, 'r') as fr,open(self._tmp_file, 'a+') as fw:
                    for line in fr:
                        if line.startswith('backend'):
                            url_addr = line.split()[1]
                            if url_addr == backend:
                                backend_is_exists_flag = True
                                line_locked_flag = True
                            else:
                                # 找到"backend"字符标识,且定位标识为True,说明到了定位的下一个backend,这时需要先追加一条配置
                                if line_locked_flag:
                                    fw.write("        {content}\n".format(content=self.backend_contant))
                                    line_locked_flag = False
                        fw.write(line)
    
                    # 文件中没有要添加的 backend 节点,那在最后新增加一个节点
                    if not backend_is_exists_flag:
                        fw.write("backend {url}\n".format(url=backend))
                        fw.write("        {content}\n".format(content=self.backend_contant))
    
                # 将临时文件重命名,替换原来的配置文件
                shutil.move(self._tmp_file, self.config_file)
    
                return True
            except Exception as e:
                return e
    
        # 删除指定 backend 的配置
        def del_backend(self, backend):
            is_locked_flag = False
            # 是否找到指定的 IP 配置信息
            is_delete_flag = False
            try:
                with open(self.config_file, 'r') as fr, open(self._tmp_file, 'a+') as fw:
                    for line in fr:
                        # 找到backend行
                        if line.startswith("backend"):
                            url_addr = line.split()[1]
                            # 找到指定的backend节点
                            if url_addr == backend:
                                is_locked_flag = True
                            else:
                                # 找到指定 backend 节点的下一个backend, 定位标识别改为False
                                if is_locked_flag:
                                    is_locked_flag = False
                        else:
                            if is_locked_flag:
                                # 在定位的 backend 节点下找到符合的 IP ,则把这一行跳过,不写到tmp文件中
                                if line.count(self.ip_address) > 0:
                                    is_delete_flag = True
                                    continue
    
                        fw.write(line)
                shutil.move(self._tmp_file, self.config_file)
                if not is_delete_flag:
                    return False
                else:
                    return True
            except Exception as e:
                return e
    Modify_ini.py:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from haconfig import haproxy
    
    welcome_title_str = "%s\n#%s#\n#%s#\n#%s#\n%s" % ("".ljust(50, '#'),
                                                      ''.ljust(48, ' '),
                                                      'HAProxy 配置管理程序'.center(43, ' '),
                                                      ''.ljust(48, ' '),
                                                      ''.ljust(50, '#')
                                                      )
    menu_str = "\n1.查找配置\n2.添加配置\n3.删除配置\n4.退出程序\n"
    
    
    # 返回一个非空的输入
    def input_string(show_message, is_int=False):
        """
        对input函数进行重新改造,增加判断不能为空,
        :param show_message: input()中的提示信息
        :param is_int: 是否要求输入必须为数字,默认为False,如果为True就要检查是否为数字
        :return: 返回用户输入的值
        """
        not_null_flag = False
        while not not_null_flag:
            # 获得用户的输入信息
            input_value = input("{message}".format(message=show_message)).strip().lower()
            if not input_value:
                continue
            else:
                # 如果要求输入必须为数字,则做以下验证
                if is_int:
                    if not input_value.isdigit():
                        print("\n\033[1;30m非法输入,请输入一个数字!\033[0m")
                        continue
                not_null_flag = True
        return input_value
    
    
    if __name__ == "__main__":
        print(welcome_title_str)
    
        # 退出系统标识
        exit_flag = False
        while not exit_flag:
            print(menu_str)
            choose = input("请选择功能模块:").strip().lower()
    
            # 退出系统
            if choose == '4':
                exit_flag = True
                continue
    
            if choose not in ('1', '2', '3'):
                print("\n\033[1;31m输入错误!请输入正确的功能编号.\033[0m")
            else:
                # 实例化配置文件对象
                proxyobj = haproxy()
    
                # 1. 查找节点配置信息
                if choose == "1":
                    # 获取所有 backend 的节点名称
                    proxyobj.get_backend_name()
                    print("\n当前配置文件所有 backend 节点名称:")
                    for name in proxyobj.backend_name:
                        print(name)
    
                    search_backend = input_string("\n请输入要查找的 backend 域名:")
                    # 调用类方法获取配置信息列表
                    search_result = proxyobj.show_backend(search_backend)
                    if not search_result:
                        print("\n\033[1;30m没有找到要查找的记录!\033[1m\n ")
                    else:
                        for record in search_result:
                            print(record.strip())
    
                # 2. 添加配置
                if choose == "2":
                    search_backend = input_string("请输入要添加的 backend 域名:")
                    # 对配置文件对象进行赋值
                    proxyobj.ip_address = input_string("请输入添加的 IP 地址:")
                    # 判断IP是否合法
                    while not proxyobj.check_ip_available:
                        proxyobj.ip_address = input_string("\nIP地址不合法! 请重新输入 IP 地址:")
                    proxyobj.weight = input_string("请输入添加的 weight 值:", is_int=True)
                    proxyobj.max_conn = input_string("请输入添加的 max conn 值:", is_int=True)
    
                    # 根据用户输入的信息,调用类的格式化字符串方法生成配置文件串
                    proxyobj.union_str()
    
                    # 调用添加方法进行添加配置操作
                    if proxyobj.add_backend(search_backend):
                        print("\n添加成功! 节点当前配置更新为:")
    
                    # 将添加成功的信息打印出来,直接调用类的查看方法
                    search_result = proxyobj.show_backend(search_backend)
                    for line in search_result:
                        print(line.strip())
    
                # 3. 删除配置
                if choose == "3":
                    # 重新获取一下当前配置文件中的节点名称列表
                    proxyobj.get_backend_name()
    
                    # 要删除的 backend 节点是否存在标识
                    is_exist_flag = False
                    while not is_exist_flag:
                        search_backend = input_string("请指定要删除配置的 backend 节点名称: ")
                        if search_backend not in proxyobj.backend_name:
                            print("\n当前配置文件中未找到 %s 的 backend 节点!" %search_backend)
                            continue
                        else:
                            is_exist_flag = True
    
                    proxyobj.ip_address = input_string("请输入要删除的 IP 地址:")
                    # 判断IP是否合法
                    while not proxyobj.check_ip_available:
                        proxyobj.ip_address = input_string("\nIP地址不合法! 请重新输入 IP 地址:")
    
                    # 调用类的删除方法进行删除操作
                    if proxyobj.del_backend(search_backend):
                        print("\n删除成功!当前节点配置更新为: ")
                    else:
                        print("\n删除失败!请检查 IP 地址是否存在!\n")
    
                    # 将修改后的信息打印出来,直接调用类的查看方法
                    search_result = proxyobj.show_backend(search_backend)
                    for line in search_result:
                        print(line.strip())
    


    展开全文
  • python 操作配置文件ini的三种方法

    万次阅读 2018-06-13 19:44:05
    python 操作配置文件ini的三种方法 方法一:crudini 命令 说明 crudini命令是Linux下的一个操作配置文件的命令工具 用法 crudini --set [--existing] config_file section [param] [value] # 修改配置文件...

    python 操作配置文件ini的三种方法

    方法一:crudini 命令

    说明

    crudini命令是Linux下的一个操作配置文件的命令工具
    用法

    crudini --set [--existing] config_file section [param] [value] # 修改配置文件内容
    crudini --get [--format=sh|ini] config_file [section] [param]  # 获取配置文件内容
    crudini --del [--existing] config_file section [param]         # 删除配置文件内容
    crudini --merge [--existing] config_file [section]             # 合并

    举例

    添加

     crudini --set test.ini test_section test_param test_value

    更新

     crudini --set [--existing]  test.ini test_section test_param test_value

    删除
    删除param:

     crudini --del test.ini test_section test_param

    删除section:

     crudini --del test.ini test_section

    获取

     crudini --del test.ini test_section test_param

    如果该标量不在某一个section里面,则section用一个空字符表示:

     crudini --del test.ini '' test_param

    合并
    将another.ini配置文件合并到test.ini中:

     crudini --merge test.ini < another.ini

    方法二 :ConfigParser模块

    说明

    ConfigParser 模块为常用的操作ini文件的模块,但是存在一些缺陷,无法识别section的大小写,无法读取文件注释,这样修带有注释的配置文件时就会存在问题。

    用法示例

    示例文件test.ini

    [test_section]
    test_param = test_value
    
    

    读取

    import ConfigParser
    
    config = ConfigParser.ConfigParser()
    config.readfp(open('test.ini'))
    test_value = config.get("test_section","test_param")

    写入
    添加section

    import ConfigParser
    
    config = ConfigParser.ConfigParser()
    
    # set a value of parameters
    config.add_section("test_section2")
    config.set("test_section2", "test_param2", "test_value2")
    config.set("test_section3", "test_param3", "test_value3")
    # write to file
    config.write(open('test.ini', "w"))

    修改

    import ConfigParser
    
    config = ConfigParser.ConfigParser()
    config.read('1.ini')
    config.set("test_section", "test_param3", "test_value3")
    
    config.write(open('test.ini', "r+")) 

    方法三:configobj模块

    说明

    正常的读配置文件的方法是给ConfigObj一个文件名,然后通过字典来访问成员,子段来获取value值,不会存在注释无法读取的缺陷

    用法示例

    示例文件test.ini

    [test_section]
    test_param = test_value

    读取

    from configobj import ConfigObj  
    
    config = ConfigObj("test.ini",encoding='UTF8')  
    
    # 读配置文件  
    print config['test_section']  
    print config['test_section']['test_param ']  

    修改

    from configobj import ConfigObj  
    
    config = ConfigObj("test.ini",encoding='UTF8')  
    config['test_section']['test_param '] = "test_value2"  
    # 写入
    config.write()  

    添加section

    from configobj import ConfigObj  
    
    config = ConfigObj("test.ini",encoding='UTF8')  
    config['test_section2'] = {}  
    config['test_section2']['test_param'] = "test_value"  
    # 写入
    config.write()  

    删除

    from configobj import ConfigObj  
    
    config = ConfigObj("test.ini",encoding='UTF8')  
    del config['test_section2']['test_param']  
    config.write()  
    展开全文
  • 发现error ImportError: dynamic module does not define module export ...修改系统环境变量配置文件,vi ~/.bashrc,注释掉关于Anaconda的环境变量: #export PATH=/home/soft/conda3/bin:$PATH 然后把这个环...

    发现error

    ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

     

    修改系统环境变量配置文件,vi ~/.bashrc,注释掉关于Anaconda的环境变量:

    #export PATH=/home/soft/conda3/bin:$PATH

    然后把这个环境变量改为PYTHON_PATH,如下:

    export PYTHON_PATH=/home/soft/conda3/bin
    ---------------------
    作者:nudt_qxx
    来源:CSDN
    原文:https://blog.csdn.net/xiangxianghehe/article/details/79430072
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

    修改过程为按 Insert键后可以进行修改

    修改后按 Esc, 输入冒号: ,保存退出为 wq!

    转载于:https://www.cnblogs.com/guiguiguoguo/p/10610224.html

    展开全文
  • 后台服务程序是随系统自启动的,我们只要把Python脚本配置为服务就行了。需要注意的一点是你Python脚本的启动时机,它依赖不依赖其他服务(网络连接、一些分区的挂载等等)。 #1 Python脚本 一个你要自启动的...

    Python脚本开机自动运行;本帖适用于使用systemd的Linux系统,现在流行的Linux发行版都使用systemd。

    后台服务程序是随系统自启动的,我们只要把Python脚本配置为服务就行了。需要注意的一点是你Python脚本的启动时机,它依赖不依赖其他服务(网络连接、一些分区的挂载等等)。

    #1 Python脚本

    一个你要自启动的Python脚本,我使用 /home/snail/autorun.py为例。

    #2 创建Unit配置文件

    $sudovim/lib/systemd/system/autorun.service

    写入如下内容:

     

    上面定义了一个叫 Test Service 的服务,它在multi-user环境起来之后运行;ExecStart参数指定我们要运行的程序;idle确保脚本在其他东西加载完成之后运行,它的默认值是simple。

    注意使用绝对路径。

    为了获得脚本的输出信息,我们可以重定向到文件:

    ExecStart=/usr/bin/python/home/snail/autorun.py>/home/snail/autorun.log2>&1

    更改配置文件的权限:

    $sudochmod644/lib/systemd/system/autorun.service

    #3 使配置文件生效

     

    #4 重启

    $sudoreboot

     

    #5 查看服务状态

    $sudosystemctlstatusautorun.service

     

     

     

    #6 服务操作命令

    systemctl命令是系统服务管理器指令,它实际上将servicechkconfig这两个命令组合到一起。

     

    实例

    1.启动nfs服务

    systemctl start nfs-server.service

    2.设置开机自启动

    systemctl enable nfs-server.service

    3.停止开机自启动

    systemctl disable nfs-server.service

    4.查看服务当前状态

    systemctl status nfs-server.service

    5.重新启动某服务

    systemctl restart nfs-server.service

    6.查看所有已启动的服务

    systemctl list -units --type=service

    开启防火墙22端口

    iptables-I INPUT -p tcp --dport 22 -jaccept

    如果仍然有问题,就可能是SELinux导致的

    关闭SElinux:

    修改/etc/selinux/config文件中的SELINUX=””为disabled,然后重启。

    彻底关闭防火墙:

    sudosystemctl status firewalld.servicesudo systemctl stop firewalld.service          sudo systemctl disable firewalld.service实例

    1.启动nfs服务

    systemctl start nfs-server.service

    2.设置开机自启动

    systemctl enable nfs-server.service

    3.停止开机自启动

    systemctl disable nfs-server.service

    4.查看服务当前状态

    systemctl status nfs-server.service

    5.重新启动某服务

    systemctl restart nfs-server.service

    6.查看所有已启动的服务

    systemctl list -units --type=service

    开启防火墙22端口

    iptables-I INPUT -p tcp --dport 22 -jaccept

    如果仍然有问题,就可能是SELinux导致的

    关闭SElinux:

    修改/etc/selinux/config文件中的SELINUX=””为disabled,然后重启。

    彻底关闭防火墙:

    sudosystemctl status firewalld.servicesudo systemctl stop firewalld.service          sudo systemctl disable firewalld.service

    展开全文
  • 在用Linux(OS:Centos 7.2)时看到有一行代码是:export PYTHONPATH=$PYTHONPATH:/home/usrname/models:/home/usrname/models/one意思是将models以及其目录下的one文件夹加入系统环境中。百度了发现环境变量有三种...
  • /usr/bin/env python2 #coding:utf-8 __metaclass__ = type import os, sys class Addr(): ADDR_PATH = '/etc/sysconfig/network-scripts' def get_device(self): tl_device = [] f...
  • linux设置python环境变量

    万次阅读 2017-09-21 16:14:03
    添加环境变量主要是在/etc/profile中例如,在/usr/local/下安装了python2.7 因为系统默认是2.4,所以#python Python 2.4.3 (#1, Sep 3 2009, 15:37:37) [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2 Type ...
  • Linux安装Anaconda 后使用Anconda自带的python版本

    万次阅读 多人点赞 2016-10-18 11:18:40
    安装完anaconda后,在终端输入python发现依然是Ubuntu自带的python版本,这是因为.bashrc的更新还没有生效,命令行输入:source ~/.bashrc即可。
  • linux下搭建python虚拟环境

    千次阅读 2018-01-08 08:59:24
    这里给大家举一个简单的例子,桌面上有一个word文件,我们打开修改这个文件修改了一会之后发现还是原来的文件比较好,这个时候我想找回原来的文件就比较困难了。那么怎么办呢?就有这样一种解决方案,在修改文件...
  • Linux配置Python3详细步骤

    千次阅读 2018-05-13 22:12:55
    Linux上自带安装了Python2.6.6,但是我们需要用Python3的时候就需要重新安装Python3,并且不要去删除原来的Python2.下面开始Python3的安装步骤:1.下载Python3沿用Windows习惯,先新建一个文件夹再下载到这个文件夹...
  • sublime text 作为主流开发的 ide ,但其实我开始在我的 linux mint 系统使用 sublime text 配置 python3 的开发环境踩过的坑又何止一两个,所以有了这篇文章, 本片文章是针对linux系统配置 sublime text 为python3 ...
  • 非root用户如何在linux安装python,这样的教程很多,可参看: https://blog.csdn.net/levy_cui/article/details/75014572 ...1.不同的linux版本,配置文件略不同。大同小异。这么几种: .bashrc, .profi...
  • linux更新python3.7

    万次阅读 2018-12-25 11:25:26
    一·先去官网下载对应的安装包, wget ...tar -zvxf Python-3.7.2.tgz cd Python-3.7.2 mkdir /usr/local/python3.7 然后编译安装 ./configure --prefix=/usr/lo...
  • linux下更新Python版本并修改默认版本

    千次阅读 2014-11-11 19:47:44
    很多情况下拿到的服务器python版本很低,需要自己动手更改默认python版本
  • 老师说:学Python一定要掌握Linux

    万次阅读 2019-03-11 16:42:05
    不少Python新手经常问到学Python到底需不需要学习Linux? Python不是支持Windows和Linux操作系统吗?能在Windows下开发为什么还要学习Linux? 问这样的问题的朋友,可能还没有真正入行Python开发或者没有真正参与...
  • linux Vim编辑器及python必备配置

    千次阅读 2019-10-29 00:01:54
    修改vim配置文件 vim配置文件一般位于/usr/share/vim中,文件名为vimrc 通过以下方式修改编码类型: cd /usr/share/vim vim vimrc 添加以下代码 "增加中文显示" set fileencodings=utf-8,ucs-bom,gb18030,...
  • 转:linux设置python环境变量

    千次阅读 2018-09-23 11:58:29
    linux设置python环境变量 (2012-02-08 14:41:24) 转载▼
  • Python是解释性语言,我们如何将普通的Python项目(含有依赖,redis)打包成可运行的一个文件(实际为文件夹吧)。下面描述一个基本流程,供大家参考。以下流程是我们实际线上REDIS数据修改的一个需求,可以简单的...
  • Linux下设置PYTHONPATH环境变量有三种方法:一种作用于当前终端,一种作用于当前用户,一种作用于所有用户。 1.作用于当前终端,直接当前终端输入命令 $ export PYTHONPATH=$PYTHONPATH:<你的要加入的路径> ...
  • linux下安装python3.5

    万次阅读 2017-09-10 10:56:35
    Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装python3和python2共存。...
1 2 3 4 5 ... 20
收藏数 124,260
精华内容 49,704
关键字:

python修改linux配置文件