Python上网神器,自动修改Hosts工具

news2024/11/20 20:32:11

在这里插入图片描述

更多Python学习内容:ipengtao.com

大家好,我是彭涛,今天为大家分享 Python上网神器,自动修改Hosts工具,全文6400字,阅读大约18分钟。

在互联网时代,Hosts 文件的修改是一项常见的任务,用于解决一些网络访问问题或加速访问速度。为了更方便地进行Hosts文件的修改,我们可以借助Python编写一个自动修改Hosts的工具。本文将详细介绍如何使用Python创建一个功能强大且灵活的Hosts修改工具,并提供丰富的示例代码。

Hosts文件简介

Hosts文件是一个没有扩展名的系统文件,用于将IP地址映射到相应的主机名。通过修改Hosts文件,可以在绕过DNS解析的情况下指定某个域名对应的IP地址,实现一些定制化的网络配置。

Python脚本基础

首先,需要了解如何使用Python读取和写入文本文件。以下是一个简单的Python脚本,用于读取Hosts文件的内容:

# read_hosts.py
with open('/etc/hosts', 'r') as file:
    hosts_content = file.read()

print(hosts_content)

修改Hosts文件

接下来,扩展脚本,使其能够实现修改Hosts文件的功能。可以通过正则表达式或其他方法来查找和替换Hosts文件中的特定行。

以下是一个简单的示例:

# modify_hosts.py
import re

def modify_hosts(hosts_content, domain, ip):
    pattern = re.compile(fr'(\b{ip}\b).*\b{domain}\b')
    replacement = f'{ip} {domain}'

    if pattern.search(hosts_content):
        modified_content = pattern.sub(replacement, hosts_content)
    else:
        modified_content = f'{hosts_content}\n{replacement}'

    return modified_content

with open('/etc/hosts', 'r') as file:
    hosts_content = file.read()

modified_content = modify_hosts(hosts_content, 'example.com', '127.0.0.1')

with open('/etc/hosts', 'w') as file:
    file.write(modified_content)

命令行工具

将上述脚本转换为一个命令行工具,可以更方便地从终端使用。使用argparse库可以轻松实现命令行参数的解析:

# hosts_tool.py
import argparse
import re

def modify_hosts(hosts_content, domain, ip):
    pattern = re.compile(fr'(\b{ip}\b).*\b{domain}\b')
    replacement = f'{ip} {domain}'

    if pattern.search(hosts_content):
        modified_content = pattern.sub(replacement, hosts_content)
    else:
        modified_content = f'{hosts_content}\n{replacement}'

    return modified_content

def main():
    parser = argparse.ArgumentParser(description='Modify the Hosts file.')
    parser.add_argument('--domain', required=True, help='Domain to modify in Hosts file')
    parser.add_argument('--ip', required=True, help='IP address to set for the domain')
    args = parser.parse_args()

    with open('/etc/hosts', 'r') as file:
        hosts_content = file.read()

    modified_content = modify_hosts(hosts_content, args.domain, args.ip)

    with open('/etc/hosts', 'w') as file:
        file.write(modified_content)

if __name__ == '__main__':
    main()

通过运行python hosts_tool.py --domain example.com --ip 127.0.0.1,我们就能够方便地修改Hosts文件了。

完善工具

为了让工具更加健壮和易用,可以进一步添加功能,比如备份原Hosts文件、支持多个域名的同时修改等。

以下是一个增加备份功能的例子:

# hosts_tool.py
import argparse
import re
import shutil
import datetime

def backup_hosts(hosts_path):
    backup_path = f'{hosts_path}_backup_{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
    shutil.copyfile(hosts_path, backup_path)
    print(f'Backup created at {backup_path}')

def modify_hosts(hosts_content, domain, ip):
    pattern = re.compile(fr'(\b{ip}\b).*\b{domain}\b')
    replacement = f'{ip} {domain}'

    if pattern.search(hosts_content):
        modified_content = pattern.sub(replacement, hosts_content)
    else:
        modified_content = f'{hosts_content}\n{replacement}'

    return modified_content

def main():
    parser = argparse.ArgumentParser(description='Modify the Hosts file.')
    parser.add_argument('--domain', required=True, help='Domain to modify in Hosts file')
    parser.add_argument('--ip', required=True, help='IP address to set for the domain')
    parser.add_argument('--backup', action='store_true', help='Backup the original Hosts file')
    args = parser.parse_args()

    hosts_path = '/etc/hosts'

    if args.backup:
        backup_hosts(hosts_path)

    with open(hosts_path, 'r') as file:
        hosts_content = file.read()

    modified_content = modify_hosts(hosts_content, args.domain, args.ip)

    with open(hosts_path, 'w') as file:
        file.write(modified_content)

if __name__ == '__main__':
    main()

多域名修改支持

在进一步完善Hosts修改工具时,可以考虑支持同时修改多个域名的功能。为了实现这一点,需要对命令行参数进行修改,使其能够接受多个域名和对应的IP地址。

以下是一个相应的例子:

# hosts_tool.py
import argparse
import re
import shutil
import datetime

def backup_hosts(hosts_path):
    backup_path = f'{hosts_path}_backup_{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
    shutil.copyfile(hosts_path, backup_path)
    print(f'Backup created at {backup_path}')

def modify_hosts(hosts_content, modifications):
    for domain, ip in modifications.items():
        pattern = re.compile(fr'(\b{ip}\b).*\b{domain}\b')
        replacement = f'{ip} {domain}'

        if pattern.search(hosts_content):
            hosts_content = pattern.sub(replacement, hosts_content)
        else:
            hosts_content = f'{hosts_content}\n{replacement}'

    return hosts_content

def main():
    parser = argparse.ArgumentParser(description='Modify the Hosts file.')
    parser.add_argument('--backup', action='store_true', help='Backup the original Hosts file')
    parser.add_argument('modifications', nargs='+', metavar='domain:ip', help='Domain and IP pairs to modify in Hosts file')
    args = parser.parse_args()

    hosts_path = '/etc/hosts'

    if args.backup:
        backup_hosts(hosts_path)

    modifications = {}
    for modification in args.modifications:
        domain, ip = modification.split(':')
        modifications[domain] = ip

    with open(hosts_path, 'r') as file:
        hosts_content = file.read()

    modified_content = modify_hosts(hosts_content, modifications)

    with open(hosts_path, 'w') as file:
        file.write(modified_content)

if __name__ == '__main__':
    main()

通过运行python hosts_tool.py --backup example.com:127.0.0.1 google.com:192.168.1.1,可以同时修改多个域名的Hosts记录。

异常处理

为了增加工具的稳定性,可以加入异常处理机制。如果在文件操作或Hosts修改过程中发生错误,希望程序能够 graceful 地处理并给出有用的提示。

以下是一个简单的异常处理示例:

# hosts_tool.py
import argparse
import re
import shutil
import datetime

def backup_hosts(hosts_path):
    backup_path = f'{hosts_path}_backup_{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
    shutil.copyfile(hosts_path, backup_path)
    print(f'Backup created at {backup_path}')

def modify_hosts(hosts_content, modifications):
    for domain, ip in modifications.items():
        pattern = re.compile(fr'(\b{ip}\b).*\b{domain}\b')
        replacement = f'{ip} {domain}'

        if pattern.search(hosts_content):
            hosts_content = pattern.sub(replacement, hosts_content)
        else:
            hosts_content = f'{hosts_content}\n{replacement}'

    return hosts_content

def main():
    parser = argparse.ArgumentParser(description='Modify the Hosts file.')
    parser.add_argument('--backup', action='store_true', help='Backup the original Hosts file')
    parser.add_argument('modifications', nargs='+', metavar='domain:ip', help='Domain and IP pairs to modify in Hosts file')
    args = parser.parse_args()

    hosts_path = '/etc/hosts'

    try:
        if args.backup:
            backup_hosts(hosts_path)

        modifications = {}
        for modification in args.modifications:
            domain, ip = modification.split(':')
            modifications[domain] = ip

        with open(hosts_path, 'r') as file:
            hosts_content = file.read()

        modified_content = modify_hosts(hosts_content, modifications)

        with open(hosts_path, 'w') as file:
            file.write(modified_content)

        print('Hosts file modified successfully!')

    except Exception as e:
        print(f'Error: {e}')

if __name__ == '__main__':
    main()

这样,无论是文件不存在、无法写入,还是其他潜在的异常情况,都能够捕获并给出明确的错误提示。

总结

在这篇文章中,深入探讨了如何使用Python创建一个强大而实用的Hosts文件修改工具。通过详细的步骤和丰富的示例代码,覆盖了文件备份、多域名修改、异常处理等关键功能,并逐步完善工具的稳定性和扩展性。这个例子涵盖了许多常见的Python编程技能,包括文件操作、正则表达式、命令行工具设计、异常处理等,帮助大家更好地理解和应用这些技能。

通过实现Hosts修改工具,能够掌握文件操作的基本原理,了解如何设计命令行工具以及如何处理异常情况。同时,通过添加多域名修改支持和异常处理机制,使工具更加健壮和用户友好。最后,提出了进一步扩展功能的思路,让大家有机会在这个基础上继续探索,提高其Python编程的实际应用水平。

总体而言,这个Hosts修改工具是一个综合性的实际项目,通过逐步完善其功能,可以加深对Python编程的理解,并将学到的知识更灵活地应用到其他项目中。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1294112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JFlash烧写单片机bin/hex文件

1,安装压 JLink_Windows_V660c,官网可下载; 2,打开刚刚安装的 J-Flash V6.60c 选择创建新工程“Create a new project”,然后点击StartJ-Flash 点击之后跳出Select device框,选择TI 选择TI后&#xff0c…

水库大坝安全监测参数与设备

智慧水利中,水库大坝的安全监测必不可少。做好水库大坝的安全监测,是确保水库大坝结构安全和预防灾害的重要手段。对于预防灾害、保护人民生命财产安全、优化工程管理、改进工程设计、保护环境资源和提高公众信任等方面有着重要的意义。 水利水库大坝安全…

如何基于Akamai IoT边缘平台打造一个无服务器的位置分享应用

与地理位置有关的应用相信大家都很熟悉了,无论是IM软件里的位置共享或是电商、外卖应用中的配送地址匹配,我们几乎每天都在使用类似的功能与服务。不过你有没有想过,如何在自己开发的应用中嵌入类似的功能? 本文Akamai将为大家提…

韩墨耘——当代大风堂门人代表人物

韩墨耘 中央美术学院客座教授 全国书画艺术委员会副主席 中国书画家协会理事 荣宝斋签约画家 张大千大风堂国展班主任导师 国画大师何海霞亲传弟子 韩墨耘:62年生于洛阳;著名画家、美术教育家、书法家,现居北京。出身书香门第&#xf…

吐血整理几款常见的录屏软件,收藏起来!

录屏软件在我们日常工作和生活中扮演着越来越重要的角色,无论是帮助我们记录屏幕操作,还是制作教学视频或演示文稿,都离不开这些优秀的录屏软件。在市场上有许多不同的录屏软件可供选择,今天小编吐血整理了几款常见且受欢迎的录屏…

(汇川H5U-A8)Modbus Poll与AutoShop使用RS-485通讯

一、初步认识: AutoShop: Modbus Poll: 1、连接配置 ConnectionSerial PortRS-485转串口,所以是串口Serial SettingsCOM3当你插入串口后,会显示新的一个端口,就是这个端口通讯速率9600与PLC协议配置一致数据长度8与PLC协议配置一致奇偶校验位0与PLC协议配置一致停止位2…

2002-2021年全国各地级市环境规制18个相关指标数据

2002-2021年全国各地级市环境规制18个相关指标数据 1、时间:2002-2021年 2、来源:城市年鉴 3、指标:行政区划代码、地区、年份、工业二氧化硫排放量(吨)、工业烟粉尘排放量(吨)、工业废水排放量(万吨)、工业废水排放达标量(万吨)、工业二氧…

数据结构与算法编程题51-图的术语

文章目录 1、无向完全图2、有向完全图3、稀疏图和稠密图4、权值5、子图6、无向图的顶点的度7、有向图的顶点的入度和出度8、连通图与非连通图9、强连通图和非强连通图10、连通图的生成树(n个顶点、n-1个边)11、有向树12、邻接矩阵13、邻接表14、逆邻接表15、最小生成树 参考博客…

包装材料管理ERP系统有哪些?包装材料管理ERP软件怎么样

不同的包装材料存在多样化的产成品,而这些不同的商品又有灵活多样的营销策略,产生的数据种类繁多,各类业务数据的统计分析工作量较大。 而有些包装材料企业日常经营管理存在各个业务数据分散,不能实时共享,并且库存数…

回文日期

//每次枚举前四位,把前四位反转拼接到后面去,这样就是在回文数里判断一个数是不是合法日期 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main{static int n,m,res;static BufferedReader in new BufferedRead…

ubuntu or MacOS 源码安装 fmt fmtlib

1,前情 提醒这个源代码需要从release中下载 打包好的,而直接用git clone下载不了,可能github上的这个git clone的链接仅仅是给fmt lib的开发者使用的吧; 下载fmtlib的release源代码u下载fmtlib的release源代码 2,解压编…

Java最全面试题专题---1、Java基础知识(1)

笔者有七八年的面试者经验,负责公司技术同学的社招和校招,近些年面试过三四百个技术同学,考虑接近年底这个时段,整理并更新一些以往的面试经验,希望同学们跳槽能有个更好的工作,如有需要的同学可以关注下笔…

面试题解析】static a,一百个线程,每个线程+1,最后a是多少?

嗨,各位小米控和技术达人们!今天小米要和大家分享一个有趣的面试题,相信大家在技术面试中都曾遇到过,那就是“static a,有一百个线程,每个线程1,最后a是多少?”这个问题看似简单&…

【Vue】修改组件样式并动态添加样式

文章目录 目标修改样式动态添加/删除样式样式不生效 注意:类似效果el-step也可以实现,可以不用手动实现。这里只是练习。 目标 使用组件库中的组件,修改它的样式并动态添加/删除样式。 修改样式 组件中的一些类可能添加样式无法生效。如Ele…

【私藏】国内最全的电商API数据接口分享各种业务场景调用API代理的API接口教程

API代理的电商API接口在各种业务场景中具有广泛的应用,本文将介绍哪些业务场景可以使用API代理的API接口,并提供详细的调用教程和代码演示,同时,我们还将讨论在不同场景下使用API代理的API接口所带来的好处。 哪些业务场景可以使用…

学习设计模式的网站

Refactoring and Design Patternshttps://refactoring.guru/

Linux环境下用yum安装postgres15

1. 下载PostgreSQL 15 安装包 在官网选择对应版本的安装包 https://www.postgresql.org/download/ Linux | CentOS 7 | PostgreSQL 15 2. 安装PostgreSQL 15 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-la…

持续集成交付CICD:CentOS 7 安装 Nexus 3.63

目录 一、实验 1.CentOS 7 安装Nexus3.63 二、问题 1.安装Nexus报错 2.Nexus启动停止相关命令 一、实验 1.CentOS 7 安装Nexus3.63 (1)当前操作系统版本&JDK版本 cat /etc/redhat-releasejava -version(2)下载Nexus新…

Spring(Spring/Springboot 的创建) 基础

一. Spring 1.1 Spring是什么? Spring 指的是 Spring Frameword(Spring 框架),它是一个开源框架。 Spring 是包含了众多工具方法的IoC容器。 1.2 什么是容器? 容器时用来容纳某种物品的装置。 我们之前接触到的容器: • List/Map ->…

vue中的内置指令v-model的作用和常见使用方法以及自定义组件上的用法

一、v-model是什么 v-model是Vue框架的一种内置的API指令,本质是一种语法糖写法,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。在Vue中,v-model是用于在表单元素和组件之间创建双向数据绑定的指令。它…