通过python切换hosts文件


做开发或测试时常需要切换hosts ,如果hosts比较多,那么频繁的打开hosts文件对地址加注释(#),再把去掉注释是个繁琐的事情。
 
当然,SwitchHosts 已经可以帮我们方便的解决了这个繁琐的事情。
 
 
 
  但笔者还是自己尝试用python写个小程序来实现切换。以需求为驱动来解决日常的问题是件非常有意思的事。
 
 
 
假如我们有一组hosts:
 
172.168.12.107    www.baidu.com
172.168.10.213    account.baidu.com
172.168.12.107    pan.baidu.com
172.168.12.107    passport.baidu.com
172.168.10.129    is.baidu.com
172.168.12.107    un.baidu.com
 
 
写代码之前想清楚几点。
 
1、hosts 文件一般放在我们的C:\WINDOWS\system32\drivers\etc\目录下,没有扩展名。我们可以通过记事本打开。python 的os模块可以用于打开本地文件。
 
2、我们要做的操作也很简单,加注释(加#号),去掉注释(去掉#号)。去掉注释时,当我打开浏览器访问www.baidu.com 时,其实访问的是本地的,172.168.12.107 主机。加上注释时,那么访问的就是真的百度服务器。
 
3、我们要做的操作是判断,每一行数据的第一个字符是否有#号,没有的话就加上。
 
 
 
打开python shell 练习加“#”号操作
 
复制代码
>>> abc = '127.168.10.107 www.baidu.com'
>>> a = abc[0]
>>> if a != '#':
    nabc = '#'+abc
    print nabc
 
    
#127.168.10.107 www.baidu.com
复制代码
  定义abc字符串,abc[0] 表示取字符串的第一个字符,判断是是否为#号,如果不是,就把#号加到abc字符串的前面。
 
添加注释的完整代码入下:
 
复制代码
#coding=utf-8
import os
 
def add_jing():
    input = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'r')
    lines = input.readlines()
    input.close()
 
    output = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'w')
    for line in lines:
        if not line:
            break
        jing = line[0]
        if jing != '#':
            print line
            nf = '#' + line
            output.write(nf)
        else:
            output.write(line)
 
  output.close()
if __name__ == "__main__":
    add_jing()
复制代码
  程序先以读(r)的方式打开HOST文件,readlines() 方法逐行的读取内容。然后,close()关闭文件。
 
  程序再以写(w)的方式打开HOST文件,对readlines() 获取的每一行数据判断是否有#号,没有的话加上。并通过write() 方法写入到HOST文件中。最后close()关闭文件。
 
 
 
 
 
打开python shell 练习“#”号操作:
 
复制代码
>>> abc = '#127.168.10.107 www.baidu.com'
>>> a = abc[0]
>>> if a == '#':
    nabc = abc.replace('#','')
    print nabc
 
    
127.168.10.107 www.baidu.com
复制代码
  同样取字符串的第一个字符判断,如果是#号,那么通过replace()方法 将#号替换成空(’’)
 
去掉注释的完整代码:
 
复制代码
def del_jing():
    input = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'r')
    lines = input.readlines()
    input.close()
 
    output = open(r'C:\WINDOWS\system32\drivers\etc\HOSTS', 'w')
    for line in lines:
        if not line:
            break
        jing = line[0]
        if jing == '#':
            print line
            nf = line.replace('#','')
            output.write(nf)
        else:
            output.write(line)
 
  output.close()
 
if __name__ == "__main__":
    del_jing()
复制代码
 
 
  通过运行add_jing() 和del_jing()两个函数的方式并不灵活。这里只是通过修改#的方式来切换hosts ,那么你也可以将hosts定义一个数组,直接写入到HOST文件。通过
 
写入不同的数组来达到切换不同hosts的目的。
 
复制代码
#coding=utf-8
import os
 
'''内网测试环境'''
insides = ['172.168.12.107 www.baidu.com',
          '172.168.10.129 pan.baidu.com',
          '172.168.12.107 un.baidu.com',
          '172.168.12.107 passport.baidu.com']
 
'''外网测试环境'''
outsides = ['172.16.12.223 www.baidu.com',
            '172.16.10.223 pan.baidu.com',
            '172.16.12.111 un.baidu.com',
            '172.16.12.223 passport.baidu.com']
 
 
def inside_test():
    output = open(r'C:\pyse\HOSTS.txt', 'w')
    for insid in insides:
        print insid
        output.write(insid)
        output.write("\n")
    output.close()
 
def outside_test():
    output = open(r'C:\pyse\HOSTS.txt', 'w')
    for outsid in outsides:
        print outsid
        output.write(outsid)
        output.write("\n")
    output.close()    
 
 
if __name__ == "__main__":
    #inside_test()
    outside_test()
复制代码
  上面的方式会更加简单,把定义的host数组写到HOST文件中,注意:每写一个数组元素需要加一个回车换行---write("\n")
 
 
 
  如果想继续增加切换host的便捷性,可以使用wxPython写一个host的配置界面出来,那么也就是我们的SwitchHosts 工具了。

评论关闭