在Windows操作系统中,主机文件(hosts file)是一个重要的系统文件,它允许用户将域名映射到IP地址。本文介绍的脚本是一个用于操作Windows主机文件的工具,它使用VBScript编写,能够添加、删除、查询主机条目和别名。
这个脚本是对一个早期版本的重写,早期版本是一个简短的脚本,用于操作Windows主机文件。新版本的脚本使用自定义类和字典对象来跟踪IP地址和主机别名。整个主机文件被读取到内存中的数据结构中,以便进行操作。特别关注保留注释信息,这些注释信息存储在主机条目的上方、下方和末尾。虽然关注了注释,但目前没有直接管理注释数据的能力。
VBScript利用一个自定义类std_host_file、字典和数组。std_host_file类是用于读取和写入主机文件的主要类。创建一个数组来存储IP、别名和行尾注释。整行注释存储在std_host_file::m_lines字典对象中,以及定义为Array(ip, CreateObject("Scripting.Dictionary"), comments)的数组。TypeName VBScript调用用于确定std_host_file::m_lines中的项目是"String"还是"Variant()"对象。此外,std_host_file::m_ip_map字典对象用于将IP地址映射到其相应的std_host_file::m_lines键,std_host_file::m_alias_map将别名映射到IP地址,用于交叉引用别名。由于现代主机文件可以有IPv4和IPv6地址,这是必要的。例如,127.0.0.1和::1都可以合法地别名为"localhost"。用户需要执行检查以确保主机别名正确映射到其相应的IP地址。也许未来的增强可以实现额外的安全级别。
类定义细节和私有成员函数已省略。
Class std_host_file
Public Function GetHostEntryAliases(ByVal ip, ByRef aliases)
Public Function GetHostEntryAliasAddresses(ByVal alias, ByRef ips)
Public Function DeleteHostEntry(ByVal ip)
Public Function DeleteHostEntryAlias(ByVal ip, ByVal alias)
Public Function AddHostEntry(ByVal ip, ByVal alias)
Public Function GetAllHostEntryAddresses(ByRef ips)
Public Function GetAllHostEntryAliases(ByRef aliases)
Public Function Save(ByVal hostfile)
Public Function Load(ByVal hostfile, ByVal bmergecomments)
Private m_lines Dictionary of host line items
Private m_ip_map Dictionary of ip addresses to m_lines key values
Private m_alias_map Dictionary of alias mapping to IP addresses
End Class
Option Explicit
Dim o_h
Set o_h = New std_host_file
Call o_h.Load("C:\Windows\System32\drivers\etc\hosts", False)
Dim arr, n
Call o_h.AddHostEntry("192.168.1.5", "A")
Call o_h.AddHostEntry("192.168.1.5", "B")
Call o_h.AddHostEntry("192.168.1.5", "C")
Call o_h.AddHostEntry("192.168.1.5", "D")
Call o_h.AddHostEntry("192.168.1.6", "E")
Call o_h.AddHostEntry("192.168.1.6", "F")
Call o_h.AddHostEntry("192.168.1.6", "G")
Call o_h.AddHostEntry("192.168.1.6", "H")
Call o_h.AddHostEntry("192.168.1.7", "I")
Call o_h.AddHostEntry("192.168.1.7", "J")
Call o_h.AddHostEntry("192.168.1.7", "K")
Call o_h.AddHostEntry("192.168.1.7", "L")
Call o_h.DeleteHostEntryAlias("192.168.1.5", "A")
Call o_h.DeleteHostEntryAlias("192.168.1.5", "C")
o_h.DumpData
Call o_h.GetHostEntryAliases("192.168.1.5", arr)
WScript.Echo "Aliases for 192.168.1.5"
For Each n In arr
WScript.Echo n
Next
Call o_h.GetHostEntryAliasAddresses("A", arr)
WScript.Echo "Addresses for test2"
For Each n In arr
WScript.Echo n
Next
WScript.Echo "All host aliases"
Call o_h.GetAllHostEntryAliases(arr)
For Each n In arr
WScript.Echo n
Next
WScript.Echo "All host ip addresses"
Call o_h.GetAllHostEntryAddresses(arr)
For Each n In arr
WScript.Echo n
Next
o_h.DumpData
Call o_h.DeleteHostEntry("192.168.1.5")
Call o_h.DeleteHostEntry("192.168.1.6")
Call o_h.DeleteHostEntry("192.168.1.7")
Call o_h.DeleteHostEntry("192.168.1.8")
Call o_h.DeleteHostEntry("216.10.194.14")
o_h.DumpData
Call o_h.Save("C:\temp\host.txt")