我必须从我的 Fedora 19 机器上通过各种 Web 代理检查网站性能,我想通过在我的/etc/hosts
文件中将本地可解析名称“代理”设置为我们代理的 DNS 解析名称来实现这一点。因此,/etc/hosts
文件的内容应如下所示:
proxy.us.company.com proxy
#proxy.eu.company.com proxy
#proxy.sa.company.com proxy
然后,当我需要测试不同的代理时,我只需编辑文件/etc/hosts
并取消注释不同的代理 DNS 名称,我的所有登录名(以及使用我机器的其他人)都将针对新代理进行检查。并且上述大多数 DNS 名称都是循环条目,这也很好,并且是我测试所必需的。(说实话,我也需要在实际工作中使用它,因为 proxy.us 偶尔会陷入困境,而其他代理中的一个最终会比 proxy.us 更快。)
我该怎么做呢?我确实考虑过编写一个脚本来更改http_proxy
环境变量,但使用该方法,我需要在每个过程中添加一个额外的步骤来将所有登录的变量对齐在一起。我只想在一个地方更改它。/etc/hosts
似乎是进行这样的系统范围的名称解析更改最合乎逻辑的地方。
答案1
/etc/hosts 仅将名称映射到 IP 地址。您不能将一个名称指向另一个名称。
您仍然可以使用 /etc/hosts,但您必须编写脚本将名称解析为 IP,并使用该 IP 修改 /etc/hosts,或者提前完成工作,创建多个主机文件,并让您的脚本简单地将文件移动到检查的每个代理的适当位置。
答案2
这不可能。实现我想要的最佳解决方案是安装名称解析器 (bind、named) 并使用代理的 FQDN 更新其本地表。
答案3
这是一个可以完成您想要的操作的 Python 脚本:
#!/usr/bin/env python
from dns.resolver import Resolver
from re import sub
hostsfile='/etc/hosts'
proxies = [
'proxy.us.company.com',
'proxy.eu.company.com',
'proxy.sa.company.com'
]
name = 'proxy'
def main():
proxy = menu('Select proxy:', proxies)
ip = Resolver().query(proxy,'A')[0].to_text()
if len(ip):
with open(hostsfile, 'r') as h:
hosts = h.read()
with open(hostsfile, 'w+') as h:
hosts = sub('((\n|(?<!\n)\.)(1?\d?\d|2[0-4]\d|25[0-5])){4} +'+name+'(?= *\n)', '\n'+ip+' '+name, hosts)
h.write(hosts)
def getInt(question, min, max):
min,max = [int(max),int(min)] if min>max else [int(min),int(max)]
while True:
try:
answer = int(raw_input('{0}: '.format(question)))
if min <= answer <= max:
return answer
print('Must be a number from {0} to {1}'.format(min,max))
except ValueError:
print('Not a valid number')
def menu(title, items, index=False):
print(title)
for i, item in enumerate(items):
print('{0}. {1}'.format(i+1, item))
answer = getInt('', 1, len(items)) - 1
return answer if index else items[answer]
main()